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

آموزش دیتابیس اندروید از مبتدی تا پیشرفته – بخش ۱

با توجه به تجربیات گذشته در یادگیری برنامه‌نویسی اندروید و همچنین تدریس اون، کار با دیتابیس اندروید یکی از مسائل کلیدی و مهم برای افراد تازه کار هست.

معمولا افرادی که قبلا برنامه‌نویس نبودن و همچنین افرادی که با دیتابیس آشنایی ندارن به سختی با این موضوع ارتباط برقرار میکنن.

تصمیم گرفتیم توی چند بخش مبحث دیتابیس رو از مبتدی و ساده‌ترین حالت تا سطح پیشرفته آموزش بدیم.

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

توی این مجموعه آموزش هم به همین روش جلو میریم.

آشنایی با دیتابیس

اول یک توضیح خیلی ساده از دیتابیس بدم. دیتابیس یک فایل هست (فرض کنید فایل تکست) که داخل اون اطلاعات به طور ساختار یافته توی جدول‌ها ذخیره میشن.

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

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

http://s8.picofile.com/file/8281267726/sample_table.jpg

خب حالا که درک درستی از دیتابیس پیدا کردیم بریم بحث رو ادامه بدیم.

 

ساخت دیتابیس در اندروید

توی اندروید از دیتابیس SQLite استفاده میشه که خیلی شبیه SQL هست ولی ورژن سبک ترش.

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

SQLiteDatabase mydb;
String databaseName = "myDatabaseName";
mydb = openOrCreateDatabase(databaseName, Context.MODE_PRIVATE, null);

حالا که دیتابیس رو با استفاده از تابع openOrCreateDatabase ساختیم یا باز کردیم، باید یک جدول بسازیم و جزئیاتش رو مشخص کنیم.

برای ساخت باید اسم جدول و خصوصیات ستون‌هاش رو مشخص کنیم. ستون‌ها به این شکل تعریف میشن => اول اسم ستون بعد نوع داده‌ای که داخلش قرار میگیره.

به شکل زیر با استفاده از شیء دیتابیس که اینجا اسمش mydb هست جدول رو میسازیم.

String tableName = "students";
mydb.execSQL("CREATE TABLE IF NOT EXISTS "+ tableName +
    " (id INTEGER PRIMARY KEY, name TEXT, mark numeric);");

جدولی که ساختیم اسمش students هست که سه تا ستون داره. آیدی، اسم و نمره. نوع آیدی از جنس عدد هست و نوشتن PRIMARY KEY مشخص میکنه که این ستون نمیتونه به هیچ عنوان مقدار تکراری داشته باشه. نوع اسم تکست و نوع نمره هم عدد هست.

 

وارد کردن اطلاعات در جدول

خب دیتابیس رو ساختیم، جدول رو هم ساختیم حالا باید داخلش اطلاعات وارد کنیم. دو تا راه برای وارد کردن اطلاعات وجود داره. هر کدوم که فکر میکنید راحت‌تر هستین استفاده کنین.

راه اول:

ContentValues values = new ContentValues();
values.put("id", 3435); // student id
values.put("name", "ali"); // student name
values.put("mark", 19); // student mark

// Inserting Row
mydb.insert(tableName, null, values);

یک شیء ContentValues میسازید و برای هر ستون مقدارش رو مشخص میکنید. پارامتر اول اسم ستون و پارامتر دوم مقدارش. در نهایت با استفاده از تابع insert این مقادیر رو به عنوان یک سطر جدید توی جدول وارد میکنید.

راه دوم: نوشتن کوئری sql

mydb.execSQL("INSERT INTO " + tableName + "(id, name, mark) VALUES (3435, 'ali', 19)");

توی این روش ابتدا اسم ستون‌هایی که میخوایم مقدار بدیم رو مینویسیم و بعد از values داخل پرانتز به همون ترتیبی که اسم ستون‌ها رو نوشتیم، مقادیر رو وارد میکنیم. دقت داشته باشین که اگر مقدار از نوع تکست هست، حتما و حتما باید داخل تک کوتیشن قرار بگیره و گرنه موقع اجرا خطا میگیرید. (یکی از خطاهایی که خیلی زیاد اتفاق میفته و روی اعصابتون راه میره!)

در نهایت این مقادیر به عنوان یک سطر جدید به جدول شما اضافه میشن.

توجه: در هر دو روش، اگر مقدار ستون id به این دلیل که primary key تعریف شده، تکراری باشه خطا میگیرید. در صورتی که کلا ستون id رو مقدار ندید و در نظر نگیرید، خودش هر سری یک واحد بالا میره تا مقدارش تکراری نشه. (خاصیت auto increment)

خب این شد ساده‌ترین روش برای نوشتن اطلاعات توی دیتابیس.

یادتون باشه حتما بعد از اینکه کارتون با شیء دیتابیس تموم شد باید ببندیدش. به شکل زیر:

mydb.close();

در ادامه …

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

همینطور کم کم دیتابیس رو به صورت پیشرفته‌تر کار میکنیم.

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

