السلام عليكم ورحمه الله وبركاته
تكمله لسلسله الدروس نبذة سريعة عن الـ Java ME
هنشرح باذن الله الدرس الرابع
محتواه يتحدث
انا عندى الكمبيوتر قواعد بيانات
طب انا عاوز اعمل زى قاعده بيانات فى الموبيل
اخزن فيها بعض البيانات
مثلا بيانات لعبه من اسم اللاعب و الدرجه التى وصل اليها
طبعا دا بيمثل قاعده بيانات
لكن فى الموبيل بم ان الامكانيات بتاعته قليله فطبعا هيكون صعب انى اعمل قاعده بيانات على الموبيل
لكن فيه طريقه تانيه انى اتصل على سيرفر عليه قاعده بيانات برا الموبيل خالص
بس الطريقه دى لابد من وجود اتصال بالنت
لكن دلوقتى احنا عاوزين نخزن بيانات لعبه هل هنحتاج الى سيرفر ونت والكلام دا
لالا طبعا
امال اعمل ايه
فى الموبيل فيه حاجه اسمها RecordStore
بتمكننا من اضافه بيانات وحفظها
عن طريق
مفتاح والقيمه الخاصه بيه
Key , value
طيب فيه حاجه تانيه
ان الـ RecordStore بستهلك كتير اوى من البطاريه
يعنى كتر التعامل معاها بيستهلك طاقه كبيره من البطاريه
طب علشان نتفادى هذه المشكله
لابد من ايجاد طريقه بديله للتعامل ايضا مع الـ RecordStore
وفى نفس الوقت لا استهلك امكانيات كتير
يعنى ممكن نوضح هذه الجزئيه
بالنسبه للكمبيوتر
عندنا فى الكمبيوتر علشان تعامل البروسيسور مع الرامات بيكون بطئ
تم تصنيع جزء يسمى Cache
ليكون الوسيط بين الرامات واليروسيسور
ويحتوى على البيانات التى يحتاجها البروسيسور فى الوقت الحالى فقط
عندنا حاجه زى كدا فى الموبيل ولكنها ليست هارد وير
هى استخدام الـ Hashtable
للتوفيق بين الذاكره الداخليه للموبيل وبين الـ RecordStore
طبعا باستخدام الـ key , Value
لحد دلوقتى مش اتكلمنا على الكود خالص
بنتكلم على الاليه التى تستخدم فقط
ازاى يعنى الـ Hashtable
بتعمل كدا
هاقولك بص يا سيدى
هنحمل البيانات بتاعتنا فى الـ Hashtable
لكى يتعامل معها البروسيسور دائما
ولا يلجأ الى الـ RecordeStore
وقبل ان نتتهى من البرنامج
نقوم بتخزين البيانات مره اخرى فى الـ RecordStore
يقبى كدا تعاملت مع الـ RecordStore
مرتين مره تحميل البيانات فى الـ Hashtable
ومره تخزين البيانات الجديده بعد التعديلات التى طرأت عليها
وبكدا اكون وفرت المصارد من بطاريه وجهد على البروسيسور
وهذه العمليه تسمى عمليه الـ caching
طب ما تيجوا نتكلم شويه عن الكود
وعن الـحاجات اللى اتكلمنا عنها
Hashtable و RecordStore
تعالوا نعمل كود يعمل لى
RecordStore
لكن باستخدام Hashtable
علشان اعرف ازاى استخدمها واوفر المصادر بتاعت الموبيل
هنعمل class تضم العمليات هذه
public class MakeRecordStore {
String recordName;
Hashtable recordHashtable;
/**
*
* @param recordName
* @throws RecordStoreException
*/
public MakeRecordStore(String recordName) throws RecordStoreException {
this.recordName = recordName;
recordHashtable = new Hashtable();
loadData();
}هنعمل كائن من نوع Hashtable
وهنعمل البناء الخاص بالكلاس ياخد منى اسم الـ recordName
وفى البناء ايضا نعمل داله اسمها
loadData();
لكى يتم استدعاء الـ
RecordStore
هذه اول مره استدعيه فيها
ونقوم بتحميل البيانات منه الى الـ recordHashtable
والتعامل معها بعد ذلك
هنعمل كائن من النوع
RecordStore recordStore = null;
للتخزين بداخله
انما هذا لاستخدامه كمؤشر يعدى على البيانات الموجوده فى الـ recordStore
RecordEnumeration recordEnumeration = null;
وبعد ذلك نقوم باستدعاء الداله openRecordStore
هذه الداله تعنى انك تريد انشاءه
والمتغيرات الخاصه بيها تاخذ اسم الـ RecordStore
المراد انشاءه
ومتغير اخر من النوع Boolean
يفيد انه يتم انشاءه اذا لم يوجد
لذلك نجعله بـ true
recordStore = RecordStore.openRecordStore(recordName, true);
وبعد ذلك نقوم باستدعاء الداله
enumerateRecords
من على الكائن recordStore
وتخذينها فى الـ recordEnumeration
recordEnumeration = recordStore.enumerateRecords(null, null, false);
لكن الـ enumerateRecords
تاخذ المتغيرات التاليه
RecordFilter ان وجد
RecordComparator ان وجد ايضا
والثالث هو Boolean
لكى يجعل recordEnumeration
فى حاله تحديث دائما ام لا
هذا يكون مكلف جدا لذلك نقوم بتعطيل هذه الخاصيه
لكن ان كان الـ recordStore
Shared يعنى مستخدم من قبل اكتر من برنامج
ففى هذه الحاله هيكون true
لان ممكن اى برنامج يحذف لى record
او يعدل عليه
انما ان كان خاص بالبرنامج بتاعى فاكيد محدش هيعدل عليه فهعملها false
وبعد كدا هندخل فى while loop
while (recordEnumeration.hasNextElement()) {
byte[] row = recordEnumeration.nextRecord();
String converter = new String(row);
int index = converter.indexOf('|');
String key = converter.substring(0, index);
String value = converter.substring(index + 1);
put(key, value);
}هنقول الشرط بتاعنا هو
while (recordEnumeration.hasNextElement())
دى بترجع true
فى حاله وجود عناصر موجوده فى الـ recordStore
وبعد كدا
recordEnumeration.nextRecord();
نستدعى الداله التى تأتى بالـصف التالى
ونخزنه فى
byte[] row = recordEnumeration.nextRecord();
وبعد كدا هنغير الـ row
دا الى String
علشان اعرف استخلص key , value
لان اللى بيفصل بين الـ key , value
علامه ( | )
فانا هابحث عن هذه العلامه بداخل الـ String
واعمل substring على هذه العلامه
اجيب الـ key , value وافصلهم عن بعض
String converter = new String(row);
int index = converter.indexOf('|');
String key = converter.substring(0, index);
String value = converter.substring(index + 1);وبعد كدا استدعى الداله اللتى تضع الـ key , value
فى الـ recordHashtable
put(key, value);
وانا عملتها فى داله علشان اعرف استخدمها من خارج الكلاس فى اوامر اخرى هنشوفها بعدين فالمثال
public void put(String key, String value) {
if (value == null) {
value = "";
}
recordHashtable.put(key, value);
}تفاصيلها واضحه خالص
وبكدا انا حملت البيانات الموجوده فى الـ recordStore
لتكون حاليا موجوده فى الـ recordHashtable
ويكون بعدها كل تعاملى مع الـ recordHashtable
لكن طبعا علشان الامكانيات بتاعت الموبيل صغيره
هنقفل الـ recordStore , recordEnumeration
if (recordEnumeration != null) {
recordEnumeration.destroy();
}
if (recordStore != null) {
recordStore.closeRecordStore();
}++++++++++++++++++++++++++++++
هذا هو استيراد البيانات الموجوده فى الـ recordStore
لكن ماذا عن حفظ البيانات مره اخرى فى الـ recordStore
وهذه تعتبر المره الثانيه لتعاملى مع الـ recordStore
هذا يكون فى داله اسمها save
هنعرف بداخلها نفس اللى عملناه فى الداله loadData
RecordStore recordStore = null;
RecordEnumeration recordEnumeration = null;
try {
recordStore = RecordStore.openRecordStore(recordName, true);
recordEnumeration = recordStore.enumerateRecords(null, null, false);وبعد كدا
بدل البحث الكثير عن البيانات ونمر عليهم واحد واحد ونعدل فيهم
لا طبعا اسهل حاجه اننا نحذف البيانات من الـ recordStore
while (recordEnumeration.hasNextElement()) {
int nextRecordID = recordEnumeration.nextRecordId();
recordStore.deleteRecord(nextRecordID);
}نمر على الصفوف كلها
ونجيب الـ id
بتاع الصف وبعدين نستدعى امر الحذف
ونحذف الصفوف كلها
وبعد كدا نخزن البيانات الموجوده فى الـ
recordHashtable
وبعدين نقوم بجلب المفاتيح من الـ recordHashtable
Enumeration keys = recordHashtable.keys();
وتخزينهم فى متغير من نوع Enumeration
وبعد كدا ندخل فى while loop
للمفاتيح كلها
while (keys.hasMoreElements()) {
String key = (String) keys.nextElement();
String value = get(key);
String concat = key + "|" + value;
byte[] rowByte = concat.getBytes();
recordStore.addRecord(rowByte, 0, rowByte.length);
}نجيب
String key = (String) keys.nextElement();
وهو دا الـ key
وبعد كدا نجيب القيمه الموجوده فى المفتاح دا
String value = get(key);
باستخدام الداله get(…);
public String get(String key) {
return (String) recordHashtable.get(key);
}وبكدا حصلنا على المفتاح والقيمه نقوم باضافه العلامه ( | ) بينهم
String concat = key + "|" + value;
وعلشان الـ recordStore
مش بتاخد غير byte array
هنحول الـ concat
الى byte array
byte[] rowByte = concat.getBytes();
وبعد كدا فاضل اضيف الصف الى الـ recordStore
recordStore.addRecord(rowByte, 0, rowByte.length);
المتغيرات بتاعت addRecord
1- القيمه التى يتم اضافتها
ولكن تكون عباره عن byte array
2- هى من اى بدايه اخد القيمه هاقوله طبعا من الـ index = 0
3- الى اى نهايه من البيانات طبعا الى نهايه طول البيانات كلها rowByte.length
وبعد ما نقوم بالاضافه والانتهاء من الـ while loop
نقوم ايضا باغلاق الـ
if (recordEnumeration != null) {
recordEnumeration.destroy();
}
if (recordStore != null) {
recordStore.closeRecordStore();
}ان شاء الله هنعمل برنامج يتعامل مع هذه الـ class
ونشوف ازاى هل البيانات هتتحفظ ولا لا
لمزيد من التفاصيل عن الـ classes الجديدة

