اس كيو لايت في برمجة تطبيقات الاندرويد 3 SQLite Android

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

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

سوف نكتب ما كتبناه سابقاً في أسطر كثيرة, في عدة أسطر معدودة بالإستعانة بكلاس جديد لوضع الدوال فيه واستخدامها.

من فضلك راجع الدروس السابقة :

في البداية هذه نتيجة الدرس في صورة :

dealing_sqlite_android_programming_lesson_3_1

وكل هذا فقط تم كتابته بأسطر معدودة .. فطبيعي جداً إن كنت قد استخدمت برمجة تطبيقات الأندرويد كثيراً, تعرف مبدأ الدوال و البارامترات لاستخدام قيم من دوال في كلاسات أخرى أو نفس الكلاس لا مشكلة.

ولكن الهدف من وضعها في كلاس آخر للترتيب.

ما قمت بفعله كالتالي :

في البدأية اللياوت الرئيسية للمشروع وضعت داخلها فقط نص واحد, وهو النص باللون الأحمر. وجعلته يقرأ المعلومات بالترتيب من قاعدة البيانات.

أما بالنسبة للجافا, فقمت بإنشاء كلاس آخر لوضع داخله الدوال الخاصة بقاعدة البيانات بالإضافة إلى داخله كلاس SQLiteOpenHelper وهو الكلاس المساعد او المدير لقاعدة البيانات, ويتم إنشائها و التأكد منها إن كانت موجودة وهو مهم دائماً, ولا تقلق الأمر بسيط جداً فسوف تتعرف عليه أكثر من استخدامه, وإلزامي فيه الدالتين onCreate , onUpgrade .

أما في الاكتفتي الرئيسية فقط قمنا بإلتحكم بكلاس إنشاء القاعدة لفتحها والكتابة داخلها من ثم عرض ما بداخلها, بأسطر معدودة جداً.

الملفات لدينا :

  • MainActivity
  • SQLiteActivity
  • mainlayout.xml

لنشاهد ملف اللياوت : mainlayout.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical">

    <ScrollView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#fff5ffcf">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_margin="10dp"
                android:gravity="center"
                android:text="Test SQLite from AndRody.com"
                android:textColor="#ff04346a"
                android:textSize="20sp" />
            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_margin="10dp"
                android:textColor="#f00"
                android:textSize="20sp"
                android:paddingLeft="20dp"
                android:paddingTop="5dp"
                android:paddingBottom="5dp"
                android:id="@+id/test" />


        </LinearLayout>
    </ScrollView>
</LinearLayout>

فقط ما قمنا بإستخدامه من هذه اللياوت هو عنصر النص التكست فيو والذي يحمل المعرف test .

و أما , كلاس SQLiteActivity :

public class SQLiteActivity {
    private static String DBNAME = "Sqlite_simple.db";
    private static String TABLE = "MY_TABLE";
    private static String COLUMN_1 = "NAME";
    private static String COLUMN_2 = "AGE";
    private static String COLUMN_3 = "COUNTRY";

    private SQLiteDatabase database;
    private SQLiteOpenHelper helper_database;

    private Context context;

    public SQLiteActivity(Context c){
        context = c;
    }

    public SQLiteActivity Read() throws android.database.SQLException {
        helper_database = new SQLiteHelper(context, DBNAME, null, 1);
        database = helper_database.getReadableDatabase();
        return this;
    }

    public SQLiteActivity Write() throws android.database.SQLException {
        helper_database = new SQLiteHelper(context, DBNAME, null, 1);
        database = helper_database.getWritableDatabase();
        return this;
    }

    public void close(){
        helper_database.close();
    }

    public long insert(String name, String age, String country){

        ContentValues contentValues = new ContentValues();
        contentValues.put(COLUMN_1, name);
        contentValues.put(COLUMN_2, age);
        contentValues.put(COLUMN_3, country);
        return database.insert(TABLE, null, contentValues);
    }

    public int deleteAll(){
        return database.delete(TABLE, null, null);
    }

