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

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

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

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

كذلك تستطيع استخدامها في ملف خارجي تقوم بتخزينه في ملفات التطبيق. هذه الطرق التي جربتها .. ولمن لديه طرق اخرى يفيدنا بالتعليقات لكي يتم اضافتها للموضوع 🙂

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

معاينة سريعة للدرس :

شرح الأكواد المستخدمة :

* في البداية قمنا بتعرف اللياوت الرئيسية (LinearLayout) من أجل أن نقوم بإدراج العناصر فيها برمجياً.

* قمت بتعريف قاعدة البيانات (SQLiteDatabase) كلاس مخزن سابقاً للتعامل مع قاعدة بيانات من نوع اس كيو لايت.

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

* بعدها لدينا دالة الاون كريت (onCreate) وهي الدالة التي تنفذ خلال تشغيل التطبيق .. ثم استخدمت دالة اخرى SHOW() من أجل الترتيب .. وجعلتها ضمن سطور دالة الاون كريت لكي يتم تنفيذها. في مراحل متقدمة سوف تتعلم تجزأها الى دوال متعددة .. دالة للانشاء ودالة للحذف ودالة للتعديل ودالة لجلب عنصر معين ودالة .. إلخ.

* بعدها بدأت باستخدام (database) وهو المتغير الذي عرفناه سابقاً لقاعدة البيانات. الاستخدام في دالة الاون كريت.

database = openOrCreateDatabase(DBNAME, Context.MODE_PRIVATE,null);
database.execSQL(“CREATE TABLE IF NOT EXISTS “+ TABLE +” (ID INTEGER PRIMARY KEY, NAME TEXT, AGE TEXT, COUNTRY TEXT);”);
database.execSQL(“INSERT INTO “ + TABLE + “(NAME, AGE, COUNTRY) VALUES(‘Abboudi_Aliwi’,’19’,’Syria’)”);
database.execSQL(“INSERT INTO “ + TABLE + “(NAME, AGE, COUNTRY) VALUES(‘Mohammed’,’22’,’Saudi Arabia’)”);
database.execSQL(“INSERT INTO “ + TABLE + “(NAME, AGE, COUNTRY) VALUES(‘Ali’,’25’,’Egypt’)”);
database.execSQL(“INSERT INTO “ + TABLE + “(NAME, AGE, COUNTRY) VALUES(‘Firas’,’14’,’Jordan’)”);
database.execSQL(“INSERT INTO “ + TABLE + “(NAME, AGE, COUNTRY) VALUES(‘Youssef’,’30’,’Palestine’)”);
database.execSQL(“INSERT INTO “ + TABLE + “(NAME, AGE, COUNTRY) VALUES(‘Ahmed’,’20’,’Lebanon’)”);
database.close();

لاحظ في الكود السابق .. أن المتغيرات باللون البنفسجي هي متغيرات بلغة الجافا قمنا بتعريفها سابقاً .. كي لا نكرر كتابة الجدول, استخدمنا متغيرات تختصر علينا 🙂 ..
بعدها بدأنا بادراج الاوامر للقاعدة .. و هي باللون الأخضر .. تفريغ القالب .. أنشا لنا القالب اذا لم يكن موجود .. ادخل في الجدول ثلاث حقول الاسم والعمر والدولة .. بعدها القيم لهذه الحقول.
في دروس متقدمة سوف تتعلم كيف تضيف اسم الحقل مرة واحدة , وكذلك كيف تجعل المستخدم هو الذي يضيف القيم .. مثلاً ادخل اسمك, عمرك .. راتبك .. نقاطك .. اسمائك المفضلة .. إلخ. تختصر عليك في أي عملية ادخال. ادخلت بعض الاسماء والدول بشكل عشوائي $: بعدها طلبت منه اغلاق القاعدة.
أسفل هذه الأكواد وداخل دالة الاون كريت كذلك .. طلبت تشغيل دالة (SHOW) لتعرض لنا ما قمنا بعمله. لأن جميع الأوامر السابقة هي قد التنفيذ برمجياً .. يتم انشاء القاعدة في ملفات التطبيق وليس هناك ما هو مرئي للمستخدم.

لذلك استخدمت هذه الدالة والتي قمت بتعريفها اسفل دالة الاون كريت لعرض الحقول التي قمت بإنشائها.

