• 0
مجدي محمود

Persistent Storage حفظ البيانات الدائم

سؤال

The RMS : The Record Management System

سنتعرف في هذا الدرس على كيفية حفظ البيانات مثل دليل الهاتف ,, مذكرة وغيرها الكثير من التطبيقات وهو بالفعل درس صعب

اتمنى من الله العزيز الحكيم ان اقوم بتبسيطه لكم وببسم الله نبدا

اولا: الكلاس RecordStore

تستخدم هذه الكلاس والاساليب الموجودة فيها لكتابة او قراءة بيانات وكذلك لتخزينها

الاسم Record-Store يجب ان يكون عبارة عن String ويجب ان يتم هناك التمييز بين الكتابة الصغيرة والكبيرة فمثلا"ArabTeam " ليست مثل" arabteam" وهناك اسلوب يفتح Record-Store وينتجه اذا لم يكن موجود

RecordStore myRecord = RecordStore.openRecordStore("myRecord",true);

وهذه مجموعة من الاساليب

RecordStore openRecordStore(String recordstoreName, boolean creatIfNecessary)
RecordStore closeRecordStore()
void deleteRecordStore(String recordStoreName)//تمحي Record-Store

عندما يقوم الشخص بفتح Record-Store معين مثل

RecordStore myRecord = RecordStore.openRecordStore("myRecord",true);

يستطيع الشخص اضافة بيانات عن طريق

int addRecord(byte[] data, int offset, int numBytes)

مثل

bytes [] myByte ="Hello".getBytes();
myRecord.addRecord(myByte,0,myByte.length);

حتى يتم قراءة Records يتم استخدام الاسلوب

byte[] getRecord(int recordId)

وهذه مجموعة من الاساليب

int getNumRecords()  

لمعرفة عدد Records في Record Store

int getName()  

لمعرفة اسم Record Store

int getSize()  

لمعرفة حجم Record Store بالبايت ولمزيد من الاساليب على الرابط

RecordStore

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

11 إجابة على هذا السؤال .

  • 0

بسم الله الرحمن الرحيم

ساقوم بشرح مثال افضل لي ولكم لانه موضوع جامد حتى لاينام من يقرا هذا الموضوع من كثرة الحديث عن RecordStore و Record :) ومن خلاله اشرح اساليب اضافية

سنقوم بعمل مثال بسيط باستخدام الكلاس RecordStore والاساليب الموجودة فيها وهو عبارة عن دفتر للمذكرات اليومية بحيث يستطيع المستخدم تخزين ما يريد في TextBox والاطلاع عليه متى يريد لعمل ذلك التطبيق نحتاج الى TextBox وكذلك الا زرار التي نستطيع الى الان بكل سهولة انشائها ويبقى علينا هو تخزين ما تم كتابته باستخدامRecordStore والاساليب الموجودة فيها

نقوم بانشاء RecordStore ونسميها diary ونحتاج ايضا الى ID (رقم المدخل او الصفحة)تاع المدخل الحالي ونقوم بعمل ذلك عن طريق

RecordStore diary;
int currentId=1;

try {
diary = RecordStore.openRecordStore("diary", true);
String text =loadEntry(diary.getNumRecords ());
textBox.setString(text);
textBox.setTitle("Diary - Day " + currentId);
}
catch (RecordStoreException e) {
throw new RuntimeException("Cannot open diary; reason: "+e);
}

سيقوم هنا بفتح RecordStore واسمها diary وفي حالة عدم القدرة على ذلك يعطينا السبب وهناك مجموعة من الاستناءات ومنها

InvalidRecordIDException(String message) 
InvalidRecordIDException()
RecordStoreException(String message)
RecordStoreException()
RecordStoreFullException()
RecordStoreFullException(String message)
RecordStoreNotFoundException()
RecordStoreNotFoundException(String message)
RecordStoreNotOpenException()
RecordStoreNotOpenException(String message)

وما تقوم به هو ترجمة ال Exception الى العربية مثل

RecordStoreNotFoundException()

عندما لايجدRecordStore المعطاة عند استخدام الاساليب

 
openRecordStore()
و
deleteRecordStore()

ونقوم بعمل اسلوب اخر وهو loadEntry()-Method الذي يقوم بشحن المدخل من RecordStore واعطاء المدخل رقم وفي حال تواجد الرقم يعطى رقم جديدللصفحة اقصد بالمدخل وال currentId هو ال TextBox ورقمه اي الصفحة ورقمها عند تنفيذ البرنامج يظهر عندTitle تاع TextBox فوق diary +رقم المدخل ويكون الناتج عبارة عن String الذي سيتم تخزينه وهذا يقوم فقط بشحن المدخلات وليس تخزينها

