الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

الدرس الرابع (RecordStore) - نبذة سريعة عن ال Java ME

بدأه Mahmoud Kelany في 24 أغسطس 2010 · 16 رد · 1,840 مشاهدة · في JavaME
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

تكمله لسلسله الدروس نبذة سريعة عن الـ 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 الجديدة

RecordStore Class

RecordEnumeration Class

Enumeration Class

Hashtable Class

تم تعديل هذه المشاركة بواسطة Mahmoud Kelany في 24 أغسطس 2010 في 17:43

1

Software Developer
Mahmoudkelany.com


 

#2

الكود الخاص بطريقه عمل

RecordStore مع الـ Hashtable

import java.util.Enumeration;
import java.util.Hashtable;
import javax.microedition.rms.*;

/**
 *
 * @author Mahmoud Mahrous
 */
public class MakeRecordStore {

    String recordName;
    Hashtable recordHashtable;

    /**
     * 
     * @param recordName
     * @throws RecordStoreException
     */
    public MakeRecordStore(String recordName) throws RecordStoreException {
        this.recordName = recordName;
        recordHashtable = new Hashtable();
        loadData();
    }

    /**
     *
     * @throws RecordStoreException
     */
    private void loadData() throws RecordStoreException {

        RecordStore recordStore = null;
        RecordEnumeration recordEnumeration = null;
        try {
            recordStore = RecordStore.openRecordStore(recordName, true);
            recordEnumeration = recordStore.enumerateRecords(null, null, false);
            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);
            }
        } finally {
            if (recordEnumeration != null) {
                recordEnumeration.destroy();
            }
            if (recordStore != null) {
                recordStore.closeRecordStore();
            }
        }
    }

    /**
     *
     * @param key
     * @param value
     */
    public void put(String key, String value) {
        if (value == null) {
            value = "";
        }
        recordHashtable.put(key, value);
    }

    /**
     * 
     * @param key
     * @return
     */
    public String get(String key) {
        return (String) recordHashtable.get(key);
    }

    /**
     * 
     * @throws RecordStoreException
     */
    public void save() throws RecordStoreException {
        RecordStore recordStore = null;
        RecordEnumeration recordEnumeration = null;
        try {
            recordStore = RecordStore.openRecordStore(recordName, true);
            recordEnumeration = recordStore.enumerateRecords(null, null, false);
            while (recordEnumeration.hasNextElement()) {
                int nextRecordID = recordEnumeration.nextRecordId();
                recordStore.deleteRecord(nextRecordID);
            }
            Enumeration keys = recordHashtable.keys();
            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);
            }
        } finally {
            if (recordEnumeration != null) {
                recordEnumeration.destroy();
            }
            if (recordStore != null) {
                recordStore.closeRecordStore();
            }
        }
    }
}

انتظروا المثال ان شاء الله قريب

1

Software Developer
Mahmoudkelany.com


 

#3

السلام عليكم هذا هو الكود اللى نستخدم من خلاله الـ MakeRecordStore Class

اللى احنا شرحناها من قبل

فيه كود قديم هو تكوين الشاشه والكلام هذا لا داعى لشرحه مرار وتكرار

البرنامج اللى هنعمل بيه اختبار لهذه الـ class

هو انى هاعمل نظام login

username , password

شاشه بتحتوى على username , password

وانت تكتب فيها اسم الدخول والرقم السرى

post-217802-075567700 1282693429_thumb.p

وما عليك الا ان تضغط على زرار Exit

وبكدا تكون البيانات اتخزنت

تروح انت داخل تانى على البرنامج

تلاقى اسم الدخول والرقم السرى اللى انت كنت مسجلهم لسه زى ما هم

يعنى البرنامج احتفظ بالبيانات

طب ازاى احتفظ بيها فى الـ RecordStore

تعالوا نبص على الكود اللى بيعمل كدا

public class TestMidlet extends MIDlet implements CommandListener {

    //Form
    private Form mainForm;
    //Commands
    Command exitCmd;
    //TextFields
    TextField userNameTextField;
    TextField passwordTextField;
    //Other Objects
    MakeRecordStore myRecordStore;
    String userNameKey = "username";
    String passwordKey = "password";