    public String getAll(){
        String[] columns = new String[]{COLUMN_1,COLUMN_2,COLUMN_3};
        Cursor cursor = database.query(TABLE, columns,
                null, null, null, null, null);

        String result = "";

        int Name = cursor.getColumnIndex(COLUMN_1);
        int Age = cursor.getColumnIndex(COLUMN_2);
        int Country = cursor.getColumnIndex(COLUMN_3);
        for(cursor.moveToFirst(); !(cursor.isAfterLast());
            cursor.moveToNext()){
            result = result +
                    "NAME : " + cursor.getString(Name) + "\n" +
                    "AGE : " + cursor.getString(Age) + "\n" +
                    "COUNTRY : " + cursor.getString(Country) + "\n" +
                    "==============================="+ "\n";
        }

        return result;
    }

    public class SQLiteHelper extends SQLiteOpenHelper {

        public SQLiteHelper(Context context, String name,
                            SQLiteDatabase.CursorFactory factory, int version) {
            super(context, name, factory, version);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            // TODO Auto-generated method stub
            db.execSQL("CREATE TABLE IF  NOT EXISTS " + TABLE + " (ID INTEGER PRIMARY KEY, NAME TEXT, AGE TEXT, COUNTRY TEXT);");
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            // TODO Auto-generated method stub

        }

    }

}

بهذا الكلاس قمنا بإنشاء القاعدة و كتابة الدوال المطلوبة حالياً للتعامل مع هذه القاعدة, وتستطيع تعديل هذه الدوال أو حذفها او الإضافة إليها إلخ.

وهنا سوف أذكر شرح مختصر للمتبدئين, فهي واضحة نوعاً ما لأنها كلها تتكرر معنا بنفس المبدأ.

عرفنا متغيرات, بالنسبة لـ private بمعنى خاص وتستطيع استخدامه فقط في هذا الكلاس.

متغيرات من نوع سترنج :

DBNAME / اسم قاعدة البيانات

TABLE / اسم الجدول بداخل هذه القاعدة

COLUMN / هي اسماء الأعمدة في هذا الجدول.

وكذلك عرفنا متغير لكلاس قاعدة البيانات الموجود اساسي في النظام لنستطيع التعامل مع قاعدة البيانات, وكذلك نفس الحالة من نوع SQLiteOpenHelper .

و أما Context للإشارة لهذا المحتوى.

private static String DBNAME = “Sqlite_simple.db”;
private static String TABLE = “MY_TABLE”;
private static String COLUMN_1 = “NAME”;
private static String COLUMN_2 = “AGE”;
private static String COLUMN_3 = “COUNTRY”;

private SQLiteDatabase database;
private SQLiteOpenHelper helper_database;

private Context context;

وهذا رسم تقريبي للقاعدة من خلال المتغيرات :

dealing_sqlite_android_programming_lesson_3_2

بالنسبة للدوال الباقية, فهي لتحديد سياق القاعدة مع الاكتفتي التي يتم استخدام القاعدة فيها, ودالة لقراءة ما داخل القاعدة, وأخرى للكتابة فيها إلخ.

ما يهمنا :

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

إذا عند استدعاء هذه الدالة نضيف لها ثلاث قيم سترنج, الاسم والعمر والدولة, كما سوف نشاهد عند استخدامها في الاكتفتي الرئيسية للمشروع.

أما ContentValues بمعنى جلب أو وضع مجموعة من القيم, و أسفل منها جعلنا الدالة ترجع بأمر – أخذ القيم ووضعها داخل القاعدة وداخل الجدول المحدد ).

public long insert(String name, String age, String country){

        ContentValues contentValues = new ContentValues();
        contentValues.put(COLUMN_1, name);
        contentValues.put(COLUMN_2, age);
        contentValues.put(COLUMN_3, country);
        return database.insert(TABLE, null, contentValues);
    }

