بازی های جالب آندروید

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

۲۱ خرداد ۱۳۹۶

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

در این فصل به بررسی دیتابیس در اندروید می پردازیم که شامل مباحث زیر می باشد :

  • آشنایی با مفهوم دیتابیس و DBMS
  • انواع دیتابیس
  • آشنایی با زبان SQL و دستورات INSERT، UPDATE، DELETE، SELECT، DROP (کوئری یا Query ها)
  • آشنایی با دیتابیس SQLite
  • معرفی ابزارهای مدیریت دیتابیس در محیط دسکتاپ، کار با نرم افزار SQLiteStudio و ساخت جدول در دیتابیس و کار با داده ها
  • نحوه کار با دیتابیس در اندروید
  • کلاس SQLiteOpenHelper
  • کار با Log (لاگ) ها
  • کار با متدهای execSQL، ContentValues، insert، update، delete
  • نمایش پیغام به کاربر با استفاده از متد Toast

این فصل به صورت PDF در ۸۲ صفحه و دو بخش تهیه شده که در ادامه چند صفحه ی ابتدای هر بخش قرار داده شده :

قسمت نخست (آشنایی با دیتابیس):

به نام خدا. پایگاه داده، بانک اطلاعاتی یا دیتابیس، هر سه اصطلاح در زبان فارسی برای Database بکار می رود. در این آموزش من بیشتر واژه دیتابیس را بکار می برم.
قبل از اینکه به مبحث دیتابیس در اندروید بپردازم، به این سوال پاسخ می دهم: دیتابیس چیست؟ به طور خلاصه به مجموعه‌ای از داده‌ها با ساختار منظم و سامان‌مند گفته می‌شود (برگرفته از ویکی پدیا). دسترسی و مدیریت این اطلاعات عموما از طریق سیستم مدیریت پایگاه داده (DBMS) صورت می پذیرد. از دیتابیس برای ذخیره سازی و مدیریت اطلاعات استفاده می شود. امروزه اکثر نرم افزارها و اپلیکیشن ها برای مدیریت داده های خود از دیتابیس استفاده می کنند. کاربر به واسطه نرم افزار یا اپلیکیشن می تواند اطلاعاتی را بر روی دیتابیس اضافه کرده، مشاهده کند، بروزرسانی و یا حذف نماید. البته نه به این معنی که کاربر مستقیما با دیتابیس سروکار داشته باشد، بلکه این وظیفه بر عهده نرم افزار واسط و در نهایت همان DBMS است. یک اپلیکیشن یادداشت را در نظر بگیرید. کاربر می تواند متنی را به عنوان یادداشت درون آن ذخیره کند. همچنین اگر نیاز به اصلاح داشت آن را ویرایش و بروزرسانی نماید. یا هر زمان که بخواهد یادداشتی را که قبلا ذخیره کرده مشاهده نموده و در نهایت این امکان را دارد تا یادداشت خود را حذف نماید. کاری که DBMS یا همان سیستم مدیریت پایگاه داده انجام می دهد، دریافت همین دستورات از کاربر و اعمال آنها بر روی دیتابیس می باشد. شاید با خود بگویید “خب چرا دیتابیس؟ اطلاعات را به سادگی می توان درون یک فایل متنی ساده txt هم ذخیره کرد!” بله نظر شما صحیح است. در موارد محدودی هم ممکن است افراد از این روش استفاده کنند اما به دلایل زیادی ذخیره سازی اطلاعات درون فایل متنی گزینه مناسبی نیست. یک دلیل آن، عدم کد گذاری روی اطلاعات قبل از ذخیره سازی می باشد که از نظر امنیتی می تواند مشکلاتی ایجاد کند. اگر مایلید اطلاعات بیشتری در خصوص تفاوت بین ذخیره در فایل متنی و دیتابیس داشته باشید با اندکی جستجو در وب به پاسخهای متعددی دست خواهید یافت.
دیتابیس در همه جا کاربرد دارد. از اپلیکیشن های مختلف گوشی های هوشمند گرفته تا نرم افزارهای کاربردی رایانه ها، سرورهای بانکها، سازمانها و … .
احتمالا واژه های MySQL و SQL Server را قبلا چندین بار دیده و یا شنیده اید. اینها نمونه هایی از نرم افزارهای مدیریت پایگاه داده از نوع RDBMS (Relational Database Management System) هستند که بر اساس مدل رابطه ای (Relational) پیاده سازی شده اند، به این معنی که اطلاعات به صورت جداولی شامل چندین ردیف و ستون ذخیره و نگهداری می شوند.

شناسه نام نام خانوادگی سن
۱ مهدی جرجانی ۲۶
۲ مریم محمدی ۲۴

جدول بالا نمونه ساده یک دیتابیس است که شامل ۴ ستون و ۲ ردیف می باشد. اطلاعات جدول (ردیف ها) توسط کاربر و به واسطه نرم افزار مدیریت دیتابیس در هر زمان قابل اضافه، ویرایش و حذف شدن است. بجز MySQL و SQL Server نمونه های دیگری از RDBMS ها برای توسعه دهندگان در دسترس هستند مانند ORACLE، MS ACCESS و SQLite که هرکدام بنا به ویژگی های خاص خود، برای مقاصد خاصی طراحی شده اند. به عنوان مثال از ORACLE (اوراکِل) برای بانکهای اطلاعاتی با حجم بسیار بالا استفاده می شود (مانند بانکها و سازمان ها). یا اگر تابحال با سیستم های مدیریت محتوای وب کار کرده اید احتمال زیاد با MySQL آشنایی مختصری دارید. عموما از MySQL برای وب سایتهای با حجم داده در حد کم و متوسط استفاده می شود. اما وجه اشتراک موارد بالا در SQL می باشد. SQL مخفف Structured Query Language و معنی لغوی آن “زبان ساختارمند پرسش ها” است. زبان SQL یک زبان استاندارد بوده که شامل دستوراتی برای مدیریت اطلاعات دیتابیس ها می باشد. از جمله دستورات کلیدی SQL می توان به INSERT، UPDATE، DELETE، SELECT و DROP اشاره کرد.
چهار عمل اصلی پایگاه داده ها Create (ایجاد)، Read (خواندن)، Update (بروزرسانی) و Delete هستند که به اختصار CRUD نامیده می شود.
به احتمال زیاد مفاهیم بالا مقداری شما را گیج کرده است. اما جای نگرانی نیست. اولا اینکه در عمل ما با مفاهیم سروکار نداریم و صرفا از این جهت به خلاصه ای از پایگاه داده ها اشاره کردم تا یک زمینه کلی در ذهنتان ایجاد شود. دوم اینکه دانستن این اطلاعات درک عمیق تری از پایگاههای داده به شما می دهد و چه خوب است در کنار مباحث اصلی دیتابیس، اندکی هم در وب در خصوص دیتابیس ها مطالعه کنید.
بهتر است بیشتر از این وقت شما را نگیرم و بروم سراغ اندروید. در پاراگراف بالا اشاره ای شد که هرکدام از برنامه های مدیریت بانک اطلاعاتی بنا به ویژگی هایی که دارد، در مقاصد خاصی استفاده می شود. در دیوایس های اندروید که عموما گوشی ها و تبلت ها هستند، دیتابیس ها حجم بسیار کمی را در بر می‌گیرند بنابراین لازم است است از برنامه ای استفاده شود که کمترین میزان از منابع سخت افزاری دیوایس از جمله حافظه RAM و CPU را درگیر کند و حجم خود برنامه نیز تا حد ممکن کم باشد. گوگل SQLite را برای اندروید برگزیده و به صورت پیش فرض درون این سیستم عامل تعبیه شده و شما به عنوان توسعه دهنده اپلیکیشن نیازی به نصب SQLite بر روی دیوایس کاربر ندارید. ما فقط دیتابیس را ایجاد نموده و به واسطه دستورات SQL مدیریت می کنیم. SQLite یک پایگاه داده بسیار کوچک با حجمی کمتر از یک مگابایت می باشد که در قالب یک کتابخانه (Library) نوشته شده و به صورت اوپن سورس و رایگان منتشر شده است. بنابراین گوگل یا توسعه دهنده نیازی نیست برای استفاده از این پایگاه داده مبلغی را به سازنده بپردازند. همچنین بر خلاف دیتابیسی مانند MySQL که نیاز به سرور دارد، SQLite بی نیاز از سرور بوده و به صورت مستقل روی هر دیوایس مستقر شده که اصطلاحا ServerLess نامیده می شود. بهتر است قبل از اینکه سراغ استفاده از دیتابیس در اندروید برویم قدری با این پایگاه داده و زبان SQL در محیط گرافیکی و ویژوال آشنا شویم تا درک بهتری از مفاهیم کسب کنیم. ابزارهای مختلفی برای کار با SQLite منتشر شده اند که امکانات و محیط کار همگی تا حدی مشابه یکدیگر است و امکان ساخت دیتابیس، جداول، ستون ها، ورود داده ها، حذف داده ها و … در همه ابزارها محیط گرافیکی و ساده وجود دارد. مزیت این ابزارها در این است که تغییراتی که به صورت ویزاردی کاربر روی دیتابیس انجام می دهد را می تواند در نهایت در قالب چند خط کد که همان زبان SQL هست مشاهده کند. یا اینکه دستوراتی را وارد کند و نتیجه درستی یا نادرستی کد خود را سریعا مشاهده کند. ابزارهایی مانند DB Browser for SQLite ، SQLiteStudio و SQLite Expert Professional که البته مورد آخر رایگان نبوده و اگر مایل به استفاده از آن هستید باید لایسنس را خریداری کرده و یا از نسخه های نال شده استفاده کنید. اما در حدی که ما نیاز داریم ابزارهای رایگان مناسب هستند. حتی پلاگینی به این منظور برای مرورگر FireFox به صورت رایگان منتشر شده که با نصب آن روی فایرفاکس می توانید به مدیریت دیتابیس های SQLite بپردازید. این پلاگین SQLite Manager نام دارد. محیط کاربری این ابزارها تا حدودی مشابه یکدیگر بوده و پیچیدگی را احساس نخواهید کرد.
در این آموزش من از SQLiteStudio استفاده می کنم.
تاکید می کنم استفاده از این ابزار در این مبحث آموزشی فقط برای آشنایی با دیتابیس و دستورات SQL و اطمینان از صحت دستوراتی که بنا به نیازمان می نویسیم بوده و قرار نیست ما دیتابیس خروجی این ابزار را به پروژه اندرویدی خود منتقل کنیم.
من SQLiteStudio را دانلود و از حالت فشرده خارج کردم. بر خلاف سایر ابزارها، SQLiteStudio نیاز به نصب ندارد و و از نوع Portable است. کافیست SQLiteStudio.exe را اجرا کنید. اگر مثل من به تمیز بودن دسکتاپ خود اهمیت می دهید و تمایل دارید دسترسی سریع به این نرم افزار داشته باشید بهتر است پوشه مربوط به این نرم افزار را در یک درایو قرار داده و فقط از فایل SQLiteStudio.exe یک Shortcut ساخته و به دسکتاپ انتقال دهید.
تذکر: امیدوارم این ابزار مدیریت دیتابیس در محیط دسکتاپ را با برنامه های مدیریت دیتابیس (DBMS) اشتباه نگیرید!
SQLiteStudio را باز می کنم.

SQLStudio

اولین قدم ساخت یک دیتابیس جدید است که در منوی Database و گزینه add a new database قابل دسترسی است:

ساخت دیتابیس

ساخت دیتابیس

قسمت Database type مربوط به ورژن SQLite بوده که در زمان نگارش این آموزش نسخه ۳ به صورت پیش فرض انتخاب شده و نیازی به تغییر ندارد. در قسمت File روی گزینه + کلیک کرده و در مسیر مدنظر خود، نامی دلخواه برای فایل دیتابیس تعیین می کنیم:

نام دیتابیس

نام دیتابیس

دیتابیس با نام mydb و پسوند .db آماده ساخت است. OK می کنم:

دیتابیس SQLite

دیتابیس ایجاد شده به لیست Databases اضافه شد. با باز کردن دیتابیس mydb گزینه Tables (جدول ها) مشاهده می شود. در یک دیتابیس به هر تعداد لازم می توان جداول مجزا ایجاد نمود. یک جدول جدید می سازم. ساخت جدول از دو طریق ممکن می باشد:
اول: راست کلیک روی Tables و گزینه Create a Table

اضافه کردن جدول جدید به دیتابیس

دوم: آیکون جدول

اضافه کردن جدول جدید به دیتابیس

اضافه کردن جدول جدید به دیتابیس

در قسمت Table name یک نام برای جدول تعیین می کنیم. من نام tbl_info را وارد کردم. قبل از ساخت جدول حداقل یک ستون می بایست به جدول اضافه کنیم. ساختار دیتابیس و جدول را همین ستون ها تشکیل می دهند. عموما برای هر ردیف از اطلاعات یک شناسه (ID) اختصاص می دهیم که این شناسه به صورت افزایشی و غیر قابل تکرار می باشد. با زدن گزینه Add column پنجره ای باز می شود که مشخصات ستون را باید وارد کنیم:

create new column in database

create new column in database

برای فیلد Column name مقدار (نام) دلخواه id و Data type را از نوع INTEGER انتخاب کردم. با نوع داده ها قبلا آشنا شده اید. شناسه از نوع اعداد صحیح بوده و بنابراین می بایست نوع integer را انتخاب کنیم.
نکته : اگر لازم است بیشتر در مورد نوع داده ها بدانید با یک جستجو در وب به پاسخ های زیادی می رسید. جستجو در وب و یا به اصطلاح سرچ، سلاح همیشه همراه برنامه نویسان، توسعه دهندگان و طراحان وب است! حتی حرفه ای ترین افراد هم در زمان کار روی پروژه های خود نیاز به سرچ دارند. همیشه جزئیاتی هستند که به علت حجم بالای اطلاعات از ذهن انسان پاک شده و نیاز به مرور دارد. در بیشتر موارد رجوع به وب سریعتر شما را به نتیجه می رساند تا گشتن در میان داکیومنت ها و ویدئوهای آموزشی که روی حافظه رایانه خود دارید. به عنوان مثال برای مورد بالا با جستجوی “Data types in Database”، “Data types in SQL”، “Data types in SQlite”، “انواع داده ها در SQL”، “انواع داده ها در دیتابیس”، “انواع داده ها در برنامه نویسی” و … به نتایج خوبی می رسید که در عرض چند دقیقه با مطالعه ۲ یا ۳ مطلب پاسخ های مناسبی دریافت می کنید. عمدا تمام مواردی که برای جستجو در این خصوص به ذهنم رسید را لیست کردم تا تصور نکنید عبارت جستجوی شما باید خیلی سنجیده و مشخص باشد. ضمن اینکه در دنیای نرم افزار، مشابهات زیاد هستند و نیاز به جستجوی تخصصی در همه موارد نیست. برای مثال بعد از جستجو در خصوص “انواع داده ها” نیاز نیست حتما به دنبال مقاله ای بگردید که انواع داده ها را در دیتابیس و در SQLite شرح داده باشد چون داده ها در تمامی زمینه ها کاربرد یکسانی دارند ( یعنی Integer در Java، C++، PHP، SQL و… مفهوم یکسانی دارد).
خب، از آنجایی که id ستون اصلی دیتابیس ماست با ویژگی هایی که در پاراگراف قبل اشاره کردم (افزایشی و غیر قابل تکرار) گزینه Primary Key را انتخاب می کنم:

Primary Key

دکمه Configure برای این گزینه فعال شد. روی دکمه کلیک می کنم. گزینه اول Auto increment است که به معنی افزایش خودکار می باشد. شناسه هم باید این ویژگی را داشته باشد تا با اضافه شدن هر سطر از اطلاعات جدید، یک رقم به رقم شناسه قبلی به صورت خودکار اضافه شود. انتخاب کرده و Apply می کنم:

Auto increment

ویژگی دیگری که برای شناسه نام بردم یکتا بودن و تکراری نبودن شناسه ها بود. بنابراین گزینه Unique به معنی یکتا را انتخاب و OK می کنم.

Unique column

مشاهده می کنید ستون id با موفقیت به جدول اضافه شد:

SQLite Database in android

البته من هنوز تغییراتم را ذخیره نکرده ام (گزینه Commit structure changes). مابقی ستون های مدنظرم را نیز اضافه می کنم. من چند ستون دیگر با عنوان نام، نام خانوادگی، سن و تلفن تماس مدنظر دارم که آنها را نیز اضافه می کنم.

Add Database columns

من name را از نوع VARCHAR تعریف کردم. VARCHAR مانند TEXT مقادیر رشته ای می پذیرد اما در موارد مانند نام و … که تعداد کاراکتر محدودی توسط کاربر وارد می شود، بهتر است این نوع را انتخاب کنیم. نوع VARCHAR نسبت به TEXT فضای کمتری اشغال می کند. نوع TEXT برای رشته های طولانی مانند جملات و پاراگراف ها مناسب است. سایر گزینه ها را دست نخورده باقی می گذارم. به همین ترتیب برای نام خانوادگی یک ستون با نام family می سازم. ستون بعد سن، با نام age و از نوع INTEGER تعیین می کنم. آخرین ستون تلفن تماس بوده که منطقا باید از نوع INTEGER تعریف شود اما چون در داده های عددی، صفر اول نادیده گرفته می شود و یا ممکن است کاربر تلفن خود را به صورت ۹۸۹۱۵۸۸۸۸۸۸۸+ وارد کند که کاراکتر اول آن غیر عددی است، از نوع VARCHAR و با نام tel انتخاب می کنم.

Add Database columns

مشاهده می کنید ستون ها با نام id، name، family، age و tel لیست شده اند. با دوبار کلیک روی هرکدام می توانید تغییراتی اگر نیاز بود را اعمال کنید. در نهایت با گزینه تیک سبز رنگ، مواردی که اضافه کردم را تایید می کنم (توجه داشته باشید بعد از تایید نهایی هم می توان تغییرات احتمالی را روی ستون ها اعمال کرد و یا ستون جدید به جدول اضافه و یا ستونی را حذف نمود).
با زدن گزینه تیک سبز رنگ، قبل از اعمال تغییرات، دستور یا Query مربوط به تغییراتی که قصد اعمال آنها را داریم نمایش داده می شود:

Database Query

توضیح : Query (کوئری) در زبان فارسی با عنوان “پرس و جو” نیز شناخته می شود. کلیه اعمال مربوط به دیتابیس توسط کوئری ها انجام می شود.
این دقیقا همان چیزی است که در اندروید با آن سروکار داریم. Query را بخوانید. خیلی واضح است چه کارهایی قرار است روی دیتابیس ما انجام شود.
CREATE TABLE tbl_info: ساخت جدولی با نام tbl_info
دستورات مربوط به ستون های جدول نیز درون () قرار گرفته اند که هر خط نشان دهنده یک ستون است. دقیقا با همان تنظیماتی که مدنظر بود. یعنی ستون id از نوع INTEGER، PRIMARY KEY، AUTOINCREMENT و UNIQUE می باشد. هر کدام از ویژگی ها با یک فاصله از ویژگی قبلی جدا شده و هر ستون با یک ویرگول. لازم به ذکر است که در دستورات SQL تعداد فاصله ها، کوچک بودن یا بزرگ بودن حروف (بجز در نامگذاریها) و همچنین قرار گیری هر دستور در یک خط جداگانه یا پشت سر هم اهمیتی نداشته و صرفا به جهت خوانایی بهتر SQLiteStudio آنرا به صورت تفکیک شده و زیر هم نمایش داده است.
من Query را تایید کردم. جدول tbl_info به همراه ستون های آن با موفقیت ایجاد شد که در تب Structure نمایش داده شده و در کادر Status نیز پیغام موفقیت آمیز بودن تغییرات را دریافت کردم:

Table created

در تب DDL نیز همواره به Query نهایی ساختار دیتابیس خود دسترسی دارید و هرگاه که تغییری در ساختار جدول ایجاد کنید، این کد نیز بروز می شود:

کوئری دیتابیس

حالا قصد دارم اطلاعات چند شخص را وارد دیتابیس کنم. در برگه Data با زدن گزینه + سبز رنگ (و یا کلید insert کیبورد)، یک ردیف با مقادیر پیش فرض NULL (به معنی تهی) در ستونها ایجاد می شود که آماده وارد کردن اطلاعات است:

insert data to database

ستون id را به صورت Auto increment تعیین کرده بودیم پس من مقدار آن را همان null و دست نخورده باقی می گذارم و سراغ ستون های بعدی می روم. با کلید tab به راحتی می توانید بین ستون ها جابجا شوید و مقادیر را وارد کنید. من ۳ ردیف اطلاعات وارد کردم:

Data inserted

با Commit کردن تغییرات (گزینه تیک سبز رنگ) اطلاعات ثبت می شود:

Data Commited

نکته : در روش وارد کردن اطلاعات در محیط گرافیکی مانند SQLiteStudio، با وجود VARCHAR یا TEXT بودن نوع داده باز هم صفر اول اعداد حذف می شود که برای ما مهم نیست و در ادامه که اطلاعات را از طریق کوئری اضافه کنیم این مشکل رفع می شود.
حالا می خواهم کوئری های اصلی و ضروری را روی این دیتابیس اجرا کنم. کوئری های Insert، Update، Select و Delete.
در قدم اول قصد دارم مشخصات یک شخص را بجای استفاده از محیط گرافیکی، از طریق کوئری insert وارد جدول کنم. Syntax دستور insert به اینصورت است:


INSERT INTO table_name (column1, column2, column3,...columnN) VALUES (value1, value2, value3,...valueN);

 

قسمت دوم ( کار با دیتابیس در اندروید ):

خب! حالا سراغ اندروید استودیو و ساخت پروژه جدید اندرویدی می رویم. من یک پروژه جدید با نام Database و با API Level 10 و یک اکتیویتی از نوع Empty Activity ایجاد کردم که در زمان تهیه این آموزش، آخرین API یی هست که بنا به اطلاعات گوگل، از ۱۰۰% دیوایس ها پشتیبانی می کند.

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

همانطور که در تصویر مشاهده می کنید پوشه های AndroidTest و Test درون پوشه Java را حذف کرده ام. در این پروژه من نیازی به این پوشه ها ندارم (اگر با یک بار انتخاب پوشه ها و delete کردن، کاملا حذف نشد مجدد پوشه ها را انتخاب و delete کنید).
پروژه را در قالب یک اپلیکیشن کاربردی پیش می بریم. یک واحد تولیدی را در نظر می گیریم که تمامی پرسنل آن، یک شماره پرسنلی اختصاصی بر روی لباسشان درج شده و مدیر واحد قصد دارد روی موبایل اندرویدی خود، اپلیکیشنی داشته باشد که بتواند اطلاعات کامل کارکنان را ثبت و در مواقع لازم با وارد کردن کد پرسنلی درج شده بر روی لباس پرسنل، به مشخصات وی دسترسی داشته باشد. البته مدنظرتان باشد پروژه ای که در این آموزش می سازیم با اپلیکیشنی که در دنیای واقعی تحویل مشتری داده می شود تفاوت بسیاری دارد و من از مواردی مثل طراحی استاندارد ظاهر برنامه و رعایت حداکثری استانداردها در کد نویسی (مانند فرخوانی رشته های متنی از strings.xml و…) به جهت خلاصه شدن مبحث خودداری می کنم.
در قدم اول اجزای رابط کاربری را در اکتیویتی MainActivity قرار می دهم که به راحتی ویجت ها را از Palette به روی اکتیویتی کشیده و رها می کنم. ویجت های مدنظر من شامل سه EditText و چهار Button هستند که از EditText ها برای دریافت و یا نمایش و Button ها برای ثبت، نمایش، بروزرسانی و حذف اطلاعات استفاده خواهد شد. البته که بهتر بود برای نمایش اطلاعات به صورت جداگانه از TextView استفاده می شد اما هدف ما در این مبحث صرفا آشنایی با دیتابیس است و هرچه خلاصه تر باشد درک آن نیز ساده تر خواهد بود. در حالت Design هم می توان ویجت ها را به تعداد مورد نیاز کپی کرد. کافیست ویجت مدنظر را انتخاب کرده، Copy و Paste نمایید (و یا ساده تر، کلید های ترکیبی Ctrl+C و Ctrl+V). ممکن است در مواردی از جمله در RelativeLayout ها هنگام ایجاد کپی از یک ویجت، در قسمت پیش نمایش گرافیکی تغییر را مشاهده نکنید که لازم است ویجت جدید را از روی ویجت قبل جابجا کنید (لیست ویجت ها در قسمت Component tree قابل مشاهده است).
دو EditText نام و نام خانوادگی را از نوع معمولی و EditText مربوط به شماره پرسنلی را از نوع Number انتخاب کردم:

MainActivity

MainActivity

سورس activity_main.xml :


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="ir.android_studio.database.MainActivity">

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:ems="10"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:padding="10dp"
        android:id="@+id/edt_name"
        android:background="#5b5151"
        android:hint="نام" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="textPersonName"
        android:ems="10"
        android:layout_below="@+id/edt_name"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="14dp"
        android:padding="10dp"
        android:id="@+id/edt_family"
        android:background="#5b5151"
        android:hint="نام خانوادگی" />

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="number"
        android:ems="10"
        android:layout_below="@+id/edt_family"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="14dp"
        android:padding="10dp"
        android:id="@+id/edt_id"
        android:background="#5b5151"
        android:hint="شناسه پرسنلی" />

    <Button
        android:text="ذخیره"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/edt_id"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_marginTop="19dp"
        android:id="@+id/btn_insert" />

    <Button
        android:text="نمایش"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/btn_insert"
        android:layout_toLeftOf="@+id/btn_insert"
        android:layout_toStartOf="@+id/btn_insert"
        android:id="@+id/btn_view" />

    <Button
        android:text="بروزرسانی"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/btn_view"
        android:layout_toLeftOf="@+id/btn_view"
        android:layout_toStartOf="@+id/btn_view"
        android:id="@+id/btn_update" />

    <Button
        android:text="حذف"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignTop="@+id/btn_update"
        android:layout_toLeftOf="@+id/btn_update"
        android:layout_toStartOf="@+id/btn_update"
        android:id="@+id/btn_delete" />

</RelativeLayout>

من در مجموع سه ویجت از نوع EditText و با id های edt_name، edt_family، edt_id و چهار Button با id های btn_insert، btn_view، btn_update و btn_delete ایجاد کردم که کاربرد هرکدام از نام آن مشخص است. سعی کنید نامگذاری (در xml و java و…) را با الگوی مشخص و معنی دار انجام دهید تا در حین تکمیل پروژه کمترین اشتباه را داشته باشید.
در قدم بعد و در کلاس MainActivity.java به تعداد نیاز چند نمونه از کلاسهای EditText و Button می سازم:


package ir.android_studio.database;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    EditText edtName, edtFamily, edtID;
    Button btnInsert, btnView, btnUpdate, btnDelete;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

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


package ir.android_studio.database;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends AppCompatActivity {

    EditText edtName, edtFamily, edtID;
    Button btnInsert, btnView, btnUpdate, btnDelete;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        edtName = (EditText) findViewById(R.id.edt_name);
        edtFamily = (EditText) findViewById(R.id.edt_family);
        edtID = (EditText) findViewById(R.id.edt_id);
        btnInsert = (Button) findViewById(R.id.btn_insert);
        btnView = (Button) findViewById(R.id.btn_view);
        btnUpdate = (Button) findViewById(R.id.btn_update);
        btnDelete = (Button) findViewById(R.id.btn_delete);

    }
}

خب! فعلا کار ما با اکتیویتی تمام شد. حالا باید یک دیتابیس بسازیم، یک جدول درون دیتابیس ایجاد کنیم و متدهای مربوط به اعمال ذخیره، نمایش، بروزرسانی و حذف اطلاعات را بنویسیم.
اندروید یک کلاس کمکی با نام SQLiteOpenHelper تهیه کرده که برای مدیریت دیتابیس بکار می رود. من یک کلاس جاوا با نام دلخواه DatabaseManager به پروژه اضافه می کنم. به این منظور درون پوشه java و روی نام پکیج (ir.android_studio.database) راست کلیک کرده، گزینه New سپس Java Class و درون پنجره باز شده، نام کلاس را وارد می کنم:

ساخت کلاس جاوا

Visibility کلاس می بایست public باشد که در حالت پیش فرض همین نوع انتخاب شده و در نهایت OK می کنم:

DatabaseManager Class

کلاس DatabaseManager.java به پروژه اضافه شد. کامنت بالای کلاس را حذف می کنم. توجه داشته باشید لزوما همه اخطارهایی که اندروید استودیو اعلام می کند به معنی خطا نیست. در تصویر بالا زیر DatabaseManager خط کشیده شده که با نگه داشتن نشانگر روی آن، پیغام اخطار نمایش داده می شود که Class ‘DatabaseManager’ is never used هست، یعنی این کلاس هیچ کجای پروژه استفاده نشده که مشکلی نیست. ضمن اینکه خطاها با رنگ قرمز مشخص می شوند. حالا کافیست این کلاس از کلاس SQLiteOpenHelper ارث بری کند تا بتوانیم دیتابیس را مدیریت کنیم. یعنی کلاس DatabaseManager را extends می کنیم به SQLiteOpenHelper:


package ir.android_studio.database;


import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseManager extends SQLiteOpenHelper {
    
}

در واقع DatabaseManager یک SubClass (زیر کلاس) از SQLiteOpenHelper است. مشاهده می کنید با انجام عمل ارث بری، android.database.sqlite.SQLiteOpenHelper به صورت خودکار import شد (اگر ایمپورت انجام نشد پیغام مربوطه را مشاهده می کنیم که با زدن Alt+Enter ایمپورت صورت می گیرد). حالا یک ارور داریم:

متد SQLiteOpenHelper

با بردن نشانگر روی بدنه کلاس متن ارور نمایش داده می شود با این مضمون که متد onCreate() باید به این کلاس اضافه (یا اصطلاحا implement) شود. با کلیک روی آیکون لامپ قرمز یا زدن Alt+Enter متدهای لازم را می توان به صورت خودکار اضافه کرد و نیاز به نوشتن دستی آنها نیست:

متد OnCreate

متد OnCreate

در این پنجره دو متد onCreate() و onUpgrade وجود دارد که به صورت پیش فرض هردو انتخاب شده هستند و من هر دو را تایید می کنم:


package ir.android_studio.database;

import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseManager extends SQLiteOpenHelper {

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
        
    }
}

دو متد با پارامتر ورودی SQLiteDatabase و نام sqLiteDatabase داخل کلاس ایمپلمنت شد. متد onCreate() برای ساخت جدول دیتابیس و متد onUpgrade() برای بروزرسانی ساختار جدول (حذف یا اضافه کردن ستون) بکار می روند.
اما هنوز اندروید استودیو برای این کلاس یک ارور دیگر نمایش می دهد:


There is no default constructor available in 'android.database.sqlite.SQLiteOpenHelper'

یعنی کلاسی که از SQLiteOpenHelper مشتق (ارث بری) شده، علاوه بر دو متد فوق، به یک سازنده (Constructor) نیز نیاز دارد که عمل ایجاد فایل دیتابیس توسط سازنده صورت می گیرد:

متد سازنده SQLiteOpenHelper

متد سازنده SQLiteOpenHelper

دو گزینه برای انتخاب داریم که اندروید استودیو گزینه اول را انتخاب کرده و من هم همین سازنده را تایید می کنم. سازنده دوم یک error Handler اضافه دارد که مورد نیاز ما نیست.
محتوای فعلی کلاس:


package ir.android_studio.database;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseManager extends SQLiteOpenHelper {

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

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {

    }
}

توجه : سورس پروژه به همراه فایل آموزشی داخل پوشه Exercises قرار داده شده است.

جهت مطالعه ادامه آموزش، فایل PDF را دانلود نمائید.

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

در صورتی که در پرداخت سبد خرید زیر با مشکل مواجه شدید، با مراجعه به این لینک مشخصات خود را به همراه مبلغ ۶۰۰۰ تومان ثبت نمایید.

دانلود فایل آموزشی با فرمت PDF به همراه سورس پروژه
تعداد صفحات : ۸۲
حجم : ۳ مگابایت
قیمت : ۶۰۰۰ تومان