    public TestMidlet() {
        try {
            myRecordStore = new MakeRecordStore("mydata");
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public void startApp() {
        Display.getDisplay(this).setCurrent(getMainForm());
    }

    public void pauseApp() {
    }

هنكون midlit عاديه زى كل مره

بها شاشه وزرار خروج و حقلين ادخال بيانات

لكن هنا فيه شويه اضافات وهى

MakeRecordStore myRecordStore;
    String userNameKey = "username";
    String passwordKey = "password";

انى انا هاعمل كائن جديد من الـ MakeRecordStore اللى اتشرحت قبل كدا

وبعدين عندى مفتاحين هاعمل لهم ارسال الى الـ hashtable

استخدام المفتاحين فى الحصول على قيمه كل مفتاح او تعديل القيمه حسب المفتاح

وبم انا هاخزن قيميتن فقط هيكون عندى مفتاحين ويفضل ان يكونوا String

public Form getMainForm() {
        if (mainForm == null) {
            //Form
            mainForm = new Form("Login");
            //TextFields
            userNameTextField = new TextField("User Name", myRecordStore.get(userNameKey), 32, TextField.ANY);
            passwordTextField = new TextField("Password", myRecordStore.get(passwordKey), 32, TextField.ANY);
            mainForm.append(userNameTextField);
            mainForm.append(passwordTextField);
            //Commands
            exitCmd = new Command("Exit", Command.EXIT, 0);
            mainForm.addCommand(exitCmd);
            mainForm.setCommandListener(this);
        }
        return mainForm;
    }

ودا كود تكوين الشاشه الرئيسيه للـ login

الكود عرفناه من قبل لكن فيه ملاحظه بس على الكود الخاص بحقلى الادخال

احنا قولنا فى الوصف اللى كان فى اول هذا الرد

ان عندما يقوم المستخدم بعمل Run للبرنامج فانه يجد الاسم وكلمه المرور الذى كتبها

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

طبعا فيه من ضمن المتغيرات التى ياخذها البناء الخاص بـ TextField ان المتغير الثانى هو القيمه الافتراضيه

اللتى توجد داخل حقل الادخال

فاحنا هنجيب القيمه من الـ myRecordStore ونحطها فى حقل الادخال

شوفت العمليه سهله ازاى

myRecordStore.get(userNameKey)

كدا انا بقوله انا عاوز القيمه اللى المفتاح بتاعها هو الـ userNameKey

بردوا نفس الطريقه فى كلمه المرور المفتاح بتاعها الـ passwordKey

myRecordStore.get(passwordKey)

كدا احنا عملنا تحميل للبيانات فى الشاشه

ناقص بس لم ادوس على امر الخروج ( Exit )

يحفظ لى البيانات

 public void commandAction(Command cmd, Displayable dis) {
        if (cmd == exitCmd) {
            destroyApp(true);
            this.notifyDestroyed();
        }
    }

هنعمل فالـ commandAction ان لو كان الحدث يساوى حدث زرار الخروج

هيستدعى الداله

destroyApp(true);

ويعملها بـ true

وهنكتب بداخلها كود حفظ البيانات

 public void destroyApp(boolean flageDestroy) {
        try {
            myRecordStore.put(userNameKey, userNameTextField.getString());
            myRecordStore.put(passwordKey, passwordTextField.getString());
            myRecordStore.save();
        } catch (RecordStoreException ex) {
            ex.printStackTrace();
        }
    }

بستدعى الداله put واللى بتاخد المتغيرات الـ key ,value

هأضع مفتاح اسم المستخدم وبعدين قيمه اسم المستخدم

وبعدين هأضع ايضا مفتاح كلمه المرور وبعدين قيمه كلمه المرور

وبعد ذلك استدعى الداله save

اللتى تقوم بحذف البيانات اللى كانت موجوده فى الـ RecordStore

وحفظ البيانات الجديده من جديد

ولم نعمل تشغيل للبرنامج مره اخرى هنلاقى ان الاسم والرقم السرى اللى كتبناهم قبل الخروج

موجودين هذا دليل على ان التخزين تم :)

post-217802-045807300 1282693337_thumb.p

بالتوفيق

اتمنى ان يكون درس جميل وسهل ومفهوم باذن الله

سلام عليكم

المرفقات
Untitled.pngUntitled2.png
1

Software Developer
Mahmoudkelany.com


 

#4

معذره نسيت اضع رابط تحميل للـبرنامج

للتحميل

Record Stores MobileApp.zip

Software Developer
Mahmoudkelany.com


 

#5

أولا شكرا لك يا محمود على الدرس ولكن عندي بعض النقاط:

1. أنا لا أحب استخدم كلمه Data Base مع JME وانما Record Management System :blush:

2.

اقتباس
فى الموبيل فيه حاجه اسمها RecordStore

بتمكننا من اضافه بيانات وحفظها

عن طريق

مفتاح والقيمه الخاصه بيه

Key , value

اقتباس

عندنا حاجه زى كدا فى الموبيل ولكنها ليست هارد وير

هى استخدام الـ Hashtable

للتوفيق بين الذاكره الداخليه للموبيل وبين الـ RecordStore

طبعا باستخدام الـ key , Value

الان يجب توضيح النقاط السابقه لأنها بصراحه مبهمه.. أولا لا يوجد علاقه تربط ال Record Store مع ال Hash table لذلك فانه لا يعتمد ال Record Store على وجو Key, value. مره أخرى فان ال Hash table استخدم هنا لتسريع الوصول للبيانات وعدم فتح وغلق ال Record Store دائما ولكن هذه الطريقه اختياريه ويمكن استعمال الRecord Store بصوره مباشره دون المرور بال Hash table خصوصا مع البيانات الكبيره. فلنفرض مثلا انك تقوم بتخزين صور فانه لا يعقل ان يتم وضع تسخه في ال RAM عن طريق ال Hash table ومن ثم تخزينها في ال RMS عند اغلاق البرنامج لانك ستحصل على OutOfMemory Exception بكل سهوله, لذلك الطريقه المذكوره في الدرس تصلح للتعمل مع البيانات البسيطه والكثيره الاستخدام اثناء فتره عمل البرنامج.

3. يفضل عند تخزين النصوص سحب ال Bytes باستخدام ال UTF-8 encoding هكذا:

byte[] rowByte = concat.getBytes("UTF-8");

وعند القرائه هكذا:

byte[] row = recordEnumeration.nextRecord();
String converter = new String(row, "UTF-8");

تحياتي

1
#6
مهدي حجازي كتب:

أولا شكرا لك يا محمود على الدرس ولكن عندي بعض النقاط:

1. أنا لا أحب استخدم كلمه Data Base مع JME وانما Record Management System :blush:

2.

الان يجب توضيح النقاط السابقه لأنها بصراحه مبهمه.. أولا لا يوجد علاقه تربط ال Record Store مع ال Hash table لذلك فانه لا يعتمد ال Record Store على وجو Key, value. مره أخرى فان ال Hash table استخدم هنا لتسريع الوصول للبيانات وعدم فتح وغلق ال Record Store دائما ولكن هذه الطريقه اختياريه ويمكن استعمال الRecord Store بصوره مباشره دون المرور بال Hash table خصوصا مع البيانات الكبيره. فلنفرض مثلا انك تقوم بتخزين صور فانه لا يعقل ان يتم وضع تسخه في ال RAM عن طريق ال Hash table ومن ثم تخزينها في ال RMS عند اغلاق البرنامج لانك ستحصل على OutOfMemory Exception بكل سهوله, لذلك الطريقه المذكوره في الدرس تصلح للتعمل مع البيانات البسيطه والكثيره الاستخدام اثناء فتره عمل البرنامج.

3. يفضل عند تخزين النصوص سحب ال Bytes باستخدام ال UTF-8 encoding هكذا:

byte[] rowByte = concat.getBytes("UTF-8");

وعند القرائه هكذا:

byte[] row = recordEnumeration.nextRecord();
String converter = new String(row, "UTF-8");

تحياتي

اولا اشكرك اخى مهدى على مروركم الطيب

وكلامك

+1

انا استخدمت الكلمه لتقريب مفهوم الـ RecordStore لكن فعلا هى تطلق عليها Record Management System

و فعلا فهى تستخدم لتخزين بيانات بسيطه خالص

لكن اذا اردنا تخزين ملفات كبيره الحجم مثل صور او ملفات صوتيه الى خلافه

فاننا نستخدم FileConnection ونقوم باخراج البيانات بـ DataOutputStream

ان شاء الله هاحاول اشرحها قريب

هتكون نفس هذه الـ class لكن مع بعض التغيرات البسيطه ان شاء الله

وموضوع العربى انا شوفته فى الموضوع الاخر وقد قمت فعلا بتعديله وكنت هارفع النسخه بعد الاضافه

وها هي للتحميل

Record Stores MobileApp.zip

وجزاكم الله خيرا اخى مهدى

تم تعديل هذه المشاركة بواسطة Mahmoud Kelany في 26 أغسطس 2010 في 17:50

Software Developer
Mahmoudkelany.com


 

#7
اقتباس
و فعلا فهى تستخدم لتخزين بيانات بسيطه خالص

لكن اذا اردنا تخزين ملفات كبيره الحجم مثل صور او ملفات صوتيه الى خلافه

فاننا نستخدم FileConnection ونقوم باخراج البيانات بـ DataOutputStream

ان شاء الله هاحاول اشرحها قريب

هتكون نفس هذه الـ class لكن مع بعض التغيرات البسيطه ان شاء الله

لم تفهمني يا محمود..أنا لم أقصد ان RMS لا تصلح للملفات الكبيره ولكن ال Hash table هو الذي لا يصلح فيمكنك تخزين صوره داخل ال RMS عن طريق سحب ال Bytes الخاصه بها واعطائها لل Record لكن دون تخزين نسخه في ال Hashtable ما أحاول قوله انه لا يوجد اي علاقه من قريب او بعيد بين ال Hash table و ال RMS.

#8
مهدي حجازي كتب:

لم تفهمني يا محمود..أنا لم أقصد ان RMS لا تصلح للملفات الكبيره ولكن ال Hash table هو الذي لا يصلح فيمكنك تخزين صوره داخل ال RMS عن طريق سحب ال Bytes الخاصه بها واعطائها لل Record لكن دون تخزين نسخه في ال Hashtable ما أحاول قوله انه لا يوجد اي علاقه من قريب او بعيد بين ال Hash table و ال RMS.

تقريبا كدا انا اتلخطبت

هاعيد أمورى تانى

يمكن علشان الواحد صايم النهارده :lol:

ماشى يا اخ مهدى

جزاكم الله خيرا على التوضيح

Software Developer
Mahmoudkelany.com


 

#9

اخ محمود

1- انت تخزن البيانات اولا في Hashtable

2- بعدها تعيد تخزينها في ال RMS

في هذه الحالة لديك نفس البيانات في مكانين !!! ما الداعي؟؟

الداعي في الحلة التي اخبرك عنها الاستاذ مهدي

فقط لتسريع الوصول للبيانات

ولكت هذه الطريقة غير سليمة ، لماذا؟

في حالات الملفات الكبيرة (كالصور)

سوف تقوم بالتخزين في ال Hashtabe فكيف سوف تضمن الا يعطي خطأ OutOfMemory ؟؟؟

على فكرة

الملفات الكبيرة ليست كما يتصورها البعض

يعني 1 ميجا او 2 ميجا

الصورة الكبيرة بالنسبة الي هي ما تزيد عن 100 كيلو بايت

#10

اخى محمد

انا قولت قبل كدا هذا الكلام

اقتباس
طيب فيه حاجه تانيه

ان الـ RecordStore بستهلك كتير اوى من البطاريه

يعنى كتر التعامل معاها بيستهلك طاقه كبيره من البطاريه

طب علشان نتفادى هذه المشكله

لابد من ايجاد طريقه بديله للتعامل ايضا مع الـ RecordStore

وفى نفس الوقت لا استهلك امكانيات كتير

يعنى ممكن نوضح هذه الجزئيه

بالنسبه للكمبيوتر

عندنا فى الكمبيوتر علشان تعامل البروسيسور مع الرامات بيكون بطئ

تم تصنيع جزء يسمى Cache

ليكون الوسيط بين الرامات واليروسيسور

ويحتوى على البيانات التى يحتاجها البروسيسور فى الوقت الحالى فقط

عندنا حاجه زى كدا فى الموبيل ولكنها ليست هارد وير

هى استخدام الـ Hashtable

للتوفيق بين الذاكره الداخليه للموبيل وبين الـ RecordStore

طبعا باستخدام الـ key , Value

لحد دلوقتى مش اتكلمنا على الكود خالص

بنتكلم على الاليه التى تستخدم فقط

ازاى يعنى الـ Hashtable

بتعمل كدا

هاقولك بص يا سيدى

هنحمل البيانات بتاعتنا فى الـ Hashtable

لكى يتعامل معها البروسيسور دائما

ولا يلجأ الى الـ RecordeStore

وقبل ان نتتهى من البرنامج

نقوم بتخزين البيانات مره اخرى فى الـ RecordStore

يقبى كدا تعاملت مع الـ RecordStore

مرتين مره تحميل البيانات فى الـ Hashtable

ومره تخزين البيانات الجديده بعد التعديلات التى طرأت عليها

وبكدا اكون وفرت المصارد من بطاريه وجهد على البروسيسور

وهذه العمليه تسمى عمليه الـ caching

هو اننا بنستخدم الـ hashtable فى اننا لا نحتاج الى الدخول الى الrecordstore اكتر من مره فى عمليه القراءه والكتابه للبيانات

كما نستخدم الـ cache فى الكمبيوتر ليكون وسيطا بين الـ Ram , processor

++++++++

و انا لا اقصد البيانات الكبيره

انا اقصد متغيرات او بيانات لعبه مثلا

وهذا ما ذكرته فى اول الموضوع خالص

ها هوو

اقتباس

اخزن فيها بعض البيانات

مثلا بيانات لعبه من اسم اللاعب و الدرجه التى وصل اليها

طبعا دا بيمثل قاعده بيانات

لكن فى الموبيل بم ان الامكانيات بتاعته قليله فطبعا هيكون صعب انى اعمل قاعده بيانات على الموبيل

ايوه ما هى فى حاله البيانات البسيطه فقط

بيانات ارقام مثلا وبيانات بسيطه بردوا

زى ما ذكرت قبل كدا

اسم مستخدم وكلمه المرور فى صفحه login مثلا

هذا هو استخدامها

لكن اذا اردنا استخدام بيانات اكثر للتخزين هاشرحها قريب ان شاء الله مع الـ FileConnection , DataInputStream , DataOutputStream

يارب يكون قصدى واضح :ohmy:

تم تعديل هذه المشاركة بواسطة Mahmoud Kelany في 26 أغسطس 2010 في 22:08

Software Developer
Mahmoudkelany.com


 

#11

كل مره تعيد نفس الكلام يا محمود..أنك اذا اردت تخزين بيانات كبيره سوف تستخدم ال FileConnection , هل لي ان اسالك لماذا لا تستخدم ال RMS وتعطينا مثال على ذلك بال RMS وليس بال FileConnection. يا محمود المشكله ليست مشكله بيانات صغيره أو كبيره رغم ان لها علاقه طبعا..المشكله أنك توحي في الدرس انه لا يمكن استعمال ال RMS الا مع Hashtable وهو غير صحيح..

#12
مهدي حجازي كتب:
يا محمود المشكله ليست مشكله بيانات صغيره أو كبيره رغم ان لها علاقه طبعا..المشكله أنك توحي في الدرس انه لا يمكن استعمال ال RMS الا مع Hashtable وهو غير صحيح..

انا لم اقل لا يمكن ؟؟

انا اقول يفضل لذلك لان التعامل مع الـRMS دائما يستهلك من البطاريه للموبيل

فلتجنب هذه المشكله وهى نفاذ شحن البطاريه

نقوم باستخدام الـ hastable لتقليل التعامل مع الـ RMS

فتكون مره لتحميل البيانات ومره اخرى لتخزينها

وبذلك حافظت على البطاريه من النفاذ المبكر

وكمان لسرعه التعامل مع هذه البيانات

انا مش قولت لا يمكن دى خالص :wacko: :wacko:

Software Developer
Mahmoudkelany.com


 

#13

سامحنا يا محمود..أنا أعرف أنك لم تقل لذلك أنا قلت أنك توحي. عموما أظن الان اتضحت الصوره, ساحاول تعديل الدرس لتخزن البيانات مباشره دون المرور بال Hashtable لتتضح الصوره أكثر ان شاء الله

#14

هذا تعديل على المثال دون استخدام ال Hashtable وتم تغير طريقه التخزين باستخدام ال | الى استخدام DataOutputStream للتسليه والمعرفه فقط :blush:

لاحظو أن مثال محمود سيكون اسرع من هذا المثال, الغرض من هذا المثال هو توضيح الفكره فقط.. يمكن استخدامه لتخزين بيانات كبيره بصوره غير متكرره مع بعض التعديل طبعا ليخزن اشياء غير النصوص.

package record;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.microedition.rms.*;

public class MakeRecordStore {

    String recordName;

    public MakeRecordStore(String recordName) throws RecordStoreException, UnsupportedEncodingException {
        this.recordName = recordName;

    }

    public void put(String key, String value) throws RecordStoreException, UnsupportedEncodingException, IOException {
        if (value == null) {
            value = "";
        }

        RecordStore recordStore = null;

        try {
            recordStore = RecordStore.openRecordStore(recordName, true);
            ByteArrayOutputStream bout = new ByteArrayOutputStream();
            DataOutputStream dout = new DataOutputStream(bout);
            dout.writeUTF(key);
            dout.writeUTF(value);
            dout.flush();
            byte[] raw = bout.toByteArray();
            recordStore.addRecord(raw, 0, raw.length);
            System.err.println("saved successfully");
        } finally {
            if (recordStore != null) {
                recordStore.closeRecordStore();
            }
        }


    }

    public String get(String key) throws RecordStoreException, UnsupportedEncodingException, IOException {
        RecordStore recordStore = null;
        RecordEnumeration recordEnumeration = null;
        try {
            recordStore = RecordStore.openRecordStore(recordName, true);
            recordEnumeration = recordStore.enumerateRecords(null, null, false);
            while (recordEnumeration.hasNextElement()) {
                byte[] row = recordEnumeration.nextRecord();
                ByteArrayInputStream bin = new ByteArrayInputStream(row);
                DataInputStream din = new DataInputStream(bin);
                String rskey = din.readUTF();
                String rsval = din.readUTF();
                if (rskey.equals(key)) {
                    return rsval;
                }

            }

            return "";

        } finally {
            if (recordEnumeration != null) {
                recordEnumeration.destroy();
            }
            if (recordStore != null) {
                recordStore.closeRecordStore();
            }
        }

    }
}

Record Stores MobileApp.zip

تم تعديل هذه المشاركة بواسطة مهدي حجازي في 27 أغسطس 2010 في 15:04

1
#15

حاولت اضافة دالة update على قيم ريكورد معين لكن لاجدوى لايحفظ القيمة الجديدة

ما السبب؟

 public  void updateRecord(String newValue)throws RecordStoreException 
	   {

	 //  String newappt = update;
	   RecordStore recordStore = null; 
        //RecordEnumeration recordEnumeration = null; 
        try { 
            recordStore = RecordStore.openRecordStore(recordName, false); 
            //recordEnumeration = recordStore.enumerateRecords(null, null, false); 
			byte [] data = newValue.getBytes();

             recordStore.setRecord(1, data, 0, data.length);

            } 
            finally { 

            if (recordStore != null) { 
                recordStore.closeRecordStore(); 
            } 

		}
    //  Byte data = newappt.getBytes();
      //Rs.setRecord(1, data, 0, data.length());
     }
#16

على ما اتذكر اصل الكلام دا من زمان اووى

انك مش ينفع تعدل ف record واحد عن طريق الكود دا

لان الكود دا ف كل مره بيمسح القديم وبيكتب واحد جديد

اتمنى ان حد يكون متذكر يفيدك اكتر :)

Software Developer
Mahmoudkelany.com


 

#17
Mahmoud Kelany كتب:

على ما اتذكر اصل الكلام دا من زمان اووى

انك مش ينفع تعدل ف record واحد عن طريق الكود دا

لان الكود دا ف كل مره بيمسح القديم وبيكتب واحد جديد

اتمنى ان حد يكون متذكر يفيدك اكتر :)