أما دالة حذف الجميع, فهي تأخذ الأمر حذف, وهنا بالدالة القيم مجهولة لذلك سوف يقوم بحذف جميع الأعمدة من الجدول, وهكذا يتم حذف جميع القيم, ومستقبلاً سوف تتعلم كيف تحذف دالة معينة بالأعتماد على أي قيمة موجودة بالجدول.

لاحظ جميع الدول هنا هي أسماء تستطيع متغير عوضاً عنها, فقط ما يهمنا الأوامر داخلها.

و أما دالة جلب الجميع getAll, فالأمر داخلها :

قمنا بتعريف مصفوفة سترنج تحتوي على جميع أسماء الأعمدة
و مؤشر القراءة كما أخذنا لمحة عنه سابقاً, ليقوم بقراءة القاعدة والكتابة عليها, ما يهمنا فقط من الاستعلام داخله أو خانتين, الأولى لاسم الجدول, والآخر لمصفوفة النصوص سترنج بأسماء الأعمدة
ثم قمنا بتعريف نص سترنج فارغ
وجعلنا هذا النص هو الذي يتم إرجاعه للمستخدم في حال تم استخدام الدالة
ثم قمنا بتعريف متغيرات من نوع int لأنها خانات رقمية, وطلبنا من الاول جلب العنصر الأول من العمود الأول والعنصر الأول من العمود الثاني والثالث وهكذا.
ثم يتم إخراج النتيجة وجمعها جميعها وجعلها داخل السترنج النتيجة, ويقوم بتكرار هذه العملية بالفور . إي سوف يقرأ العنصر الاول ويتم إخراجه ثم ينتقل للثاني وهكذا.

public String getAll(){
        String[] columns = new String[]{COLUMN_1,COLUMN_2,COLUMN_3};
        Cursor cursor = database.query(TABLE, columns,
                null, null, null, null, null);

        String result = "";

        int Name = cursor.getColumnIndex(COLUMN_1);
        int Age = cursor.getColumnIndex(COLUMN_2);
        int Country = cursor.getColumnIndex(COLUMN_3);
        for(cursor.moveToFirst(); !(cursor.isAfterLast());
            cursor.moveToNext()){
            result = result +
                    "NAME : " + cursor.getString(Name) + "\n" +
                    "AGE : " + cursor.getString(Age) + "\n" +
                    "COUNTRY : " + cursor.getString(Country) + "\n" +
                    "==============================="+ "\n";
        }

        return result;
    }

و أما كلاس SQLiteHelper كما ذكرنا سابقاً, للتحكم والادارة بإنشاء القاعدة وبناء الجداول داخلها إلخ.

و نذهب الآن إلى الاكتفتي الرئيسية للمستخدم MainActivity :

public class MainActivity extends Activity {
    TextView Test;
    SQLiteActivity db;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mainlayout);
        Test = (TextView) findViewById(R.id.test);


        db = new SQLiteActivity(this);
        db.Write();
        db.deleteAll();
        db.insert("Abboudi_Aliwi", "19", "Syria");
        db.insert("Mohammed","22","Saudi Arabia");
        db.insert("Ali","25","Egypt");
        db.insert("Firas","14","Jordan");
        db.insert("Youssef","30","Palestine");
        db.insert("Ahmed","20","Lebanon");
        db.close();


        SHOW();

    }

    public void SHOW() {

            db.Read();
            String contentRead = db.getAll();
            db.close();

        Test.setText(contentRead);
    }
}

سهل وجداً جداً واضح ..

عرفنا نص تكست فيو الموجود بداخل اللياوت بمتغير Test, و كذلك عرفنا وجود الكلاس الخاص بإنشاء القاعدة والأوامر الخاص بها إي الكلاس الآخر الموجود لدينا بهذا المشروع بمتغير db.

TextView Test;
SQLiteActivity db;

قمنا بربط النص .. باللياوت.

db = new SQLiteActivity(this);

