اضافه كردن قابليت ذخيره كردن دادهها به نرمافزارهاي MIDlet
MIDP مكانيسمي جهت ذخيرهسازي ماندگار دادهها براي نرمافزارهاي JAVA فراهم نمودهاست. اين ساختار ذخيرهسازي ماندگار را ميتوان به يك بانك داده مدل ركوردگرا تشبيه كرد. در اين پيوست ما به چگونگي استفاده از RMS براي مديريت و تحليل دادهها ميپردازيم و در نهايت يك بانك اطلاعاتي نمونه براي تشريح بيشتر مساله مثال خواهيم زد.
سيستم مديريت ركورد J2ME
سيستم مديريت ركورد J2ME يا همان RMS مكانيسمي را فراهم ميسازد كه MIDlet ها از طريق آن ميتوانند دادهها را به صورت بلندمدت بايگاني كرده و بعدها بازيابي كنند.J2ME RMS در يك رويكرد ركوردگرا شامل مجموعهاي از انبارههاي ركوردي ميباشد. نماي كلي ارتباط بين J2ME RMS و MIDlet در شكل 1 آمدهاست.
شكل 1. نماي كلي ارتباط بين J2ME RMS و MIDlet
هر انبار ركوردي را ميتوان به عنوان يك مجموعه از ركوردها درنظر گرفت كه مقادير آنها در طي عمليات مختلف MIDletها ثابت باقي ميمانند. MIDlet مسئول اين امر است كه حفظ دادهها و يكبارچگي اطلاعات انبارههاي ركوردي را در طي عمليات عادي دستگاه نظير خاموش و روشن كردن و يا شارژ دوباره دستگاه و غيره حفظ نمايد.
يك انبار ركوردي بر روي سازه اصلي دستگاه ايجاد ميشود، مانند حافظه غيرفرار دستگاه، كه مستقيماً در اختيار MIDlet قرار نميگيرد. كلاسهاي RMS توسط كدها داخلي دستگاه فراخواني كرده و از توابع استاندارد سيستم عامل دستگاه براي انجام عمليات اصلي يك بانك داده استفاده ميكنند.
عملكرد انبار ركورد به صورتي است كه هستهاي بودن، همزماني و سريال داربودن كليه انبارهها را تضمين كرده و از هر تحريفي در دادهها در دسترسيهاي مختلف جلوگيري ميكند. در هر انبار ركورد timestamp ساعت آخرين تغيير ضبط ميشود. همچنين انبار ركورد version را هم نگهداري كرده، كه عددي صحيح است كه با هر تغيير افزايش مييابد. Timestamp و version براي همزمانسازي دادهها مفيد خواهندبود.
وقتي كه يك MIDlet از مسيرهاي مختلفي براي دستيابي به يك انبار ركورد استفاده ميكند، ايجاد و مديريت اين دسترسيها برعهدة MIDlet خواهدبود. هرگونه اشتباه در اين ميان به تغييرات ناخواسته در محتواي دادهها ميانجامد. بهمين نحو اگر دستگاه وظيفه همزمان سازي يك انبار ركورد را انجام دهد، مسئوليت همزمانسازي دادهها برعهدة دستگاه خواهدبود و سيستم هماهنگسازي دستگاه است كه مسئوليت دارد كه اجازه دسترسي منحصربفرد به انبار ركورد را به MIDlet و موتور همزمانسازي دستگاه بدهد.
هر ركورد انبار ركورد شامل آرايهاي از بايتها و يك شماره مشخصه يكتاي صحيح(integer) ميباشد.
مديريت بانك داده دستگاه
كلاس javax.microedition.rms.RecordStore يك انبار ركورد RMS را ارائه مينمايد. كه دستورات بسياري براي مديريت يك انبار ركورد از قبيل امكان حذف و اضافه و روزآمدكردن ركوردها را در اختيار شما ميگذارد.
مديريت انبار ركورد
براي بازكردن يك انبار ركورد دستور openRecordStore() از javax.microedition.rms.RecordStore بايد فراخواني شود. public static RecordStore openRecordStore(string recordStoreName,Boolean createIfNecessary) يك انبار ركورد با نام دادهشده recordStoreName باز ميكند. اگر چنين انبار ركوردي نبود با فراخواني اين تابع ميتوانيد يك انبار ركورد دلخواه بسازيد.
اگر انبار ركورد موردنظر باز بود، اين دستور يك ارجاع به انبار ركورد مشابه برقرار ميسازد.
ليست 1- بازكردن يك انبار ركورد
کد:
RecordStore rs = RecordStore.openRecordStore("MyAppointments",true);
هرگاه تمامي كارها پايان يافت فراخواني closeRecordStore() انبار ركورد دادهشده را ميبندد. وقتي يك انبار ركورد بسته ميشود ديگر نميتوان بر روي آن عمليات ديگري انجام داد.
ليست 2 – بستن يك انبار ركورد
کد:
Rs.closeRecordStore();
انبار داده مشخص شده را ميتوان با فراخواني متد deleteRecordStore() حذف كرد.
ليست 3- حذف يك انبار ركورد
کد:
RecordStore.deleteRecordStore("MyAppointments");
اضافه كردن ركوردها
MIDlet با فراخواني متد addRecord() از كلاس javax.microedition.rms.RecordStore يك ركورد جديد به انبار ركورد ميافزايد.اين يك عمليات هستهاي محدود است كه يك recordId براي ركورد جديد بازگشت ميدهد. ركورد قبل از اينكه دستور چيزي را برگشت دهد در يك مكان حافظه ماندگار استقرار مييابد.
public int addRecord(byte data, int offset, int numBytes) يك ركورد كه شامل يك آرايه از بايتها بنام data با offset به عنوان يك ايندكس رشتهاي و طول آن numBuytes ميباشد.
ليست 4- اضافه كردن ركورد
کد:
String appt = "new record";
byte bytes = appt.getBytes();
rs.addRecord(bytes,0,bytes.length);
بروز كردن ركوردها
بروزكردن يك ركورد خاص شامل فراخواني آن ركورد و نوشتن اطلاعات جديد در آن است.
public int getRecord(int recorded,byte buffer,int offset) مقدار داده موجود در يك ركورد مشخص را كه با آرايه بايتي buffer نمايش داده ميشود را برميگرداند. public byte getRecord(int recordId) هم يك كپي از دادههاي موجود در ركورد recorded را بازگشت ميدهد. public void setRecord(int recorded,byte newData, int offset, int numBytes) اطلاعات جديد را كه در يك جريان بايتي newData ذخيره شده وآدرس بايت اول آن offset و طول آن numBuytes ميباشد را به ركورد موجود در آدرس recorded اختصاص ميدهد.
ليست 5-بروزكردن ركورد
کد:
String newappt = "update record";
Byte data = newappt.getBytes();
Rs.setRecord(1, data, 0, data.length());
حذف ركورد
MIDlet از متد deleteRecord() براي حذف يك ركورد از انباره ركورد استفاده ميكند.
public void deleteRecord(int RecordId) ركورد مشخص شده با شماره RecordId را حذف ميكند. RecordId حذف شده ديگر نميتواند مورد استفاده قراربگيرد.
ليست 6-حذف يك ركورد
تفسير دادهها
J2ME API رابطهاي خاصي جهت تفسير و تعبير ركوردهاي موجود در يك انباره ركورد دارد. اين فرآيند شامل مقايسة ركوردها جهت تعيين محل نسبي آنها به يكديگر ميباشد. همچنين ميتوان محتواي ركوردها برحسب شرايط معيني مورد جستجو و فيلتر قرارداد.
مقايسه ركوردها
MIDlet از رابط RecordComparator و دستور compare(byte rec1,byte rec2) براي مقايسة دو ركورد منتخب استفاده ميكند. مقدار برگشتي اين دستور نسبت اين دو ركورد را به يكديگر نشان ميدهد.
ليست 7-مقايسه ركوردها و تعيين نسبت آنها به يكديگر
کد:
Int compare (byte b1, byte b2)
{
String s1 = new String(b1);
String s2 = new String(b2);
If (s1.compareTo(s2) > 0)
Return RecordComparator.FOLLOWS;
Else if (s1.compareTo(s2) == 0)
Return RecordComparator.EQUIVALENT;
Else
Return RecordComparator.PRECEDES;
}
شمارش ركوردها
رابط RecordEnumeration مسئول شمارش ركوردها در يك انبارة ركورد ميباشد.اين رابط به طور منطقي توالي و ترتيب recordIdهاي ركوردهاي يك انبارة ركورد را نگهداري ميكند. شمارشگر همة ركوردها (يا مجموعة كوچكي از آنها را كه مورد فيلتر واقع شدهاند) را با توجه به يك مقايسهگر، بازشماري ميكند. در صورت عدم تعريف هيچ فيلتر و مقايسهگري شمارش كل ركوردها بدون درنظر گرفتن هيچ شرايط خاصي انجام ميشود.
ليست 8-شمارش ركوردها
کد:
RecordEnumeration re = rs.enumerateRecords(null, null, false);
If (re.hasNextElement())
Byte nextRec = re.nextRecord();
فيلتركردن ركوردها
MIDlet از رابط RecordFilter براي فيلتر كردن اينكه يك ركورد شرايط از پيش تعيين شدهاي را دارا ميباشد يا خير استفاده ميكند. نرمافزار از متد match() رابط RecordFilter براي انتخاب ركوردهايي كه رابط RecordEnumeration بازشماري كردهاست، استفاده ميكند.
ليست 9-فيلتركردن ركوردها
کد:
Public boolean matches(byte candidate)
{
String s1 = new String(candidate);
If (s1.equals("XX"))
Returns true;
Else
Returns false;
}
کش رفته شده از کتاب خودم :wink: ولی کار برادر آیت