* في دالة العرض :

database = openOrCreateDatabase(DBNAME, Context.MODE_PRIVATE,null);
Cursor allrows = database.rawQuery(“SELECT * FROM ” + TABLE, null);

قمنا بفتح القاعدة كما فتحناها في البداية فوق .. وبعدها قمنا بتعريف allrows وهو متغير من نوع (Cursor) وهو اوبجت مؤشر مساعد للقراءة والكتابة على قاعدة البيانات.  و قمنا بتحديد هذا الجدول الذي نعمل عليه.

TextView text = new TextView(this);
text.setText(“========================================“);
LinearLayout.addView(text);

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

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

أما بالنسبة لـ moveToFirst & moveToNext فهي من الأفضل أن يقوموا بشرحها لنا أصحاب التعامل مع قواعد البيانات .. ولكن حسب ما هو مذكور  .. أنها تقوم بإرجاع قيمة زائفة (false) في حال كان المؤشر فارغ (Cursor).

LinearLayout id_row = new LinearLayout(this);
LinearLayout name_row = new LinearLayout(this);
LinearLayout age_row= new LinearLayout(this);
LinearLayout country_row= new LinearLayout(this);

قمنا بإنشاء 4 طبقات لياوت, واحدة للمعرف واخرى للاسم والعمر والدولة.

final TextView id_ = new TextView(this);
final TextView name_ = new TextView(this);
final TextView age_ = new TextView(this);
final TextView country_ = new TextView(this);
final TextView sep = new TextView(this);

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

String ID = allrows.getString(0);
String NAME= allrows.getString(1);
String AGE= allrows.getString(2);
String COUNTRY= allrows.getString(3);

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

id_.setTextColor(Color.RED);
id_.setPadding(20, 5, 0, 5);
id_.setTextSize(19);
name_.setTextColor(Color.RED);
name_.setPadding(20, 5, 0, 5);
name_.setTextSize(19);
age_.setTextColor(Color.RED);
age_.setPadding(20, 5, 0, 5);
age_.setTextSize(19);
country_.setTextColor(Color.RED);
country_.setPadding(20, 5, 0, 5);
country_.setTextSize(19);

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

id_.setText(“ID : ” + ID);
id_row.addView(id_);
LinearLayout.addView(id_row);
name_.setText(“NAME : “+NAME);
name_row.addView(name_);
LinearLayout.addView(name_row);
age_.setText(“AGE : ” + AGE);
age_row.addView(age_);
LinearLayout.addView(age_row);
country_.setText(“COUNTRY : ” + COUNTRY);
country_row.addView(country_);
LinearLayout.addView(country_row);
sep.setText(“————————————————-“);
LinearLayout.addView(sep);

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

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

الكود كامل للاستفادة منه :

package com.andrody.testandrody;

import android.app.Activity;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Color;
import android.os.Bundle;
import android.widget.LinearLayout;
import android.widget.TextView;


public class MainActivity extends Activity {

    LinearLayout LinearLayout;
    SQLiteDatabase database;
    private static String DBNAME = "Sqlite_simple.db";
    private static String TABLE = "MY_TABLE";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        LinearLayout = (LinearLayout) findViewById(R.id.linearlayout);

        database = openOrCreateDatabase(DBNAME, Context.MODE_PRIVATE, null);
        database.execSQL("CREATE TABLE IF  NOT EXISTS " + TABLE + " (ID INTEGER PRIMARY KEY, NAME TEXT, AGE TEXT, COUNTRY TEXT);");
        database.execSQL("INSERT INTO " + TABLE + "(NAME, AGE, COUNTRY) VALUES('Abboudi_Aliwi','19','Syria')");
        database.execSQL("INSERT INTO " + TABLE + "(NAME, AGE, COUNTRY) VALUES('Mohammed','22','Saudi Arabia')");
        database.execSQL("INSERT INTO " + TABLE + "(NAME, AGE, COUNTRY) VALUES('Ali','25','Egypt')");
        database.execSQL("INSERT INTO " + TABLE + "(NAME, AGE, COUNTRY) VALUES('Firas','14','Jordan')");
        database.execSQL("INSERT INTO " + TABLE + "(NAME, AGE, COUNTRY) VALUES('Youssef','30','Palestine')");
        database.execSQL("INSERT INTO " + TABLE + "(NAME, AGE, COUNTRY) VALUES('Ahmed','20','Lebanon')");
        database.close();