استخدمت dataoutputsstream للسهولة والكود يحفظ القيم وبعد فتح التطبيق مرة أخرى تصبح موجوده وكتبت دالة update وتتغير القيمة الآن

import java.io.ByteArrayInputStream; 
import java.io.ByteArrayOutputStream; 
import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import javax.microedition.rms.RecordStoreNotFoundException;
import java.io.UnsupportedEncodingException; 
import javax.microedition.rms.*; 

public class MakeRecordStore { 

    String recordName; 

    public MakeRecordStore(String recordName) throws RecordStoreException, UnsupportedEncodingException { 
        this.recordName = recordName; 

    } 

    public void put(String key, String value) throws RecordStoreException, UnsupportedEncodingException, IOException { 
        if (value == null) { 
            value = ""; 
        } 

        RecordStore recordStore = null; 

        try { 
            recordStore = RecordStore.openRecordStore(recordName, true); 
            ByteArrayOutputStream bout = new ByteArrayOutputStream(); 
            DataOutputStream dout = new DataOutputStream(bout); 
            dout.writeUTF(key); 
            dout.writeUTF(value); 
            dout.flush(); 
            byte[] raw = bout.toByteArray(); 
            recordStore.addRecord(raw, 0, raw.length); 
            System.err.println("saved successfully"); 
        } finally { 
            if (recordStore != null) { 
                recordStore.closeRecordStore(); 
            } 
        } 


    } 