بخش دوم: خواندن اطلاعات از جدول

بخش سوم: آپدیت و حذف اطلاعات

بخش چهارم: شروع کار پیشرفته و ساختار یافته

بخش پنجم: پیاده سازی نمونه پروژه دیتابیس اندروید

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

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

حجت ریحانه

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

13 ديدگاه بر “آموزش دیتابیس اندروید از مبتدی تا پیشرفته – بخش ۱

  1. سلام
    من یه مشکلی که دارم اینه که باید بدونم هر کلمه از کد برای چیه
    مثلا خیلی جاها شما null گذاشتین که من نمیفهمم چه چیزی بوده که به جاش این اومده
    یا مثلا قسمت ساخت جدول خط دوم من متوجه کد ها داخل پرانتزش نمیشم
    من واقعا تازه کارم ولی هر جا میرم یا مثال ها خیلی ساده هستن که نود درصد آموزش رو الکی میذارن رو کد های xml
    یا یه دفه فلان کلاس رو میسازه و میگه این کد هارئ کپی کن فقط اونم بدون توضیحی
    اگر بتونین راهنماییم کنین ممنون میشم

    1. سلام
      خیلی خوبه که دوست دارید تمام بخش‌های کد رو بفهمید، اما این توی یادگیری و پیشرفت به شما خیلی ضربه میزنه. سعی کنید ابتدا بخش‌هایی که مورد نیاز هستند رو یاد بگیرید.
      قسمت‌هایی که توی نمونه‌ها null گذاشته شده اکثرا به این دلیل هست که خیلی مورد استفاده قرار نمیگیرن و یا استفاده از اونها خیلی کد و مثال رو پیچیده و غیرقابل فهم میکنه.
      مثلا توی کد زیر که پارامتر آخر null گذاشته شده
      mydb = openOrCreateDatabase(databaseName, Context.MODE_PRIVATE, null);
      این پارامتر cursorFactory هست. با null گذاشتن اون میگید که دوست دارید از ساختار استاندارد cursor برای خوندن اطلاعات استفاده کنید. حالا اگر بخواین بهش مقدار بدید باید ابتدا یک کلاس cursor شخصی‌سازی شده برای خودتون بسازید و یک نمونه از اون رو بدید به این تابع، که نیاز به کدنویسی بیشتر داره و کار شما رو برای یادگیری سخت‌تر میکنه.

      قسمت دوم ساخت جدول، کدهای داخل پرانتز داره مشخصات ستون‌های جدول رو تعیین میکنه. به این شکل که اول اسم ستون، و بعد نوع داده‌هایی که توی اون ستون ذخیره میشه نوشته شده.
      توضیح زیر کد هم تا حدودی میتونه کمکتون کنه.
      هر سوالی بود بپرسید، در صورت امکان خوشحال میشم کمکتون کنم.

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

    چنتا سوال دارم اگه برام روشن کنید ممنون میشم
    اول اینکه وقتی دیتابیس رو میسازی فایل دیتابیس توی device ذخیره میشه؟ینی میشه رفت از توی فایل منیجر پیداش کرد؟اگه آره توی چه مسیری میره؟

    دوم اینکه حالا اگر فایل دیتابیس رو پیدا هم کردم میشه با دیتابیس منیجرای مختلف بازش کنم و توش table درست کنم یا تغییراتی بدم؟

    تفاوت ساخت این نوع دیتابیس با اینکه با یه نرم افزار دیتابیس بسازی و توی assest قرار بدی چیه؟و اینکه توی کلاسای MyDatabase و DatabaseHelper تغییراتی باید داده بشه یا توی هر دو حالت فرقی ندارن؟

    و در نهایت اینکه دیتابیس آنلاین و داشتن سرور بهتره یا دیتابیس آفلاین؟ مثلا برای یه نرم افزار حساب و کتاب که ثبت نام و چیزای اینجوری نداره به صورت آفلاین دیتابیس درست بشه بهتره یا آنلاین؟

    اگر لطف کنید پاسخ بدید لطف بزرگی به من میکنید
    مدتیه که ui برنامه رو نوشتم ولی این دیتابیس خیلی اذیتم کرده و فقط سایت شما بود که تا حدودی تونسته کمکم کنه
    در ضمن من خیلی خیلی تازه کارم یعنی ۳-۴ ماهی میشه یاد گرفتم و این هم اولین پروژم هستش

    بازم پیشاپیش از کمک و همکاریتون ممنون

    1. سلام
      ۱- بله دیتابیس توی دستگاه ذخیره میشه، برای پیدا کردنش باید گوشی روت شده باشه یا با شبیه ساز پیداش کنید. توی پوشه data/data و بعد پوشه‌ای به اسم پکیج برنامتون
      ۲- بله میشه توی فایل دیتابیس تغییرات داد
      ۳- هیچ تفاوتی از نظر ساختار ندارن فایلهای دیتابیس ساخته شده
      ۴- کاملا بستگی به نیاز شما و پروژه داره. دیتابیس آنلاین و سرور تنها در حالاتی استفاده میشه که نیاز به امنیت اطلاعات و ارتباطات داشته باشیم، یا اینکه بخوایم اطلاعات کاربر رو در هر دستگاهی بهش ارائه بدیم و از بین نره. غیر از این لزومی نداره حتما آنلاین باشه. حالا دیگه که نیاز به دیتابیس آنلاین پیدا میشه اینه که بخواین اطلاعات دوره‌ای آپدیت بشه و از سرور و لازم نباشه کاربر حتما برنامه رو آپدیت کنه.

      ممنون از نظر لطف شما
      موفق باشید

  3. سلام
    باز هم سوال و باز هم مزاحمت
    من تازه کارم شما لطف میکنید امثال ما تازه کارها رو راهنمایی میکنید

    سه تا سوال داشتم:
    ۱-من از هر کدوم از گزینه های CardView اطلاعات رو گرفتم و تو یه اکتیویتی دیگه نشون دادم. اما حالا که میرم به یه اکتیویتی دیگه و قصد دارم به اکتیویتی اطلاعات برگردم force close میده که البته طبیعیه. چطور باید همون اکتیویتی با همون اطلاعات رو دوباره برگردونم و ببینم؟؟

    ۲-میخوام توی recycler view اطلاعات از دیتابیس از آیدی آخر به اول نشون داده بشن.چطور باید اینکارو کنم؟؟

    ۳- برای وارد کردن اعداد نیاز دارم که بین هر سه تا عدد یه علامت ” , ” گذاشته بشه تا اعداد و مبالغ زیاد به راحتی قابل خوندن باشن. ولی نمیدونم چجوری…

    ممنون از راهنمایی و پاسخ ها
    واقعا خدا خیرتون بده

    1. سلام دوست عزیز
      خواهش میکنم

      سوال اولتون رو درست متوجه نشدم و نمیدونم مشکل از کجاست
      سوال دوم: اگر به صورت کوئری اطلاعات رو از دیتابیس میگیرید باید آخر کوئری تون بنویسید order by id DESC که بر اساس آیدی به صورت نزولی نتایج رو به شما بده
      سوال سوم: داخل دیتابیس به این شکل ذخیره نکنید، وقتی میخواین اطلاعات رو به کاربر نمایش بدید اعداد رو به این شکل فرمت کنید و نمایش بدید. با یک جستجوی ساده در اینترنت به جواب میرسید

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

  4. امیدوارم بتونم خوب توضیح بدم

    ببینید من میخوام اطلاعات دیتابیسم رو توی recycler view نشون بدم

    من recycler view و adapter رو ساختم دیتابیس رو هم ساختم .
    از یه اکتیویتی یکسری اطلاعات رو توی دیتابیس اینزرت کردم.
    این اطلاعات به صورت card view و از آیدی آخر به اول توی recycler view نمایش داده میشه.

    تا اینجا که هم چی آسون بود و مشکلی نبود
    اما مشکل از زمانی شروع شد که میخواستم با کلیک روی هر کدوم از آیتم ها اطلاعات کامل رو از دیتابیس بگیرم و توی یه اکتیویتی دیگه نمایش بدم.
    با یک کد و گذاشتن putExtra و از طریق getAdapterPosition تونستم اطلاعات هر آیتم رو بگیرم و توی یه اکتیویتی دیگه نشون بدم.

    بعد من یه کوئری برای جستجو نوشتم.
    تا اینجا هم خوب بود و براحتی جستجو رو انجام میدادم و recycler view فقط اون crad view رو نشون میداد که من سرچ کردم.

    اما مشکل اصلی اینه وقتی روی اون card view کلیک میکنم که اطلاعات رو ببینم اطلاعات اشتباهی به من نشون میده.

    فرض کنید من اطلاعاتی از ali و ahmad و reza اینزرت کردم
    خب اینا به ترتیب از reza که آخرین اینزرت من بود توی recycler view نمایش داده شدن
    حالا من فقط ali رو سرچ میکنم
    ولی وقتی روش کلیک میکنم اطلاعات reza بهم نشون داده میشه، چون موقه اینزرت reza اولین card view بوده از این به بعد هر چیزی که سرچ کنم و توی سرچم اولین card view نمایش داده بشه، اطلاعات reza نشون داده میشه.

    امیدوارم تونسته باشم خوب توضیح بدم
    میخواید تصاویر کدهای مربوطه رو بفرستم تا دقیق تر ببینید؟

    من خودم فکر میکنم مشکل از اون getAdpaterPosition هستش چون بار اول position اولین card view براش reza تعریف شده و هر چی سرچ کنم که توی position اول قرار بگیره فقط reza رو نشون میده.

    جالبه هر چیزی هم توی position دوم یا دومین card view قرار بگیره همین اتفاق میفته
    تو همین مثال چون ahmad دومین بود اگر من یه سرچی انجا بدم که اول ali و بعد reza نشون داده بشه و من روی reza کلیک کنم اطلاعات ahmad که دومین بود نمایش داده میشه.

پاسخ دادن به علی اکبر لغو پاسخ

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