لاحظ هذا السطر جداً مهم , عرفنا الكلاس الآخر ووضعنا this مكان السياق الذي استخدمناه في الكلاس الاخر بمعنى, إن هنا استخدام جديد يتعتمد على الكلاس الآخر بهذه الاكتفتي.

db.Write();

db كما عرفناها هي اختصاراً للكلاس الاخر الموجود لدينا في المشروع, هنا قلنا له من الكلاس الاخر استخدم لنا دالة رايت Write .

db.deleteAll();

ثم حذف جميع الأعمدة بهذه القاعدة.

db.insert(“Abboudi_Aliwi”, “19”, “Syria”);
db.insert(“Mohammed”,”22″,”Saudi Arabia”);
db.insert(“Ali”,”25″,”Egypt”);
db.insert(“Firas”,”14″,”Jordan”);
db.insert(“Youssef”,”30″,”Palestine”);
db.insert(“Ahmed”,”20″,”Lebanon”);

ثم استخدم دالة الإضافة, وكما قلت لكم سابقاً, الخانة الاولى داخل العمود الأول, والثانية داخل العمود الثاني وهكذا.

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

db.close();

ثم استخدم دالة الاغلاق, لإغلاق القاعدة وهذا مهم كي لا تحدث معك إي مشاكل في المشروع.

SHOW();

ثم طلبنا تنفيذ الدالة SHOW . إذا سوف ينتقل بنا من الاون كريت إلى هذه الدالة لتنفيذها.

هذه الدالة :

هذه الدالة الاوامر داخلها, ثم بفتح القاعدة للقراءة, ثم عرفنا سترنج, هذا السترنج يأخذ السترنج الذي تم إرجاعه من الدالة جلب الجميع, وهي الدالة التي تعيد نفسها تكراراً لتنتهي من جميع العناصر بالجدول.

ثم طلبنا إغلاق القاعدة. ثم النص الذي قمنا بتعريفه يأخذ قيمة السترنج الذي عرفناه في هذه الدالة وأخذ قيم العناصر الموجودة بالجدول.

db.Read();
String contentRead = db.getAll();
db.close();

Test.setText(contentRead);

إذا سوف أكرر لكم ما قمنا له وبخطوات يجب المحافظة عليها بالترتيب مع إضافة وحذف كما يناسبك.

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

و إن شاء الله في دروس قادمة نتعمق فيها أكثر وأكثر .. وشكراً لكم لمتابعتكم وإن شاء الله نعدكم بالقريب والمزيد والحصري .. و في أمان الله 🙂

About عبدالقادر عليوي

مواليد 1996 , سوري الجنسية, طالب علم, لدي شغوف كبير في تعلم كل ما يتعلق بالانترنت من تطوير وحماية, أحب القراءة كثيراً .. هدفي نشر العلم بشتى أنواعه ومجالاته, متابع من الدرجة الأولى لـ الدكتور ابراهيم الفقي و الشيخ أحمد ديدات - رحمهم الله -.

Check Also

التقنيات التي نستطيع برمجة تطبيقات والعاب الاندرويد بها

هل أنت محتار من أين تريد البدأ في مجال برمجة التطبيقات للهواتف الذكية أو الألعاب عالية الاداء ؟ تعرف في هذا المقال عن اللغات والتقنيات واختر منها ما يناسبك لدخول هذا المجال

تعلم برمجة تطبيق اندرويد لمدونتك البلوجر (1)

هل لديك تدوينة أو موقع إخباري ؟ أو معرض يعرض الكثير من البيانات من وسائط ؟ وبحاجة لعرضها في تطبيق اندرويد ؟ هذه فرصتك من هنا وللمبتدئين تعلم برمجة تطبيق لمدونتك

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

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

One comment

  1. اريد ربط قاعدتي بسيرفر بالانترنت هل يمكنك مساعدتي

ضع بصمتك بتعليق يعبر عن امتنانك

هذا الموقع يستخدم Akismet للحدّ من التعليقات المزعجة والغير مرغوبة. تعرّف على كيفية معالجة بيانات تعليقك.