آموزش دیتابیس اندروید

آموزش استفاده از دیتابیس آماده اندروید

در مطالب قبلی با دیتابیس در اندروید آشنا شدیم و کار با اون رو یاد گرفتیم. چیزی که یاد گرفتیم اینطور بود که با نصب برنامه توسط کاربر، دیتابیس ایجاد میشه و پس از اون کاربر اطلاعات خودش رو وارد دیتابیس میکنه. اما مسلما همیشه اینطور نیست. خیلی از اوقات ما نیاز داریم از دیتابیس آماده اندروید استفاده کنیم و اطلاعاتی رو از قبل توی دیتابیس داشته باشیم. مثلا یک برنامه دیکشنری لغات یا دستورات آشپزی یا … نیاز به دیتابیس آماده دارند و از اونجایی که حجم اطلاعات زیاده نمیشه اونا رو با کدنویسی و در اولین اجرای برنامه توی دیتابیس ریخت.

در این بخش روش کار با دیتابیس آماده اندروید رو یاد میگیریم.

برای کار با دیتابیس آماده اندروید، از کتابخونه‌ای به اسم SQLite Asset Helper استفاده می‌کنیم.

این کتابخونه علاوه بر سادگی، مزیت دیگه‌ای داره و اون اینکه فایل دیتابیس رو به صورت zip قبول میکنه. که این باعث میشه حجم دیتابیس و برنامه شما چندین برابر کم بشه.

 

شروع کار

قدم اول اینه که شما دیتابیس خودتون رو درست کرده باشید و فایل اون رو داشته باشید. من برای ساخت دیتابیس آماده و کلا کار با فایل دیتابیس SQLite، از نرم افزار DB Browser for SQLite استفاده می‌کنم. مهم نیست با چه نرم افزاری دیتابیس رو میسازید. اما فایل دیتابیس شما باید این شرایط رو داشته باشه:

اول: یک جدول به اسم android_metadata داشته باشه که این جدول یک ستون به اسم locale داره. داخل این جدول تنها یک سطر وجود داره که مقدار اون en_US هست. برای ساخت این جدول و اضافه کردن این سطر میتونید خیلی راحت کوئری‌های زیر رو در نرم‌افزاری که بالا معرفی کردیم اجرا کنید. برای اجرا باید به بخش Execute SQL در این نرم‌افزار بروید. (یا در نرم‌افزارهای دیگه بخشی که قابلیت اجرای کوئری SQL رو دارن)

CREATE TABLE android_metadata (locale TEXT);
INSERT INTO android_metadata VALUES('en_US');

فقط کافیه کوئری‌ها رو کپی کنید و دکمه اجرا رو بزنید، یا دکمه F5

دوم: دیتابیس شما باید پسوند db داشته باشه. یعنی در نهایت اسم دیتابیس شما مثلا میشه MyDatabase.db

 

قرار دادن دیتابیس در برنامه

بعد از اینکه دیتابیس خودتون رو ساختید و اطلاعات مدنظرتون رو داخل اون ریختید، نوبت به قرار دادن فایل دیتابیس در برنامه میرسه. بالاتر اشاره کردم، کتابخونه‌ای که ما استفاده می‌کنیم فایل دیتابیس رو به شکل زیپ شده قبول میکنه، پس شما باید فایل دیتابیستون رو با فرمت zip فشرده کنید.

توجه: این مراحل و اسم گذاری‌ها به شدت مهم هست و عدم رعایت هر کدوم باعث میشه به خطا بخورید.

توی پروژه خودتون در اندروید استودیو پوشه assets رو باز کنید (اگر ندارید بسازید) و داخل اون یک پوشه به اسم databases بسازید. داخل این پوشه جدید فایل زیپ شده دیتابیس خودتون رو کپی کنید. در نهایت ساختار پوشه assets باید به شکل زیر بشه (به پسوند فایل دیتابیس دقت کنید)

ساختار پروژه

ساختار فایل‌های پروژه در اندروید استودیو

 

بعد از قرار دادن فایل زیپ شده دیتابیس با شرایطی که گفتیم، نوبت به اضافه کردن کتابخونه و استفاده ازش میرسه.

فایل jar این کتابخونه رو دانلود کنید و داخل پوشه libs در پروژتون قرار بدید.

دانلود فایل jar کتابخانه SQLite Asset Helper