        SHOW();
    }

    public void SHOW() {
        try {
            database = openOrCreateDatabase(DBNAME, Context.MODE_PRIVATE, null);
            Cursor allrows = database.rawQuery("SELECT * FROM " + TABLE, null);

            TextView text = new TextView(this);
            text.setText("========================================");
            LinearLayout.addView(text);

            if (allrows.moveToFirst()) {
                do {
                    LinearLayout id_row = new LinearLayout(this);
                    LinearLayout name_row = new LinearLayout(this);
                    LinearLayout age_row = new LinearLayout(this);
                    LinearLayout country_row = new LinearLayout(this);

                    final TextView id_ = new TextView(this);
                    final TextView name_ = new TextView(this);
                    final TextView age_ = new TextView(this);
                    final TextView country_ = new TextView(this);
                    final TextView sep = new TextView(this);

                    String ID = allrows.getString(0);
                    String NAME = allrows.getString(1);
                    String AGE = allrows.getString(2);
                    String COUNTRY = allrows.getString(3);

                    id_.setTextColor(Color.RED);
                    id_.setPadding(20, 5, 0, 5);
                    id_.setTextSize(30);
                    name_.setTextColor(Color.RED);
                    name_.setPadding(20, 5, 0, 5);
                    name_.setTextSize(30);
                    age_.setTextColor(Color.RED);
                    age_.setPadding(20, 5, 0, 5);
                    age_.setTextSize(30);
                    country_.setTextColor(Color.RED);
                    country_.setPadding(20, 5, 0, 5);
                    country_.setTextSize(30);

                    id_.setText("ID : " + ID);
                    id_row.addView(id_);
                    LinearLayout.addView(id_row);
                    name_.setText("NAME : " + NAME);
                    name_row.addView(name_);
                    LinearLayout.addView(name_row);
                    age_.setText("AGE : " + AGE);
                    age_row.addView(age_);
                    LinearLayout.addView(age_row);
                    country_.setText("COUNTRY : " + COUNTRY);
                    country_row.addView(country_);
                    LinearLayout.addView(country_row);
                    sep.setText("-------------------------------------------------");
                    LinearLayout.addView(sep);
                }
                while (allrows.moveToNext());
            }
            database.close();
        } catch (Exception e) {
        }
    }
}

Sqlite_simple.db / اسم قاعدة البيانات الذي يتم إنشائه. MY_TABLE/ اسم الجدول داخل القاعدة.

أما فالكود المستخدم داخل اللياوت فهو بسيط جداً .. التالي :

<?xml version="1.0" encoding="utf-8"?>
<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:id="@+id/linearlayout"
            android:layout_width="match_parent"
            android:layout_height="fill_parent"
            android:layout_below="@+id/add_record"
            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" />
        </LinearLayout>
    </ScrollView>
</LinearLayout>

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

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

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

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

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

Check Also

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

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

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

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

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

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

5 comments

  1. شكرا بس بدي اسأل :
    أنا ولا مرة اتعاملت مع قاعدة بيانات SQL ….. و احيانا بشوف دورات على اليوتيوب عنم MYSQL و بقولوا اذا اتعلمت كيف استخدمها فيني استخدمها بالاندرويد فصح هل حكي ؟
    وشو الفرق بين MYSQL و SQLITE ؟

  2. مسا الخير …
    أنا ما استخدمت قبل هيك sql lit بس معى مشروع لازم استخدمها وانا مش عارفة كيف
    مشروعى مستخدمة فيه navigation drawer و كمان list view و guide list لعرض البيانات … عملت كل list لحال وكلهن جاهزات بس ما عرفت كيف بدى اربطهن مع قاعدة بيانات …. اغلب دروس الى ع نت فى حالة تسجيل مستخدم لقاعدة البيانات وانا ما بدى المستخدم يعمل شىء , بس انو يستعرض المعلومات الى بتطبيق ياريت لو تقدر تفيدينى ضرورى او لو عندك رابط لفيديو بيشرح هل شىء ….. وشكرا

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

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