    public String get(String key) throws RecordStoreException, UnsupportedEncodingException, IOException { 
        RecordStore recordStore = null; 
        RecordEnumeration recordEnumeration = null; 
        try { 
            recordStore = RecordStore.openRecordStore(recordName, false); 
            recordEnumeration = recordStore.enumerateRecords(null, null, false); 
            while (recordEnumeration.hasNextElement()) { 
                byte[] row = recordEnumeration.nextRecord(); 
                ByteArrayInputStream bin = new ByteArrayInputStream(row); 
                DataInputStream din = new DataInputStream(bin); 
                String rskey = din.readUTF(); 
                String rsval = din.readUTF(); 
                if (rskey.equals(key)) { 
                    return rsval; 
                } 

            } 

            return ""; 

        } finally { 
            if (recordEnumeration != null) { 
                recordEnumeration.destroy(); 
            } 
            if (recordStore != null) { 
                recordStore.closeRecordStore(); 
            } 
        } 
		}
		public String update(String key, String value) throws RecordStoreException, UnsupportedEncodingException, IOException { 
        RecordStore recordStore = null; 

        try { 
            recordStore = RecordStore.openRecordStore(recordName,false); 
			 ByteArrayOutputStream bout = new ByteArrayOutputStream(); 
            DataOutputStream dout = new DataOutputStream(bout); 
            dout.writeUTF(key); 
            dout.writeUTF(value); 
            dout.flush(); 
           byte[] raw = bout.toByteArray(); 


             recordStore.setRecord(1,raw, 0, raw.length);
			 System.err.println("update successfully"+get(key));


      } 
	   finally { 

            if (recordStore != null) { 
                recordStore.closeRecordStore(); 
            } 
  }  
   String x=get(key); 
    return x;   
//}
}		

}

تم تعديل هذه المشاركة بواسطة pure love في 23 ديسمبر 2010 في 10:19

مواضيع مشابهة