توی اندروید استودیو روی فایل jar کتابخونه راست کلیک کنید و پایین پنجره‌ای که باز میشه روی Add as Library کلیک کنید.

صبر کنید پروژتون build و کتابخونه به درستی اضافه بشه. بعد از اتمام این فرآیند می‌بینید که توی فایل gradle پروژه در قسمت dependencies خط زیر اضافه شده

compile files('libs/sqliteassethelper-2.0.1.jar')

 

استفاده از دیتابیس آماده اندروید در برنامه

بعد از اضافه کردن کتابخونه، کلاس زیر رو توی پروژه خودتون ایجاد کنید. این کلاس وظیفه باز کردن فایل دیتابیس شما و کپی کردن اون در گوشی کاربر رو بر عهده داره. البته در صورتی که فایل وجود داشته باشه، فقط دیتابیس رو به شما برمیگردونه تا بتونید ازش استفاده کنید.

همچنین این کلاس حواسش به ورژن دیتابیس شما هم هست و در صورتی که ورژن دیتابیس قبلی که توی گوشی کاربر هست قدیمی باشه، فایل دیتابیس جدید رو جایگزین قبلی میکنه و عملیات آپدیت رو انجام میده.

MyDatabase.java

package your.package.name;

import android.content.Context;
import com.readystatesoftware.sqliteasset.SQLiteAssetHelper;

public class MyDatabase extends SQLiteAssetHelper {

   private static final String DATABASE_NAME = "MyDatabase.db";
    public static final int DATABASE_VERSION = 1;

    public MyDatabase(Context context) {
      super(context, DATABASE_NAME, null, DATABASE_VERSION);
      setForcedUpgrade();
   }
}

حالا می‌تونید کاملا مشابه قبل از دیتابیس استفاده کنید و ادامه کار هیچ تفاوتی نداره.

 

نکته: در صورتی که فایل دیتابیس شما حجم زیادی داشته باشه، عملیات کپی کردن و انتقال اون به گوشی کاربر ممکنه تا چند دقیقه طول بکشه. برای همین بهتره اولین استفاده از دیتابیس رو داخل یک AsyncTask انجام بدید و با نمایش یک لودینگ از کاربر بخواین صبر کنه.

 

یک مثال ساده از نحوه استفاده

در این مثال دیتابیس رو باز می‌کنیم و از جدول students اطلاعات آیدی، نام، سن و نمره رو میخونیم و داخل یک تکست‌ویو نمایش میدیم.

SQLiteDatabase mydb = new MyDatabase(MainActivity.this).getWritableDatabase();

TextView txt = (TextView) findViewById(R.id.txt);

Cursor c = mydb.rawQuery("select * from students", null);
while (c.moveToNext()){
    int id = c.getInt(0);
    String name = c.getString(1);
    int age = c.getInt(2);
    int mark = c.getInt(3);

    txt.append(id + "- " + name + ", age: " + age + ", mark: " + mark + "\n");
}

c.close();
mydb.close();

نکته: دوباره تاکید میکنم این کتابخونه به شدت به نام گذاری و شرایطی که گفته شد حساس هست و در صورتی که این مراحل اشتباه انجام داده بشه، با خطا مواجه خواهید شد.

امیدوارم این آموزش براتون مفید واقع بشه.

لطفا هر سوالی داشتید از پرسیدنش کوتاهی نکنید.

 

 

من عاشق برنامه‌نویسی، یاد گرفتن و آموزش دادن هستم. انجام کارای جدید توی برنامه‌نویسی رو بیشتر به چشم سرگرمی میبینم تا کار.

حجت ریحانه

من عاشق برنامه‌نویسی، یاد گرفتن و آموزش دادن هستم. انجام کارای جدید توی برنامه‌نویسی رو بیشتر به چشم سرگرمی میبینم تا کار.