public String loadEntry (int newId) throws
RecordStoreException {
if (newId < 1 || newId > diary.getNumRecords ()) {
byte [] data = " ".getBytes ();
currentId = diary.addRecord(data, 0, data.length);
}
else
currentId = newId;
return new String (diary.getRecord(currentId)).trim ();
}

trim() لترتيب ال Record

ولتخزين ما تم شحنه نحتاج الى saveEntry()-Method التي تؤخذ من رقم الصفحة مثل ما تم كتابته بالصفحة الاولى يتم تخزينه وهكذا حيث يتم تخزين ما كتب في TextBox ك String

public void saveEntry (String entry) throws
RecordStoreException {
byte [] data = (entry + " ").getBytes ();
diary.setRecord (currentId, data, 0, data.length);
}

وحتى لايتم خسارة ماتم حفظه نحتاج الى عمل الاتي في الاسلوب destroyApp()-Method

public void destroyApp (boolean unconditional) {
try {
String text;
text = textBox.getString ();
saveEntry (text);
diary.closeRecordStore ();
}
catch (RecordStoreException e) {
throw new RuntimeException
("Cannot close Diary; reason: "+e);
}
}

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

هذا هو التطبيق كامل واعتقد باني لم اشرح جيدا وافضل طريقة للفهم هي السؤال

J2ME_RMS.zip

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

مشكور جداً يا أخ مجدي محمود ،، بارك الله فيك

على ما يبدو أنه واضح جداً ومفيد بالنسبة لي ،، وإذا احتجت أي سؤال فأنا عارف بأنك كما عودتنا ماتقصر ولو كلف ذلك عليك أثمن أوقاتك

وسوف تجد الثواب إن شاء الله عند من هو أكرم منك سبحانه وتعالى .

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بسم الله الرحمن الرحيم

السلام عليكم ورحمة الله وبركاته

يا أخ مجدي محمود

الحمد لله استطعت أن أعمل عدد من التجارب لحفظ البيانات نشكرك جدأ على هذا الشرح الواضح ولكن كما قلت الموضوع متشعب وتصعب التغطية ولكن كل يسأل عن حاجته ،المهم :

أريد توضيح للمقطعين في هذا الكود ولماذا يختلف تنسيق بيتات الحفظ Saveعن بيتات Load

byte [] data = (entry + " ").getBytes ();

byte [] data = " ".getBytes ();

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

بسم الله الرحمن الرحيم

يا اخي sih

byte [] data = (entry + " ").getBytes ();
diary.setRecord(currentId,data,0,data.length);

هنا يتم معرفة عدد البايتات للفراغ وكلمات يعني عندما تكتب كلمة+" "+كلمة في المدخل 1 مثلا ومن ثم تخزينه مثل

String +" "+Sring +...  وهكذا

if(newId<1 || newId>diary.getNumRecord())
byte [] data = " ".getBytes ();

لاحظ ما قبل ذلك يعني انه اذا كان newId اصغر من واحد او newId اكبر من عدد التسجيلات فيعني ذلك انك لم تكتب شيئا والا فانه يتم عمل refresh لل currentId مثلا اذا كانت currentId=1 فبعد هذا الاسلوب ستكون 2 وهكذا

تم تعديل بواسطه مجدي محمود
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكراً لك لهذا الشرح الجميل و لكن عندي سؤال و هو

اين توجد قاعدة البيانات التي تخزن ؟

و كيف يمكنني عمل برنامج يحوي على بيانات في قاعدة البيانات مسبقاً ؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

سؤال مهم جدا"

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

يا جماعة في مشكلة بالعربي يطلعه استفهامات مع ال Record Store ايش الحل ؟؟

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

السلام عليكــم ورحمـة الله وبركاتــه ،،

ايش يعني عدد الريكوردات أكبر من الأي دي newId > diary.getNumRecords ()

 

وليش هان ضفنا ريكودر فاضي  

 diary.addRecord(data, 0, data.length);

تم تعديل بواسطه akram801
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

شكرأ لك اخي على الدرس الرائع لكن هل يمكن ان اظهر صور باستخدام الحفظ الدائم يعني انا اريد ان اكتب كلمة داخل التيكست فيلد تظهر صورة معينه وكلمه اخرى تظهر صورة اخرى هل يمكن ذلك من خلال الحفظ الائم يني انا لوبشتغل على داتابيز عادية بكون عندي رفم للصوره والكلمة والصورة نفسها بقارن الكلمة الي بالتيكست فيلد بالجدول وبظهر الصورة بس انا مو عارفة اظهرها باستخام j2me

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
زوار
This topic is now closed to further replies.

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .