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

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

به احتمال زیاد با واژه دیتابیس آشنایی دارید. به طور خلاصه، ذخیره و بازیابی اطلاعات مورد نیاز هر برنامه و نرم افزار توسط پایگاه داده یا Database صورت می‌گیرد که این دیتابیس می‌تواند به صورت محلی (local) و یا آنلاین و از طریق سرورها و به واسطه شبکه اینترنت در دسترس کاربران قرار گرفته و مورد استفاده واقع شود. در این فصل به بررسی نحوه پیاده سازی و کار با دیتابیس در اندروید می پردازیم که شامل مباحث زیر می باشد.

آنچه در این آموزش می‌خوانید:

  • آشنایی با مفهوم دیتابیس و 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) {

    }
}

بروزرسانی:

در نسخه‌های جدید اندروید استودیو برای باز کردن File Explorer از مسیر View > Tool Windows > Device File Explorer اقدام کنید:
Device File Explorer نسخه جدید اندروید استودیو

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

توجه : سورس پروژه داخل پوشه Exercises قرار داده شده است.

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

دانلود نسخه کامل این آموزش به همراه سورس پروژه
تعداد صفحات : ۸۲
حجم : ۳ مگابایت
قیمت : ۲۳ هزار تومان
توجه: صرفا در صورتی از درگاه پشتیبان استفاده کنید که قادر به پرداخت از طریق سبد دانلود نباشید.
افزودن به سبد دانلود درگاه پشتیبان
برچسب ها :
این مطلب چقدر برایتان مفید بود؟ لطفا امتیاز دهید
4.2/5 - (29 امتیاز)
پرسش‌ها و دیدگاه‌های کاربران
دوره آموزش برنامه نویسی اندروید
دوره آموزش برنامه نویسی اندروید

با دریافت این دوره به تمامی آموزش‌های غیر رایگان و رایگان موجود در وب سایت دسترسی دارید که تخفیفی برای آموزش‌های غیر رایگان نیز درنظر گرفته شده. این پکیج به دو صورت دانلودی و ارسال پستی ارائه می‌گردد.
آموزش‌های اندروید استودیو در دو دسته «پایه» و «تکمیلی» منتشر می‌شوند.
آموزش‌های پایه شامل مباحث اصلی و ضروری و آموزش‌های تکمیلی مطالبی است که می‌بایست در کنار مطالب اصلی بررسی شود.
با خرید این دوره، به تمامی آموزش‌های غیر رایگانی که در آینده منتشر می‌شود نیز به صورت رایگان دسترسی خواهید داشت!

یک دیدگاه بنویسید

پرسش‌های زیر تایید و پاسخ داده نـــخواهند شد:
۱: جزء موارد مطرح شده در صفحات مشکلات و پرسش‌های رایج و بروزرسانی‌های محتوای آموزشی باشد
۲: سوال قبلا توسط کاربران در دیدگاه‌ها مطرح و پاسخ داده شده باشد
۳: پرسش خارج از مبحث آموزشی موجود در این صفحه باشد

  • مهدی گفت:

    سلام
    من یه دیتابیس خارجی دارم با یه تعداد ردیف (مثلا ۲۰۰ تا) که از پوشه assets کپی می کنم داخل گوشی کاربر. توی این دیتابیس یه ستون برای علاقه مندیها هست که توسط کاربر تغییر می کنه. حالا سوال اینه که چطور در ورژنهای بعدی دیتابیس که مثلا چندین ردیف دیگه به اطلاعاتم اضافه کردم:
    ۱-هم بتونم اون ستون علاقه مندیهای کاربر رو حفظ کنم و
    ۲- هم این که دیتابیس جدید رو جایگزین قدیمی بکنم.

  • milad گفت:

    سلام و درود
    من برنامه SQLiteStudio که ظاهرا رایگان هست رو دانلود کردم.توی چنین برنامه ای حداکثر چند تا ستون یا ردیف میشه ایجاد کرد؟چون من می خوام یه کتاب قوانین درست کنم نیاز هست زیاد ردیف بسازم.ممنون بابت سایت خوبتون

  • yazdan گفت:

    سلام و احترام و تشکر بابت سایت خوبتون یک سوال داشتم که خیلی ممون میشم راهنمایی بفرمایید من اگر بخوام یک دیتا بیس خارج از اپ لیکیشن داشته باشم که تمام کاربرا که اپ اندرویدی دارند بهش وصل بشن و تغیرات اعمال کنند نیاز به چه چیزهایی دارم ؟به ذهن خودم این جوری باید باشه که:۱) نیاز به یک وب سرویس هست توی بعضی اموزش های ویدیویی با زمپ این کارو کردم اما من درک نکردم اگر بخوام تو حالت واقعی این کارو بکنم نیاز به چه چیزایی دارم مثلا نمیدونم باید یک سرور به صورت سالانه اجاره کنم و ۲)در کنارش هم باید یک دیتا بیس مثلا mssql یا mySql باید داشته باشم یا اصلا خود اسکیوال لایت این قضیه را ساپرت میکنه هر چقدر هم که میگردم بازم تهش منتهی میشه به زمپ یا ومپ که داخلشون یه سرور آپاچی هست و دیتا بیس مای اسکیوال ولی من نیاز به یک دیتا بیس واقعی و اعمال تغیرات واقعی از سوی هر کاربر را دارم خیلی ممنون میشم راهنمایی بفرمایید و اگر لینک اموزشی (چه آموزش های خودتون و چه سایت دیگه )دارید جهان سپاس.🙏🏽🙏🏽

    • سیدمهدی مطهری گفت:

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

  • Mhsn گفت:

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

  • Mhsn گفت:

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

  • امین قاضی مرادی گفت:

    سلام
    استاد آموزش دیتابیس Room رو هم قرار بدین جاش خالیه

  • behnood گفت:

    سلام. من خیلی به برنامه نویسی آشنایی ندارم، سوالم اینه ممنون میشم راهنماییم کنید:
    من یه جدول دارم شامل ۱۰۰ تا خودرو که میخوام به همراه اسم مالکشون و شماره موبایلشون اگر بشه بصورت یک اپ اندروید دربیارم.
    آیا برنامه ای هست که با کمترین دانش حوزه برنامه نویسی وبیشتر با آبجکتها بتونم این اپ رو عملیاتی کنم؟
    سپاس از لطفتون.

  • فرزاد عسکری گفت:

    سلام مهندس/بنده آموزش رو تمام کردم و در آخر پروژه می خواستم برنامه رو اجرا کنم/ اجرا نمی شه و متوقف میشه و این ارور رو میده
    E/AndroidRuntime: FATAL EXCEPTION: main این عکس ها رو هم بی زحمت ببینید:
    https://s4.uupload.ir/files/screenshot_2021-07-30_073543_k37z.png
    https://s4.uupload.ir/files/screenshot_2021-07-30_073855_d4zj.png
    و در قسمت Logcat چیزی بالا نمی آد.

    • سیدمهدی مطهری گفت:

      ظاهرا تو تعریف ویجت ها از جمله TextView اشتباهی رخ داده. تو اسکرین شات اول دو قسمت که لینک آبی هست و به خط های ۱۰۷ و ۳۳ اشاره کرده. بررسی کنید این دو خط رو

      • فرزاد عسکری گفت:

        ممنون/مشکل ارتباط ندادن txt_count با txtCount بود/
        در قسمتی از آموزش گفته بودید(شاید مایل باشید به فایل دیتابیسی که روی دیوایس ساخته شده دسترسی داشته باشید) در ورژن جدید جای Android Device Monitor عوض شده و به تب View رفته، لطفا پروژه رو بروز کنید تا بقیه به مشکل نخورن/

    • طیب گفت:

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

      • سیدمهدی مطهری گفت:

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

  • وحید گفت:

    سلام
    میشه منبعی برای استفاده از foreign key و ارتباط دو جدول بزارید یا بخشی از آموزش را به این مبحث اختصاص بدین
    ممنون

  • Babak Kh گفت:

    سلام چجوری میتونیم با یه دیتابیس SQLite ک ساختیم و وجود داره و اطلاعات توش ذخیره شده برای پر کردن Spinnerو List View استفاده کنیم و برای ذخیره تو یه table دیگ Id ها رو از اون بگیرم

  • مدرس گفت:

    با سلام من تدریس می کنم آیا بعد از خرید اجازه دارم از روی pdf ها آموزش دهم؟؟؟

    • سیدمهدی مطهری گفت:

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

  • رامین میرزایی گفت:

    سلام وقتتون بخیر
    من برنامه رو که مینویسم تمام قسمت ها کار میکنه به جز نمایش
    برنامه رو میبنده ممنون میشم راهنمایی کنید

  • omid nami گفت:

    سلام
    من ممیخوام جنتا جدول ایجاد کنم نمیشه
    تا ۲ تا جدول ایجاد میکنم ولی سومیرو نمیسازه
    اینو میدونم که یه کلاس باید بسازم و جداولی که نیاز دارمو تو همون کلاس بسازم که هنگام اجرا برنامه جداولمو بسازه اما دوتا میسازه

    • omid nami گفت:

      با کمی تغییرات مشکل بر طرف شد…
      یک کلاس ساختم به نام database که از sqliteopenhelper ارثبری میکنه و اومدم دستورات ساخت جداولمو بهش دادم
      بعد برای هر جدول یه کلاس جدا با همون قوانین ارثبری برای select insert delet ساختم….
      ——————————————————————————————
      من برنامه نویس php هستم و تو mvc سمت ,وب ما میایم یک کلاس تعریف میکنیم که کل کارا دیتا بیس و خودش انجام میده یعنی نام جدول و دیتا هارو بهش پاس میدیم. میخام ببینم با جاوا و اندروید استادیو میشه همچین کاری کرد…. یعنی یه کلا بسازیم برای ایجاد جداول و یه کلاس برای مدیریت کل جداول به جای اینکه برای هر جدول یه کلاس تعریف کنیم.

  • محمد گفت:

    با سلام و خسته نباشید.
    می خواستم بپرسم که آیا با این کلاس SqlLiteOpenHelper که معرفی کردید، می شه دیتابیس پسوورد دار ساخت؟

    یعنی در ابتدای Create کردن دیتابیس، یک رمز عبور برای ورود بهش ست بشه.
    حتی وقتی که توسعه دهنده می خواد در محیط ویندوز یا Database Viewer ، پایگاه دادشو باز کنه.

    • سیدمهدی مطهری گفت:

      در این مورد اطلاعی ندارم عزیز

    • omid nami گفت:

      Sqlite یک دیتا بیس کم حجم محلی میباشد که معمولا روی دیوایس های شخصی مثل موبایل و تبلت نصب میشه…
      من پیشنهاد میکنم برای ویندوز از sqlserver
      برای لینوکس از mysql
      برای موبایل از sqlite استفاده کنید و بعد اگه نرم افزارتون انلاین و یا تو یه شبکه محلیه با json اطلاعاتو بین هم دیگه رد و بدل کنید.
      برای ایجاد رمز و دسترسی ها هم داخل برنامه اقدام کنید…
      البطه این روشیه که من انجام میدمو تا الان موفق بوده

  • داود گفت:

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

  • livant گفت:

    سلام. ببخشید ولی باید یه انتقادی بکنم.
    من فکر می‌کنم زبان تخصصی شما جاوا نبوده چون اصطلاحات رو کاملا در جای اشتباه به کار می‌برید مثلا به کلاس میگید متد! در این مورد لطفا بیشتر دقت کنید. از منابع خیلی فوق‌العاده برای افرادی که می‌خوان برنامه نویسی رو با اندروید و جاوا شروع کنن، سایت جاواکاپ آموزش های جاوای عالی داره که خیلی کمک به من کرد.
    و مسئله بعدی اینکه واقعا اصلا مفهومی آموزش نمیدید. یعنی دارید برنامه نویسی رو حفظی آموزش میدید! مثلا من اصلا نفهمیدم Cursor چه کلاسیه و چیکار میکنه و این متد هایی ازش فرا خوندیم چین. چون که فقط گفته بودید اگه روی Cursor متد getCount رو بزنید تعداد سطر هارو میده حالا برید این کد رو حفظ کنید! همچنین در مورد Content values و آرایه هایی که پاس کردیم به متد ها توضیح مفهومی نبود.
    البته من از خریدم راضی هستم ولی اینا خیلی آزاردهنده‌س.

    • سیدمهدی مطهری گفت:

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

      • livant گفت:

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

  • علی حسامی گفت:

    سلام ببخشید من داشتم طبق اموزش شما پیش میرفتم فقط اسما یکمی تفاوت دارند ولی به این ارور رسیدم
    http://s10.picofile.com/file/8392935842/Untitled.png

  • مجتبی اصفهانی گفت:

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

    • سیدمهدی مطهری گفت:

      شرمنده که با تاخیر جواب میدم سوالتون رو. بستن یا نبستن دیتابیس خیلی اهمیتی نداره در حالت عادی. یه گزینه بهتر میتونه این باشه که دیتابیس فقط داخل متد onDestroy اکتیویتی close بشه. یعنی با متوقف شدن اکتیویتی، کانکشن دیتابیس هم بسته بشه

  • mahala گفت:

    با سلام و خسته نباشید
    آقای مهندس بنده به تازگی وارد این حوزه شده ام و میخواستم ببینم برای نوشتن اپ هایی که هر منو زیرمنوی دیگری دارد نیز به یک جدول نیاز است؟ بطور مثال یک کتابخانه. که وقتی بر روی نام کتاب کلیک کنیم فصلها ظاهرشود و سپس با کلیک بر روی هر فصل زیربخش دیگری باز شود

  • شهریار گفت:

    جناب مطهری من همه مراحل رو طی کردم و کدها رو چندبار مرور کردم همه چی اوکیه اما وقتی اپ رو ران میکنم هم توی emulator و هم روی دیوایس واقعی , وقتی روی دکمه ذخیره کلیک میکنم اپ استاپ میشه. توی android divice manager که چک کردم ظاهرا اصلا جدول م ساخته نشده. این مشکل ساخته نشدن جدول رو چطوری حل کنم؟

    سپاس

  • شهریار گفت:

    درود
    میشه لینک دانلود sqlitestudio رو بزارید….
    اینترنت ملی هست دسترسی به گوگل ندارم… موتورهای وطنی هم که افتضاح ن….

    ممنون میشم لینک رو بزارید

    • سیدمهدی مطهری گفت:

      خدمت شما (سرور ایران)
      http://dl2.android-studio.ir/utility/InstallSQLiteStudio-3.2.1.exe

      • شهریار گفت:

        سپاس بیکران جناب مطهری….
        اقا یه سوال دیگه هم دارم خدمتت….
        واسه لپ تاپی که بشه باهاش اندروید استودیو را به راحتی کار کرد, فقط رم و سی پی یو رو در نظر بگیریم؟
        میشه یه راهنمایی بکنید که چه سیستمی رو بخریم؟ ( اگر یک مشخصات متوسطی رو بگید ممنون میشم.)

  • باران گفت:

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

  • سالار گفت:

    سلام اگه بخوایم از عکس توی پایگاه داده استفاده کنیم باید چیکار کنیم؟ممنون

  • زهرا گفت:

    سلام
    ببخشید برای نمایش لیست محصولات در اپلیکیشن فروشگاه آنلاین از sql باید استفاده کنیم؟ به چه صورت میتونم اینکارو بکنم؟

    • سیدمهدی مطهری گفت:

      خیر لیست و مشخصات محصولات رو باید از سرور دریافت کنید نه دیتابیس محلی. مبحث وب سرویس رو مطالعه بفرمایید:
      https://android-studio.ir/web-service/

  • vahid گفت:

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

  • عمو جلال گفت:

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

  • محسن گفت:

    سلام.وقتتون بخیر.
    من همه مراحل رو انجام دادم.وقتی همه تکست ویوها رو پر میکنم و دکمه ذخیره رو میزنم برنامه میپره بیرون.اروری هم ک داخل لاگ میده failed bineder transaction هست.

  • ehsan گفت:

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

  • حسین گفت:

    سلام من پروژه کار با sqllite را خریداری کردم ولی الان پروژه با اندروید ۳٫۳٫۱ بیلد نمی شود چطور می توانم پروژه را با گریدل بالاتر بیلد کنم

  • Masoud Sky گفت:

    با سلام
    دیتابیس من نمایش داده نمیشه (داخل دیواس واقعی)
    چطور میتونم فایلی که ایجاد شده رو ببینم؟
    همچنین قسمت نمایش واسه من کار نمیکه!!!

  • shokoo گفت:

    سلام و درود… ممنون از اموزش های خوبتون.
    در این فایل ، وارد کردن نام و رمز ورود توسط کاربر و بررسی درست یا اشتباه بودن آن هنگام ورود انجام میشه؟

  • بابایی گفت:

    سلام وقتتان بخیر
    من احتیاج دارم که فایل dbبهjsonتبدیل کنم با نرمافزاررDB Browser for SQLiteامکان داره دوستان راهنمایی لازم رو برام ارسال کنند .ممنونم

  • arianhosseini گفت:

    با سلام ببخشید
    یک سوال دارم

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

    توی این اموزش شما درباره ی گذاشتن صفحه ورود و ثبت نام صحبت کردید که کاربر اطلاعاتش را وارد کنه. ذخیره کنه , درسته؟؟

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

    اگه میشه لطفا کنید راهنمایی کنید

    من دقیقا نمی دونم!!

    • سید مهدی مطهری (مدیر) گفت:

      خیر این دو مسئله ارتباطی به هم نداره. اینجا اطلاعات روی دیتابیس داخلی نرم افزار (روی دیوایس) ذخیره میشه ولی در وب سرویس، تبادل و ذخیره اطلاعات روی سرور انجام میشه

  • میثم عباسی گفت:

    با سلام
    امکانش هست نحوه ی نمایش دیتا بیس روی یک لیست ویو رو آموزش بدید مثلا نمایش یک لیست از اسامی ذخیره شده در دیتا بیس رو در لیست ویو با تشکر

  • سید آرین حسینی گفت:

    با سلام و عرض ادب

    ی سوال داشتم

    بعد از خرید آموزش و انجام کلیه کار ها

    می تونم یک صفحه برای ثبت نام و ورود کاربران در اپلیکیشن قرار بدم ، و اونها با اتصال به اینترنت وارد حساب کاربریشون بشن یا و ثبت نام کننن و البته تمامی کارهایی که در برنامه ذخیره می کنن و بعد خارج میشن و وارد میشن بتونن همون اطلاعات (مثال : لیست علاقه مندی و… ) ها رو دوباره ببینن.

    ممنون میشم راهنمایی کنید

    تشکر….

  • حمید گفت:

    سلام
    من یه مشکل عجیب واسم پیش اومده ممنونم کمک کنید:
    من متن چند پاراگرافی رو داخل دیتابیس ذخیره کردم به صورت دستی وارد میکنم ولی داخل برنامه مشکل تشخیص سطر داره مثلامتن اصلی اینه:

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

    ولی ایجوری داخل تکس ویو نشون داده میشه:

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

    چطور حلش کنم ؟

  • رضا گفت:

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

  • جواد گفت:

    یه سوال در مورد خود دیتا بیس دارم
    برای اینک اپلیکیشن داده هاش رو از رو دیتا بیس بخونه باید به نت وصل باشه؟؟

  • پارسا اصفهانی گفت:

    استاد گفته بودید برای اینکه ببینیم دیتابیس ساخته شده یا نه بریم تو قسمت tool –> Android –> android device monitor ولی اندروید استودیو من آخرین ورژنه فرق داره. تو قسمت tools اصلا android نداره و همین طور device monitor. میشه بگید این دیتا بیسی که ساختیم تو کجا ذخیره میشه

  • shahram mokhbery گفت:

    با سلام
    لطفا مباحث دیتا بیس رو افزایش دهید
    شامل دیتا بیس بصورت اینترنتی mysql و php

  • کاربر گفت:

    ارورها رو بررسی کردم وقتی ذخیره میکنم می نویسه اطلاعات ذخیره شد ولی تو قسمت لاگ می نویسه:
    table tbl_person has no column named name
    Mahdi: Table Create
    Mahdi: Data inserted
    و وقتی حذف رو میزنم می نویسه:
    no such column: id

  • کاربر گفت:

    سلام.همه ی مراحلی که آموزش دادید رو انجام دادم ولی وقتی برنامه رو اجرا میکنم ذخیره رو انجام میده ولی نمایش و بروزرسانی و حذف رو انجام نمیده و برنامه بسته میشه و از برنامه میاد بیرون.نمیدونم دلیلش چیه لطفا راهنمایی نمایید.
    بخش android device monitor اول ارور میداد ولی با این که ارورش رو برطرف کردم اصلا صفحه ای باز نمیشه برام.
    من از شبیه ساز خود اندروید استودیو استفاده میکنم.