37 ديدگاه بر “آموزش استفاده از دیتابیس آماده اندروید

    1. سلام
      متاسفانه من در این مورد اطلاعات زیادی ندارم.
      اگر بتونید از دیتابیس اکسس خروجی به صورت فایل CSV یا به صورت کوئری‌های sql بگیرید، اون وقت شاید بتونید این خروجی‌ها رو توی نرم افزارهای sqlite استفاده کنید و دیتابیس خودتون رو به این شکل تبدیل کنید.

    1. سلام
      خیر کلاس‌های اصلی و Helper تنها نیازه یک بار نوشته بشه.
      اما همون کدهایی که برای انجام عملیات یک جدول در Helper نوشتید، باید برای جدول دوم هم بنویسید.

    1. سلام
      برای آپدیت تکست‌ویو باید مجدد اطلاعات رو از دیتابیس بخونید و داخلش نمایش بدید.
      مگر اینکه تغییرات توی دیتابیس خیلی کم باشه و بتونید با کدنویسی راحت‌تر تکست‌ویو رو آپدیت کنید.

  1. سلام میشه از این روش به صورت داینامیک هم استفاده کرده؟
    مثلا یکسری اطلاعات از قبل وارد دیتابیس کنیم و داخل برنامه کپی کنیم و بعد از اون بتونیم از داخل برنامه یکسری اطلاعات جدید رو به دیتابیس اضافه کنیم؟؟
    مثل عملیات درج و حذف و اپدیت و …

  2. با درود داداشی این روش ی که نوشتم بهتره…..بزارش برای بچه ها…….

    یک پایگاه بانام بهنام و جدولی به نام student و یک ستون به نام name

    این در mainactivity

    MyDatabase db = new MyDatabase(this);
    final SQLiteDatabase database = db.getReadableDatabase();
    Cursor cu = database.rawQuery(“SELECT name FROM student”, null);
    while (cu.moveToNext()) {
    try {

    Toast.makeText(getApplicationContext(), cu.getString(0) , Toast.LENGTH_LONG).show();

    }
    catch (Exception e) {

    }

    }
    cu.close();
    database.close();

    و یک کلاس هم همونطوری که در بالا گفتی
    به نام MyDatabase.java بسازه

    import android.content.Context;

    import com.readystatesoftware.sqliteasset.SQLiteAssetHelper;

    public class MyDatabase extends SQLiteAssetHelper {

    private static final String DATABASE_NAME = “behnam.db”;
    private static final int DATABASE_VERSION = 1;

    public MyDatabase(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    }

    این روتوش کپی کنه

    1. سلام
      اگر دقیقا مطابق آموزش برید جلو باید بدون اشکال بتونید پیاده سازی کنید.
      لطفا به اسم گذاری ها و پسوندها و شرایطی که گفته شده دقت کنید.

  3. مرسی از اینکه سریع جواب دادین.ولی من خطا دارم

    public MyDatabase(Context context, String storageDirectory)
    این سازنده کلاس mydatabase هست و دوتا پارامتر میگیره.پارامتر دوم که storageDirectory هست رو چرا خالی گذاشتین؟

    1. آها درسته ببخشید.
      من کد رو تصحیح کردم
      پارامتر storageDirectory برای این هست که بتونید آدرس جایی که فایل دیتابیس کپی میشه رو مشخص کنید.
      این پارامتر اجباری نیست و میتونید کلا از توی تعریف تابع (داخل کلاس myDatabase) اون رو پاک کنیدش و هم از داخل تابع super
      تشکر بابت اطلاع دادن این مشکل

  4. سلام!
    لطفا آموزش رو کامل بذارید یا سورسش رو بذارید من نتونستم پروژه رو جمعش کنم اصن نگفته بودید کد آخر رو تو چه اکتیویتی به کار ببریم یا در مورد معرفی کلاسهای جدید تو اندروید مانیفست من چون با اکلیپس کار میکنم و تازه کارم کلی خطا گرفت واسم گیج شدم مثلا برای cursor یا شی txt حتی برای ; هم خطا گرفت بی زحمت سورس قرار بدید یا یکم کاملترش کنین تا مبتدی ها هم متوجه بشن تنها آموزش توی وب در این موضوع فقط سایت شماست.

    1. سلام
      برای اینکه بتونید با این آموزش کار کنین ابتدا نیاز دارید با مسائل دیتابیس آشنا باشید.
      اول آموزش های مقدماتی دیتابیس رو توی سایت بخونید.

  5. من بازم خطا دارم.میشه کمکم کنید.خیلی برام مهمه
    دقیقا طبق اموزش پیش میرم.۱۰۰ بار چکش کردم.خطا داره
    اینو میده
    Unable to write /MyDatabase.db to data directory

  6. سلام. میشه تو این بخش یک مثال از آموزش استفاده از دیتابیس آماده رو جهت نشون دادن اطلاعات مابین دوتا تاریخ میلادی معین و نمایش اون در ListView رو هم آموزش بدید؟ من واقعا نیاز دارم بهش. ممنون میشم. خدا خیرت بده

  7. سلام به من این خطا رو میده
    Process: com.javid0917.bihamtamadule, PID: 3476
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.javid0917.bihamtamadule/com.javid0917.bihamtamadule.Main2Activity}: com.readystatesoftware.sqliteasset.SQLiteAssetHelper$SQLiteAssetException: Archive is missing a SQLite database file

    لطفل اگه میدونین چشه پاسخ رو برام ایمیل کنین

    1. Process: com.javid0917.bihamtamadule, PID: 4829
      java.lang.RuntimeException: Unable to start activity ComponentInfo{com.javid0917.bihamtamadule/com.javid0917.bihamtamadule.Main2Activity}: com.readystatesoftware.sqliteasset.SQLiteAssetHelper$SQLiteAssetException: Unable to write /MyDatabase.db to data directory

      این خطا رو میده

  8. سلام من یه دیتا بیس دارم ک میخام بعضی اطلاعات سطر هارو تو برنامه داخل تکست ویو نشون بدم حالا باید چ کدی رو استفاده کنم که فقط همون قسمتی ک میخامو نشون بده
    سطر حالهی دیتا بیس هم از نوع text هستن

    لطفا کدا رو بفرستید واقعا نیاز دارم

  9. سلام. اگه با این برنامه روی دیتابیسی که ساختیم رمز بگذاریم، چطوری توی برنامه ازش استفاده کنیم؟ منظورم اینه که کجا باید رمز رو بهش بدیم در برنامه؟

  10. سلام من تمام مراحلی که شما فرمودید دراکلیپس انجام دادم در ظاهر هیچ مشکلی نداره ولی هنگام اجرا خطای dalvikvm میده:
    Could not find class ‘com.sam.exdb.MyDatabase’, referenced from method com.sam.exdb.Main.onCreate
    سرچ کردم با توجه به این لینک
    https://stackoverflow.com/questions/36816684/android-studio-e-dalvikvm-could-not-find-class-referenced-from-method
    گفتم شاید ورژن پایین تر SQLiteAssetHelper رو باید اضافه کنم ولی نتونستم چیزی پیدا کنم میشه کمکم کنید؟ توی این مرحله ی استفاده از دیتابیس آماده حسابی گیر کردم آموزشی بهتر از مال شما هم توی نت ندیدم. اگر کتاب یا هر مرجعی در این زمینه هست لطفا معرفی کنید ممنون میشم

    1. سلام
      به احتمال زیاد کتابخونه به درستی اضافه نشده به پروژه
      فایل jar رو مطمئن بشید به درستی قرار دادید و پروژه رو یک بار rebuild کنید.
      در نهایت بهتون توصیه میکنم از اندروید استودیو استفاده کنید، اکلیپس واقعا مشکلات زیاد و بی دلیلی داره.

  11. سلام . مشکل من با اندروید استودیو حل شد البته دیتابیس رو هم باید مستقیم از فرمت sqlite زیپ میکردم یعنی پسوند db جزء نام دیتابیس باید باشه . ممنون

  12. اموزش خیلی خوب و مفیدی بود. آیا امکان این وجود داره که از دیتابیس سایت در اندروید استفاده کرد . یعنی وصل باشند . داده ها در دیتابیس سایت ذخیره بشند ؟

  13. سلام ممنون از سایتتون.خیلی عالیه.بنده اگه بخوام در برنامه یه دکمه تعریف کنم و با زدن اون محتویات جدول را به فایل ایکس تبدیل کنه چیکار باید بکنم ممنون میشم اگه راهنماییم کنین

  14. با سلام
    این پروژه تستی که گذاشتید اصلا دیتابیس رو کپی نمیکنه چرا
    من یه پروژه دارم خیلی درگیر این دیتابیس شدم و نیاز شدید دارم
    اگر که میشه یه پل ارتباطی راحت مثل تلگرام به بزارید تا من مزاحمتون بشم
    تشکر فراوان ♥♥♥♥

  15. سلام
    ببخشید یه سوال داشتم
    من میخوام یه برنامه بنویسم که دیتابیسش از طریق یه دسکتاپ اپلیکیشن تغییر میکنه و در برنامه موبایل استفاده میشه ، برای ایجاد این دیتابیس باید از همین روش استفاده کنم؟؟

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *