آموزش دیتابیس در اندروید (SQLite) + سورس پروژه
دیتابیس یا پایگاه داده یکی از مهمترین قسمتهای هر نرمافزار و اپلیکیشن بهشمار میرود که برنامههای اندرویدی هم از این قاعده مستثنی نیستند. در این قسمت از سری مباحث آموزش برنامه نویسی اندروید قصد داریم با مفهوم و کاربرد دیتابیس آشنا شده سپس به نحوهی پیادهسازی دیتابیس SQLite در اندروید بپردازیم.
این جلسه در قالب PDF و در ۸۴ صفحه تهیه شده که در ادامه چند صفحه ابتدایی را مشاهده میکنید:
دیتابیس چیست؟
بهتر است قبل از آنکه وارد حوزهی اندروید و دیتابیس SQLite شویم، با مفهوم کلی دیتابیس و نقش آن در نرمافزارها آشنا شویم.
هر سه واژهی دیتابیس، پایگاه داده و بانک اطلاعاتی در زبان فارسی برای اشاره به مفهوم Database بهکار میرود. بنابراین در هر منبع و مقالهای که با یکی از این واژهها برخورد داشتید بدانید که مقصود یکیست و تفاوتی بین آنها وجود ندارد.
البته در اغلب موارد در منابع فارسی، واژهی دیتابیس مورد استفاده قرار میگیرد؛ بنابراین من هم در این آموزش همین رویه را درپیش میگیرم.
در ابتدا به بیان تعریف دیتابیس میپردازیم. به طور خلاصه به مجموعهای از دادهها با ساختار منظم و سامانمند، دیتابیس گفته میشود.
دسترسی و مدیریت دادههای ذخیره شده در دیتابیس عموماً از طریق سیستمهای مدیریت پایگاه داده یا Database Management System انجام میگیرد که بهاختصار DBMS یا RDBMS نامیده میشوند. منظور از مدیریت دادهها انجام عملیاتی مانند اضافه کردن، حذف و ویرایش داده است.
بهعبارتدیگر، ما با استفاده از یک واسط شامل DBMSها میتوانیم دادههای مدنظر را روی Database ذخیره و بازیابی کنیم.
شاید کمتر نرمافزار یا اپلیکیشنی را بتوان پیدا کرد که نیازی به دیتابیس و ذخیرهسازی داده نداشته باشد. مهم نیست نرمافزار برای سیستمعامل Windows ساخته شده یا Android یا iOS. هر نرمافزار یا اپلیکیشنی برای ذخیرهی تنظیمات خود و همچنین دادههای موردنیاز کاربر به یک دیتابیس نیاز دارد.
کاربر به واسطهی نرمافزاری که در اختیارش قرار میگیرد میتواند دادههای متعددی را روی دیتابیس ذخیره، مشاهده و یا ویرایش کند. البته این به معنی ارتباط مستقیم کاربر با دیتابیس و دادههای موجود در آن نیست. کاربر با رابط گرافیکی برنامه (UI) که محیط نرم افزار هم نامیده میشود ارتباط برقرار کرده و هیچ تماس مستقیمی با دیتابیس ندارد. این وظیفهی برنامه است که دستورات کاربر را از رابط گرافیکی دریافت کرده و در دیتابیس خود ذخیره کند.
یک مثال از کاربرد دیتابیس
بگذارید یک مثال ساده از دیتابیس بگویم تا کارکرد و نحوهی ارتباط کاربر با آن را بهتر درک کنید. یک اپلیکیشن موبایلی یا نرمافزار ویندوزی را درنظر بگیرید که بهمنظور یادداشت برداری ساخته شدهاست. بهعبارتدیگر، یک دفترچه یادداشت دیجیتال را درنظر میگیریم.
با استفاده از این برنامه، کاربر در هر زمانی میتواند یک یادداشت متنی روی آن ذخیره کند. همچنین در صورت لزوم میتواند یادداشتی که قبلاً ذخیره کرده را مشاهده، ویرایش و یا بهطور کامل از برنامه حذف کند.
کاربر در اینجا هیچ اطلاعی در مورد دیتابیس و پشتصحنهی چگونگی ذخیرهی دادهها روی دستگاه نداشته و صرفاً در محیط برنامه و با استفاده از رابط گرافیکی، یادداشتهای خود را ذخیره میکند.
فرایندی که در این نرمافزار طی میشود به اینصورت است که رابط گرافیکی برنامه (شامل یک فیلد متنی اصلی و یا چندین فیلد جانبی دیگر) متن نوشتهشده توسط کاربر را دریافت کرده و به سیستم مدیریت دیتابیس یا DBMS انتقال میدهد. در نهایت، این سیستم متن دریافتی را در قالب دادههای ساختاریافته و منظم روی دیتابیس ذخیره میکند.
ضرورت استفاده از دیتابیس
پرسشی که ممکن است به ذهن برخی خطور کند این است که “خب چرا دیتابیس؟” اپلیکیشن را میتوان بهگونهای ساخت که یادداشتهای کاربر را درون یک فایل متنی ساده (txt) ذخیره کرده و در موقع نیاز از همان فایل فراخوانی کند!
در جواب باید گفت که نظرتان تا حدودی درست است. چهبسا همین الان هم بتوان برنامههایی را یافت که بهجای دیتابیس، دادههای خود را بهصورت متن ساده ذخیره میکنند. اما این روش معایب متعددی دارد که در اینجا به مهمترین آنها اشاره میکنیم:
-
عدم امنیت کافی: شاید برای یک برنامه یادداشت، مسئلهی امنیت اطلاعات خیلی جدی بهنظر نرسد اما در اکثر موارد، دادههای اصلی برنامه یا دادههای اضافهشده توسط کاربر جنبهی محرمانه داشته و نباید خارج از محیط برنامه قابل مشاهده و بازیابی باشد.
دادهها در دیتابیس SQLite بهصورت رمزگذاریشده ذخیره میشود و برخلاف یک فایل سادهی متنی که محتوای آن با هر برنامهی ویرایشگر متنی قابل خواندن است، جز با DBMS آن قابل بازیابی نخواهد بود.
البته این مسئله شامل همهی دیتابیسها نمیشود. برای مثال، در MySQL که بیشتر برای مدیریت دیتابیس وبسایتها بهکار میرود، دادهها کدگذاری نشده و صرفاً برای ذخیرهسازی ساختاریافتهی دادهها مورد استفاده قرار میگیرد.
دیتابیسی مانند SQLite عموماً به صورت محلی (Local) و روی دستگاه کاربر (موبایل، کامپیوتر و…) ذخیره میشود و بههمین دلیل است که این نوع دیتابیسها عموماً رمزگذاری میشوند. این درحالی است که دیتابیسی مانند MySQL که برای مدیریت دادهی وبسایتها استفاده میشود، روی سرور مرکزی ذخیره شده و کاربر دسترسی مستقیم به آن ندارد؛ بنابراین نیازی هم به رمزگذاری آن نیست. -
عدم ساختار دادن به دادهها: دادهها در یک فایل متنی بهصورت ساده ذخیره شده و امکان ساماندهی و ایجاد ارتباط بین آنها وجود ندارد. این مسئله علاوه بر کاهش سرعت ذخیره و بازیابی، حجم دادههای ذخیرهشده را نیز تا چندین برابر افزایش میدهد.
فرض کنید یک بانک برای ذخیرهی دادههای مشتریان خود شامل تراکنشهای بانکی و اطلاعات حساب، از فرمت متنی استفاده کند! کافیست فقط چند روز از آغاز بهکار ذخیرهسازی دادهها بگذرد تا هنگام دریافت و ارسال داده از شعبهها به مرکز، سیستم با مشکلات جدی مواجه شود.
انواع دیتابیس
دیتابیس در همهجا کاربرد دارد. از اپلیکیشنهای مختلف گوشیهای هوشمند گرفته تا نرمافزارهای کاربردی رایانهها، سرورهای بانکها، سازمانها و … .
اگر قبلاً در حوزه طراحی وبسایت فعالیت کردهاید حتما واژههایی مانند MySQL و SQLServer را بارها شنیده و یا با آنها سروکار داشتهاید. اینها هم مانند SQLite یک DBMS از نوع رابطهای (Relational) هستند بنابراین Relational Database Management System یا RDBMS نامیده میشوند.
تفاوت عمدهی این RDBMSها در این است که مواردی مانند MySQL و SQLServer روی سرورهای مرکزی و بهمنظور پردازش و ذخیرهسازی دیتابیسهای متوسط و حجیم مورد استفاده قرار میگیرند درحالی که موردی مانند SQLite برای مدیریت دیتابیسهای کوچک و محلی (ذخیرهشده روی دستگاه کاربر) استفاده میشود.
منظور از Relational این است که دادههای موجود در دیتابیس با یکدیگر در ارتباط بوده و بهصورت سطر و ستونهای منظمی ذخیره میشوند. جدول زیر یک مثال ساده از این نوع دیتابیس است:
شناسه | نام | نام خانوادگی | سن |
---|---|---|---|
۱ | مهدی | جرجانی | ۲۶ |
۲ | مریم | محمدی | ۲۴ |
جدول بالا نمونهی سادهی یک دیتابیس است که شامل ۴ ستون و ۲ ردیف میباشد. اطلاعات جدول (ردیفها) توسط کاربر و به واسطه نرم افزار مدیریت دیتابیس در هر زمان قابل اضافه، ویرایش و حذف شدن است.
DBMSهای متعددی توسط شرکتها و تیمهای مختلف ساخته شده و در دسترس توسعه دهندگان قرار گرفته است که بجز ۳ موردی که در بالا اشاره شد، به مواردی مانند ORACLE و Microsoft ACCESS میتوان اشاره کرد.
به عنوان مثال از ORACLE (اوراکِل) برای بانکهای اطلاعاتی با حجم بسیار بالا استفاده می شود (مانند بانکها و سازمانهای دولتی و خصوصی بزرگ). یا اگر تابحال با سیستمهای مدیریت محتوای وب مانند WordPress و Joomla کار کردهاید حتماً با MySQL آشنایی مختصری دارید.
عموماً از MySQL برای وب سایتهای با حجم داده در حد کم و متوسط استفاده می شود. اما وجه اشتراک موارد بالا در SQL است. SQL مخفف Structured Query Language و معنی لغوی آن “زبان ساختارمند پرسش ها” است. زبان SQL یک زبان استاندارد بوده که شامل دستوراتی برای مدیریت اطلاعات دیتابیس ها می باشد. از جمله دستورات کلیدی SQL می توان به INSERT، UPDATE، DELETE، SELECT و DROP اشاره کرد.
چهار عمل اصلی پایگاه داده ها Create (ایجاد)، Read (خواندن)، Update (بروزرسانی) و Delete هستند که به اختصار CRUD نامیده می شود.
اگر آشنایی قبلی با دیتابیس ندارید قطعاً مفاهیم بالا مقداری شما را گیج کرده است. اما جای نگرانی نیست. اولاً اینکه در عمل ما با مفاهیم سروکار نداریم و صرفاً از این جهت به خلاصهای از پایگاه دادهها اشاره کردم تا یک پیشزمینه کلی در ذهن شما ایجاد شود. دوم اینکه دانستن این اطلاعات درک عمیقتری از پایگاههای داده به شما میدهد و چه خوب است در کنار مباحث اصلی دیتابیس، اندکی هم در وب در خصوص دیتابیسها مطالعه کنید.
SQLite چیست؟
بهتر است بیشتر از این از مبحث اصلی یعنی آموزش دیتابیس در اندروید و مبحث SQLite منحرف نشویم. در پاراگراف بالا اشاره شد که هرکدام از برنامههای مدیریت بانک اطلاعاتی بنا به ویژگیهایی که دارد، در مقاصد خاصی استفاده میشود.
در دیوایس های اندروید که عموماً گوشی، تبلت و ساعتهای هوشمند هستند، دیتابیسها حجم بسیار کمی را در بر میگیرند بنابراین لازم است از سیستمی استفاده شود که کمترین میزان از منابع سخت افزاری دیوایس از جمله حافظه RAM و CPU را درگیر کرده و حجم خود اپلیکیشن نیز تا حد ممکن کم باشد.
گوگل سیستم SQLite را برای اندروید برگزیده که به صورت پیشفرض درون این سیستمعامل تعبیه شده و شما به عنوان توسعهدهندهی اپلیکیشن نیازی به نصب SQLite بر روی دیوایس کاربر ندارید. ما فقط دیتابیس را ایجاد کرده و به واسطه دستورات SQL آنرا مدیریت میکنیم. SQLite یک پایگاه داده بسیار کوچک با حجمی کمتر از یک مگابایت است که در قالب یک کتابخانه (Library) نوشته شده و به صورت اوپن سورس و رایگان منتشر شده است.
بنابراین گوگل یا توسعه دهنده نیازی نیست برای استفاده از این پایگاه داده مبلغی را به سازنده بپردازند. همچنین بر خلاف دیتابیسی مانند MySQL که نیاز به سرور دارد، SQLite بی نیاز از سرور بوده و به صورت مستقل روی هر دیوایس مستقر شده که اصطلاحاً ServerLess نامیده میشود.
آشنایی اولیه با SQLite و استفاده از ابزار مدیریت آن
بهتر است قبل از اینکه سراغ استفاده از دیتابیس در اندروید برویم قدری با این پایگاه داده و زبان SQL در محیط گرافیکی و ویژوال آشنا شویم تا درک بهتری از مفاهیم مرتبط با آن کسب کنیم. ابزارهای مختلفی برای کار با SQLite منتشر شدهاند که امکانات و محیط کار همگی تا حدی مشابه بوده و امکان ساخت دیتابیس، جداول، ستونها، ورود دادهها، حذف دادهها و … در همه آنها و در یک محیط گرافیکی و ساده وجود دارد.
با استفاده از این ابزار نیاز ما به نوشتن مستقیم دستورات SQL رفع میشود و بجای آن، دادهها را در یک محیط گرافیکی وارد دیتابیس میکنیم. این ابزار، دستورات ما را دریافت کرده و به دستورات SQL تبدیل میکنند. اعتبارسنجی دستورات از دیگر مزیتهای این ابزار بهشمار میرود.
از معتبرترین ابزارهای کار با SQLite میتوان به SQLiteStudio ، DB Browser for SQLite و SQLite Expert Personal اشاره کرد. البته نسخهای از برنامه SQLite Expert با نام Professional هم در وبسایت آن موجود است که رایگان نبوده و لازم است خریداری شده یا از نسخههای کرک شده استفاده شود.
برای این آموزش، استفاده از ابزار رایگان کافی بوده و نیاز ما را برآرده میکند. حتی پلاگینی به این منظور برای مرورگر FireFox به صورت رایگان منتشر شده که با نصب آن روی فایرفاکس میتوانید به مدیریت دیتابیسهای SQLite بپردازید. این پلاگین SQLite Manager نام دارد. محیط کاربری این ابزارها تا حدودی مشابه یکدیگر بوده و پیچیدگی را احساس نخواهید کرد.
در این آموزش من از SQLiteStudio استفاده می کنم.
تاکید میکنم استفاده از این ابزار در این مبحث آموزشی فقط برای آشنایی با دیتابیس و دستورات SQL و اطمینان از صحت دستوراتی است که بنا به نیازمان مینویسیم و قرار نیست ما دیتابیس خروجی این ابزار را به پروژه اندرویدی خود منتقل کنیم.
من SQLiteStudio را از وبسایت رسمی آن دانلود و نصب میکنم.
بهطور خلاصه، در اینجا ما قصد داریم با ابزاری بهنام SQLiteStudio، از طریق یک رابط گرافیکی ساده، با سیستم مدیریت دیتابیس (DBMS) که SQLite نام دارد ارتباط برقرار کنیم.
SQLiteStudio را باز میکنم:
در قدم نخست لازم است یک دیتابیس جدید ایجاد کنم. به منوی Database رفته و گزینه Add a database را انتخاب میکنم:
قسمت Database type که مربوط به نوع دیتابیس میشود را بدون تغییر رها کرده و به سراغ فیلد انتخاب نام دیتابیس میروم. با کلیک روی آیکون پوشه، پنجره انتخاب محل ذخیره فایل دیتابیس باز میشود.
نام مدنظر خود را وارد کرده و تایید میکنم:
من نام test_db را در فیلد File name وارد کردم. با کلیک روی دکمه Select، اطلاعات دیتابیس ایجاد شده بهصورت زیر نمایش داده میشود:
در تصویر بالا ملاحظه میکنید پسوند .db بهصورت خودکار به نام فایل اضافه شده است. روی دکمه OK کلیک میکنم تا دیتابیس به منوی سمت چپ اضافه شود. با دوبار کلیک روی نام دیتابیس یا کلیک روی فلش سمت چپ آن، گزینههای زیرمجموعه آن باز میشود که اولی Tables به معنی جدولها نام دارد.
هر دیتابیس از حداقل یک جدول تشکیل شده که اطلاعات را درون خود نگهداری میکند. با راست کلیک روی گزینه Tables و یا آیکون آن در نوار بالای برنامه میتوان جدول یا جدولهای موردنیاز را به دیتابیس افزود:
در قسمت Table name یک نام برای جدول تعیین می کنیم. من نام person_details را وارد کردم. قبل از ساخت جدول حداقل یک ستون میبایست به جدول اضافه کنیم. ساختار دیتابیس و جدول را همین ستونها تشکیل میدهند. عموما برای هر ردیف از اطلاعات یک شناسه (ID) اختصاص میدهیم که این شناسه به صورت افزایشی و غیر قابل تکرار میباشد. با زدن گزینه Add column پنجرهای باز می شود که مشخصات ستون را باید وارد کنیم:
پنجرهی فوق باز میشود. برای فیلد 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 را انتخاب میکنم:
دکمه Configure برای این گزینه فعال شد. روی دکمه کلیک میکنم. گزینه اول Autoincrement به معنی افزایش خودکار است. شناسه هم باید این ویژگی را داشته باشد تا با اضافه شدن هر سطر از اطلاعات جدید، یک رقم به رقم شناسه قبلی بهصورت خودکار اضافه شود. انتخاب کرده و Apply میکنم:
ویژگی دیگری که برای شناسه ذکر شد، یکتا بودن و تکراری نبودن آنها بود. بنابراین گزینه Unique به معنی یکتا را انتخاب و OK میکنم:
ستون id با موفقیت به جدول اضافه شد:
به همین ترتیب مابقی ستونهای مدنظرم را هم اضافه میکنم. من چند ستون دیگر با عنوان نام، نام خانوادگی، سن و تلفن تماس مدنظر دارم که آنها را اضافه میکنم:
مطابق تصویر بالا من نام ستون دوم را name و نوع آن را TEXT انتخاب کردم. در نسخههای قبلی SQLiteStudio علاوه بر TEXT یک دیتا تایپ دیگر با نام VARCHAR هم وجود داشت که برای ذخیره رشتههای متنی کوتاه استفاده میشد؛ اما به دلایلی در نسخه جدید حذف شده است.
معمولا از VARCHAR برای ذخیره دادههایی مانند نام افراد، نام شهر و… که تعداد کاراکتر کمی را شامل میشود استفاده میشود. دیتا تایپ VARCHAR نسبت به TEXT فضای کمتری اشغال میکند بااینحال آنقدر تفاوت زیادی هم ندارد.
البته احتمالاً میشود بهجای انتخاب یک گزینه از لیست Data type مقداری دلخواه مانند VARCHAR را داخل فیلد آن تایپ کرد اما از آنجایی که اینجا هدف آشنایی اولیه با دیتابیس SQLite اندروید است خیلی درگیر جزئیات نمیشویم.
همانطور که ملاحظه میکنید، در اینجا گزینه Primary key غیرفعال است زیرا ما قبلا ستون id را از نوع Primary key انتخاب کرده بودیم و چنانچه قبلاً اشاره شد، هر جدول فقط یک ستون از این نوع میتواند داشته باشد.
گزینه Unique هم برای این ستون و ستونهای دیگر انتخاب نمیشود زیرا دادههایی مانند نام و سن یکتا نبوده و افراد زیادی ممکن است نام و سن مشترک داشته باشند. البته برای مثال چنانچه قصد داشتیم یک ستون برای کد ملی داشته باشیم میتوان آن را از نوع یکتا تعریف کرد تا هر کد ملی فقط برای یک شخص قابل ثبت باشد.
به همین ترتیب یک ستون برای نام خانوادگی با نام family و از نوع TEXT، یک ستون برای سن با نام age و از نوع INTEGER و یک ستون برای شماره تلفن با نام tel و از نوع TEXT میسازم.
ستون شماره تلفن را باید از نوع عددی یعنی INTEGER میساختیم اما از آنجایی که در دادههای عددی، صفر ابتدای عدد و همچنین کاراکتریهای غیرعددی (مانند +) هنگام ذخیره سازی روی دیتابیس حذف میشود، آن را از نوع TEXT تعریف میکنم تا شماره همانطوری که کاربر وارد کرده ثبت شود. شماره موبایل معمولاً با فرمت ۰۹۱۵۱۱۱۱۱۱۱ و یا ۹۸۹۱۵۱۱۱۱۱۱۱+ ثبت میشود.
در نهایت ۵ ستون به صورت زیر به جدول person_details اضافه شد. چنانچه هرکدام از ستونها نیاز به تغییراتی داشت، با دوبار کلیک روی ردیف آن، پنجرهی تنظیمات مجدد باز میشود.
توجه داشته باشید تغییرات ما شامل اضافه کردن ستونها هنوز ذخیره نشده که با استفاده از کلیدهای Ctrl + S و یا دکمه Commit structure changes که در تصویر بالا مشخص شده، این عمل انجام میشود.
پس از انجام یکی از دو عمل فوق، قبل از ذخیره شدن تنظیمات جدول، دستور یا کوئری (Query) مربوط به آن نمایش داده میشود:
همانطور که قبلاً اشاره شد، ابزاری مانند SQLiteStudio صرفاً برای سادگی کار استفاده میشود. بهاینصورت که این ابزار دستورات ما را در رابط گرافیکی خود دریافت کرده و به این کوئری قبل فهم برای SQLite تبدیل میکند.
بهعبارتدیگر، این ابزار ما را از نوشتن مستقیم کوئری فوق بینیاز کرده و احتمال خطا در نوشتن دستور را هم ازبین میبرد.
کوئری فوق را با دقت بررسی کنید. دستور به این صورت است که یک جدول با نام person_details ساخته (CREATE) شود. سپس ستونهای آن داخل پرانتز لیست شده که نوع دادهی هر ستون در جلوی نام آن قید شده است.
با کلیک روی دکمه OK جدول روی دیتابیس ذخیره میشود:
جدول به پنل سمت چپ برنامه اضافه شد. همچنین در قسمت Status هم Log مربوط به ذخیره تنظیمات جدول مدنظر ما نمایش داده میشود. جرئیات مربوط به ساختار جدول در Tab یا زبانه Structure نمایش داده میشود.
آخرین کوئری ساختار جدول همیشه در زبانه DDL قابل مشاهده است.
حالا قصد دارم اطلاعات چند شخص را وارد دیتابیس کنم. در تب Data با زدن گزینه + سبز رنگ (و یا کلید insert کیبورد)، یک ردیف با مقادیر پیش فرض NULL (به معنی تهی) در ستونها ایجاد میشود که آماده وارد کردن اطلاعات است:
ستون id را به صورت Auto increment تعیین کرده بودیم پس مقدار آن را همان null و دست نخورده باقی میگذارم و سراغ ستونهای بعدی میروم. با کلید tab به راحتی میتوانید بین ستونها جابجا شوید و مقادیر را وارد کنید. من ۳ ردیف اطلاعات وارد کردم:
با Commit کردن تغییرات (گزینه تیک سبز رنگ) اطلاعات ثبت می شود:
حالا قصد دارم کوئریهای اصلی و ضروری را روی این دیتابیس اجرا و تمرین کنم. کوئریهای Insert، Update، Select و Delete.
در قدم اول تصمیم دارم مشخصات یک شخص را بجای استفاده از محیط گرافیکی، از طریق کوئری insert وارد جدول کنم. Syntax دستور insert به اینصورت است:
INSERT INTO table_name (column1, column2, column3,...columnN) VALUES (value1, value2, value3,...valueN);
مابین پرانتر ابتدایی نام ستونها و در پرانتز دوم، بعد از VALUES (به معنی مقادیر)، مقادیر موردنظر را به ترتیب وارد میکنیم. به جای table_name نام دیتابیس جایگزین میشود.
با زدن گزینه Open SQL editor یا کلید میانبر (Alt + E) به برگه SQL Editor میروم:
کوئری زیر را وارد و توسط دکمه Execute query اجرا میکنم (execute به معنی اجرا است):
INSERT INTO person_details (id, name, family, age, tel) VALUES (NULL, 'Mohammad', 'Bustani', 29, '09154444444');
کوئری با موفقیت اجرا شد و پیغام Rows affected:1 نشان میدهد یک سطر دچار تغییر شده که در اینجا تغییر شامل اضافه شدن یک سطر بود:
مجدد به جدول person_details برمیگردم (گزینههای پایین/سمت چپ نرم افزار امکان سوئیچ کردن بین SQL editor و دیتابیس را فراهم میکند). در برگه Data با بروزرسانی اطلاعات جدول توسط گزینه Refresh table data و یا کلید F5، ردیفی که به واسطه کوئری اضافه کرده بودم باید نمایش داده شود:
در تصویر زیر ردیف شماره ۴ دادههای تعریف شده در کوئری را نمایش میدهد که با موفقیت به جدول اضافه شده:
کوئری بعدی که آزمایش میکنم Update هست.
Syntax کوئری Update:
UPDATE table_name SET column1 = value1, column2 = value2...., columnN = valueN WHERE [condition];
می خواهم نام شناسه ۳ را از SeyedMahdi به Sajad و سن را هم از ۳۳ به ۲۲ تغییر دهم. مجدد از طریق گزینه SQL Editor به بخش کوئری رفته و دستور زیر را وارد می کنم:
UPDATE person_details SET name = 'Sajad', age = 22 WHERE id = 3;
پس از اجرا مانند قسمت قبل در بخش Status پیغامی مبنی بر اینکه یک ردیف ویرایش شده چاپ شد:
به تب Data برمیگردم و اطلاعات جدول را بروز (Refresh) میکنم:
در تصویر بالا نام Sajad جایگزین SeyedMahdi در ردیف ۳ شده.
کوئری Select صرفاً برای انتخاب و نمایش ردیفهایی با مشخصاتی خاص بکار میرود و بر خلاف دو کوئری قبل، تغییری در جدول ایجاد نمیکند. به عنوان مثال میخواهم فقط نام خانوادگی افرادی نمایش داده شود که سن آنها ۳۰ سال و به بالا است.
Syntax کوئری Select به اینصورت است:
SELECT column1, column2, columnN FROM table_name WHERE [condition];
کوئری مدنظر من:
SELECT family FROM person_details WHERE age >= 30;
در دستور فوق، من ستون family ردیفهایی را فیلتر میکنم که ستون age آنها عددی بزرگتر یا مساوی با ۳۰ داشته باشد.
همانطور که در پاراگراف بالا اشاره شد، دستور Select صرفاً برای انتخاب اطلاعات است که این اطلاعات در همان تب SQL editor نمایش داده میشود:
در قسمت Grid view دو نام خانوادگی که شرط (condition) تعیین شده برای آنها صدق میکرد فیلتر شده است.
اگر بخواهم همهی اطلاعات این افراد چاپ شده و صرفاً محدود به یک یا چند ستون نباشد، بجای ذکر نام ستون (مانند family در این مثال) کاراکتر * را جایگزین میکنیم. در سینتکس SQL کاراکتر * به معنی “همه” یا All است.
کوئری را به صورت زیر اصلاح و دوباره اجرا میکنم:
SELECT * FROM person_details WHERE age >= 30;
مشاهده میکنید برخلاف کوئری قبل، در Grid view تمامی اطلاعات دو شخصی که سن بالای ۳۰ سال داشتند نمایش داده شده.
و اما آخرین کوئری که در این قسمت بررسی میکنیم دستور DELETE است که مشخصاً برای حذف دادهها بکار میرود.
سینتکس کوئری Delete:
DELETE FROM table_name WHERE [condition];
به عنوان مثال می خواهم اطلاعات شخصی که با شناسه شماره ۲ در دیتابیس ثبت شده را حذف کنم:
DELETE FROM person_details WHERE id = 2;
در تصویر فوق، ردیف با شناسه (id) شماره ۲ حذف شده است.
فعلا در همین حد آشنایی با مبحث دیتابیس کافیست. با این حال اگر مایل بودید اطلاعات بیشتری در این خصوص کسب کنید منابع متعددی از جمله وبسایت Tutorialspoint در دسترس هستند.
قبل از خروج از SQLiteStudio بهتر است چند دقیقهای وقت گذاشته و با سایر گزینهها و امکانات این نرم افزار و یا ابزار مشابهی که استفاده میکنید آشنا شوید. برای مثال با راست کلیک روی نام جدول و گزینه generate query for table به صورت خودکار چهار عمل اصلی که در بالا معرفی شد در قسمت Query editor برای شما آماده استفاده میباشد:
آموزش کار با SQLite در اندروید استودیو
نوبتی هم که باشد، نوبت آموزش دیتابیس SQLite در اندروید است. ابتدا طبق مبحث آموزش ساخت پروژه در اندروید استودیو یک پروژه اندرویدی با نام SQLite میسازم. اکتیویتی را از نوع Empty Activity و زبان را Java انتخاب کردم.
پروژه را در قالب یک اپلیکیشن کاربردی پیش میبریم. یک واحد تولیدی را در نظر میگیریم که تمامی کارمندان آن، یک شماره پرسنلی اختصاصی بر روی لباسشان درج شده و مدیر کارگاه قصد دارد روی موبایل اندرویدی خود، اپلیکیشنی داشته باشد که بتواند اطلاعات کامل کارکنان را ثبت و در مواقع لازم با وارد کردن کد پرسنلی درج شده بر روی لباس پرسنل، به مشخصات وی دسترسی داشته باشد.
البته مدنظرتان باشد این یک پروژه بسیار ساده و آموزشی است و به لحاظ طراحی و بهینه بودن کدها با یک اپلیکیشن کاربردی نهایی بسیار فاصله دارد. برای مثال من از مواردی مثل طراحی استاندارد ظاهر برنامه و رعایت حداکثری استانداردها در کدنویسی (مانند فرخوانی رشتههای متنی از strings.xml و…) به جهت خلاصه شدن مبحث خودداری میکنم.
طراحی رابط کاربری
الان که در حال نگارش نسخه جدید این آموزش هستم (فروردین ۱۴۰۲)، از نگارش نسخه ابتدایی آن حدود ۷ سال میگذرد. در آن زمان هنوز لایه ConstraintLayout معرفی نشده بود و رابط کاربری اکتیویتیهای اندروید عمدتاً با RelativeLayout و LinearLayout طراحی میشد.
رابط کاربری این آموزش نیز با RelativeLayout طراحی شده بود و از آنجایی که در این مبحث تمرکز ما روی دیتابیس SQLite هست، نیازی به طراحی مجدد این اکتیویتی با ConstraintLayout نمیبینم.
رابط کاربری اکتیویتی این پروژه به صورت زیر طراحی شده است:
در این Layout مجموعا ۷ عدد Widget بکار رفته که شامل ۳ ویجت TextView و ۴ ویجت Button است. سورس این لایه به اینصورت است:
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="10dp" android:paddingLeft="10dp" android:paddingRight="10dp" android:paddingTop="10dp" tools:context=".MainActivity"> <EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="textPersonName" android:ems="10" android:layout_alignParentTop="true" android:layout_alignParentStart="true" android:padding="10dp" android:id="@+id/edt_name" android:background="#E8E8E8" 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_marginTop="14dp" android:padding="10dp" android:id="@+id/edt_family" android:background="#E8E8E8" 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_marginTop="14dp" android:padding="10dp" android:background="#E8E8E8" android:id="@+id/edt_id" android:hint="شناسه پرسنلی" /> <Button android:text="ذخیره" android:textSize="20dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/edt_id" android:layout_marginTop="10dp" android:id="@+id/btn_insert" /> <Button android:text="نمایش" android:textSize="20dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/btn_insert" android:id="@+id/btn_view" /> <Button android:text="بروزرسانی" android:textSize="20dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/btn_view" android:id="@+id/btn_update" /> <Button android:text="حذف" android:textSize="20dp" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/btn_update" android:id="@+id/btn_delete" /> </RelativeLayout>
ویجتهای TextView به ترتیب با idهای edt_name، edt_family، edt_id و ویجتهای Button با btn_insert، btn_view، btn_update و btn_delete تعریف شدهاند.
همیشه سعی کنید نامگذاری فایلها، ویجتها، کلاسها و هرآنچه که در برنامهنویسی با آن سروکار دارید را با الگویی مشخص و بر اساس کاربرد آن انجام دهید تا توسعه پروژه با سرعت بالاتر و خطای کمتر پیش برود.
برای مثال هرکس بعداً سورس این پروژه را بررسی کند، با مشاهده ویجتی که با شناسه edt_family تعریف شده میتواند تشخیص دهد کاربرد آن مربوط به ویرایش نام خانوادگی است.
تکمیل کدهای اکتیویتی و کلاس دیتابیس
در قدم بعد در کلاس MainActivity.java به تعداد نیاز چند نمونه از کلاسهای EditText و Button میسازم:
MainActivity.java
package ir.android_studio.sqlite; import androidx.appcompat.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 هر کدام از نمونهها را به ویجت (کامپوننت) مربوطه متصل میکنم:
MainActivity.java
package ir.android_studio.sqlite; import androidx.appcompat.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 = findViewById(R.id.edt_name); edtFamily = findViewById(R.id.edt_family); edtID = findViewById(R.id.edt_id); btnInsert = findViewById(R.id.btn_insert); btnView = findViewById(R.id.btn_view); btnUpdate = findViewById(R.id.btn_update); btnDelete = findViewById(R.id.btn_delete); } }
خب! فعلا کار ما با اکتیویتی تمام شد. حالا باید یک دیتابیس بسازیم، یک جدول درون دیتابیس ایجاد کنیم و متدهای مربوط به اَعمال ذخیره، نمایش، بروزرسانی و حذف اطلاعات را بنویسیم.
در اندروید یک کلاس کمکی با نام SQLiteOpenHelper وجود دارد که برای مدیریت دیتابیس بکار میرود. من یک کلاس جاوا با نام دلخواه DatabaseManager به پروژه اضافه میکنم. به این منظور درون پوشه java و روی نام پکیج (ir.android_studio.sqlite) راست کلیک کرده، گزینه New سپس Java Class و درون پنجره باز شده، نام کلاس را وارد میکنم:
با وارد کردن نام کلاس و Enter، کلاس به پروژه اضافه میشود:
ممکن است در مرتبه اولی که پوشهها را حذف میکنید، پوشه حذف نشده و به بالای پکیج اصلی منتقل شود. کافیست مجدد پوشههای تست را انتخاب کرده و Delete کنید. نتیجه به صورت زیر خواهد بود:
میتوانید فایلهای پروژه را با ویرایشگر متنی سادهای مثل Notepad++ باز کنید.
درحال حاضر کلاس ساخته شده به اینصورت است:
DatabaseManager.java
package ir.android_studio.sqlite; public class DatabaseManager { }
یک کلاس از نوع public که داخل بدنه (body) آن هیچ کدی وجود ندارد. برای مدیریت دیتابیس SQLite در اندروید کلاسی با نام SQLiteOpenHelper ازپیش ساخته شده که ما را از نوشتن کدهای اضافی بینیاز میکند.
بنابراین در قدم اول باید کلاس DatabaseManager را از این کلاس ارث بری کنم. بهعبارتدیگر باید آنرا از کلاس ذکر شده extends کنم:
با تایپ کردن چند کاراکتر ابتدای کلاس، لیست پیشنهدات اندروید استودیو باز میشود و نیازی به تایپ کامل آن نیست. گزینه اول را انتخاب میکنم. کلاس SQLiteOpenHelper به اینصورت به کلاس اضافه شد:
DatabaseManager.java
package ir.android_studio.sqlite; import android.database.sqlite.SQLiteOpenHelper; public class DatabaseManager extends SQLiteOpenHelper { }
در خط دوم مشاهده میکنید کلاسی که ارثبری کردیم بهصورت خودکار import شده است. چنانچه این ایمپورت خودکار انجام نشد، ارور Cannot resolve symbol ‘SQLiteOpenHelper’ نمایش داده میشود. با کلیک روی نام کلاس و کلیدهای Alt+Enter ایمپورت انجام میشود:
مطابق تصویر زیر اگر همزمان ctrl را نگه داشته و روی نام آن کلیک کنم، کلاس باز شده و میتوانید محتوای داخل آن را بررسی کنید:
چنانچه برای اولین مرتبه قصد باز کردن کلاسهای اندروید را داشته باشید پیغامی نمایش داده میشود که با انتخاب گزینه Access مجوز دسترسی به کلاسها را دریافت میکنید.
با نگه داشتن موس روی تب کلاس، محل قرارگیری کلاس نمایش داده میشود. همانطور که در تصویر بالا مشاهده میکنید، فایل این کلاس در پوشه android-13 قرار گرفته که مربوط به API 33 است.
درحالحاضر کلاس DatabaseManager یک زیرکلاس (Subclass) از SQLiteOpenHelper محسوب میشود.
یک ارور داخل کلاس وجود دارد. با بردن نشانگر موس روی بدنه کلاس، متن ارور نمایش داده میشود:
در متن خطا قید شده که متد onCreate مربوط به کلاس SQLiteOpenHelper باید اضافه یا implement شود. با کلیک روی Implement methods یا Alt+Shift+Enter متد مربوطه به کلاس اضافه میشود.
البته چنانچه روی بدنه کلاس کلیک کرده باشید، آیکون لامپ ظاهر میشود که از طریق این آیکون نیز میتوان عمل implement را انجام داد:
پس از انتخاب گزینه implement method در هریک از دو روش فوق، پنجره زیر باز میشود که ۲ متد را برای اضافه کردن نشان میدهد:
در این پنجره دو متد onCreate و onUpgrade وجود دارد که به صورت پیش فرض هردو انتخاب شده و من هر دو را تایید می کنم. با انجام این کار، این متدها به کلاس اضافه شد:
DatabaseManager.java
package ir.android_studio.sqlite; 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) نیز نیاز دارد که عمل ایجاد فایل دیتابیس توسط سازنده صورت میگیرد:
در پنجره بازشده، متد سازنده اول انتخاب شده که بدون تغییر آن، تایید میکنم. دو مورد دیگر مربوط به مدیریت ارورها (error handler) هستند که در اینجا نیازی نداریم. متد سازنده به کلاس اضافه میشود:
DatabaseManager.java
package ir.android_studio.sqlite; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import androidx.annotation.Nullable; public class DatabaseManager extends SQLiteOpenHelper { public DatabaseManager(@Nullable Context context, @Nullable String name, @Nullable 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) { } }
متد سازنده همیشه همنام با کلاس خودش است. من سعی میکنم نامگذاریهای پیش فرض را تغییر دهم و همچنین در هر متد از نامهای متفاوتی استفاده کنم تا کمتر باعث سردرگمی شما شود. اما مسلما زمانی که کدها را درک کردید، نیازی نیست در نامگذاریها وسواس بخرج دهید. به عنوان مثال نام پارامتر Context را از context به cnt تغییر میدهم.
جهت مطالعه ادامه آموزش، فایل PDF را دانلود نمائید
توجه : سورس پروژه درون پوشه Exercises قرار دارد
با توجه به اینکه آموزشهای پایه با قیمت پایین در اختیار کاربر قرار گرفته و درآمد حاصل صرف تامین هزینههای وب سایت و تهیه آموزشهای آتی میشود، به اشتراک گذاری این فایل با دیگران خلاف اخلاق است.
تعداد صفحات : ۸۴
حجم : ۴ مگابایت
قیمت : ۴۶ هزار تومان
تاریخ بروزرسانی آموزش : ۱۴۰۲/۰۱/۲۳
توجه: صرفا در صورتی از درگاه پشتیبان استفاده کنید که قادر به پرداخت از طریق سبد دانلود نباشید.
افزودن به سبد دانلود درگاه پشتیبان
خدایی یکم گرونه
اگه بخوام تموم پکیج هاتونو بگیریم خیلی میشه یکم
ارزونش کنید
از جاهایی که ارزون هست تهیه بفرمایید. کل آموزشهای فعلی میشه ۲۱ تومن! نمیدونم منظورتون از گرون چیه
نه استاد از دیوایس حقیقی استفاده نمیکنم در logcat همه چی درسته فقط table createdرو نشون نمیده و وقتی واردandroid monitorمیشم اصلا برنامه من انگار اصلا روی شبیه ساز انگار نصب نشده
سلام برای ارتباط با هاست و mysql مطلب نمی گذارید؟
احتمالا مبحث بعدی همین موضوع باشه
سلام و وقت بخیر. ببخشید برنامه ای که من نوشتم دیتابیس نمیسازه مشکل از چیه تمام مراحل هم با دقت چک کردم مشکلی ندیدم
سوال شما کلی هست و نمیتونم راهنمایی کنم. لاگ ها رو بررسی کنید ببینید چه اروری میگیرید
سلام استاد من دیتا بیس ساختم و کدها را کامل طبق دستورات رفتم اما موقع ران کردن برنامه ارور has stopping میده میشه بفرمایید اشکال چیه؟
لاگ رو بررسی کنید ببینید اشکال از چه قسمتی هست
سلام استاد خسته نباشید من بسته آموزشی شما رو خریدم و دارم یاد میگرم فقط اینجا یه مشکلی هست من وقتی بر روی دکمه ذخیره کلیک میکنم میزنه اطلاعات با موفقیت ذخیره شد ولی وقتی به Logcatنگاه میکنم ۰۶-۱۲ ۱۹:۴۱:۳۱٫۶۸۵ ۲۷۰۶۳-۲۷۰۶۳/? I/Mahdi: insertButton Clicked!
۰۶-۱۲ ۱۹:۴۱:۳۱٫۷۰۵ ۲۷۰۶۳-۲۷۰۶۳/? I/Mahdi: insertPerson Method
۰۶-۱۲ ۱۹:۴۱:۳۱٫۷۰۵ ۲۷۰۶۳-۲۷۰۶۳/? I/Mahdi: Data inserted!این سه تا رو میاره اما tableرو نمیسازه و وقتی وارد android divace monitorمیشیم در پوشه dataچیزی وجون نداره نه چیزی بنام data وجود داره نه databaseلطفا کمکم کنید با تشکر فراوان
از دیوایس حقیقی که استفاده نمی کنید؟
ببخشید باز مزاحم شدم
من کل دیزاین و جاوا یاد گرفتم این دیتابیس فقط نمیدونم چجوری اطلاعات ازش بگیرم
من اینجوری فکر میکنم
توی دیتابیس ای دی میدم
نام میدم
به جای سن که شما نوشتید متن کتبم میدم
بعد بهم میگم که سن بگیر و نمایش بده
این فکرم درسته ؟
همین خط اخر که گفتم نمیدونم چجوریه باید نمایش بدم
این که فرمودید چطور نمایش بدید رو متوجه نمیشم. خب نمایش داده که داخل آموزش هست
ُلام
من میخوام کتاب بنویسم و نیاز به دیتابیس داخلی دارم
هیچ اطلاعاتی نمیخوام از کاربر بگیرم
میشه بگید توی این اموزش هست یا نه اگه هست صفحه چنده ؟
یعنی با زدن دکمه مقدمه
مقدمه کتاب من براش بالا میاد که دارای متن هست و تو دیتا بیس ذخیره شده
خیر. آموزشهای مربوط به ساخت کتاب اندرویدی در سطح وب رو بررسی بفرمایید
سلام
روزتون پر از انرژی مثبت
بنده داخل برنامه از دیتابیس آماده استفاده کردم.
و برای این کار در کنار جدول خودم یه جدول بنام android_metadata با ستونی به نام locale و سطری به نام en_US ایجاد کردم و دیتابیسم رو zip کردم و داخل پوشه asset گذاشتم ولی برنامه ارور میده تخت این عنوان که جدولی که میگی وجود نداره…
خطی که بهش گیر میده و میگه جدولت وجود نداره:
cursor = sqLiteDatabase.rawQuery(” SELECT * FROM ” + TBL_NAME, (String[]) null);
متن خطا:
Error Code : 1 (SQLITE_ERROR)
Caused By : SQL(query) error or missing database.
(no such table: mytb (code 1): , while compiling: SELECT * FROM mytb)
علت خطا چی میتونه باشه؟
چون در داخل پوشه data دیتابیس رو ایجاد میکنه و جدول android_metadata هم وجود داره ولی جدول خودم نیست…
سلام اقا
وقتتون بخیر خسته نباشید
من چند جا اموزش دیدم سرچ کردم فیلم دیدم
همه تقریبا توی یه روال پیش میرن و به مشکلی بر نمیخورن
من عین شما پیش میرم ولی زیر پرانتز ارور داره “)”
وقتی یه فاصله یا چیزی میدم برطرف میشه و زیر
کوتیشن اینتجر ارور میگیره
دیباگ میکنم میگه ارور سین تکس کد ۱
منظورم توی بخش کوءری هست که جدول و اینارو میسازیم بعد ستون هارو داخل ) قرار میدیم زیرش ارور داره
اسکرین شات بدید لطفا. متن اخطار رو هم بذارید اینجا
error opening trace file: No such file or directory (2)
میشه در خصوص این ارور راهنمایی کنین؟ تو logcat نشون میده
ترجمه کنید جمله رو حله
سلام .. من android device monitor را ندارم .. میتونین راهنمایی کنین ؟ آخرین ورژن اندروید استودیو را استفاده میکنم
https://developer.android.com/studio/profile/monitor
سلام
ارتباط با اس کیو ال سرور از طریق کانکشن استرینگ به چه صورت هست؟
اگر امکانش یه هست یه راهنمایی بفرمایین، نیاز دارم برای برنامه از سرور بخونم یه سری مقادیر هم ارسال کنم
با تشکر
سلام
چطور میتونم دیتابیسی رو که که قبلا آماده کردم و مثلا شامل اطلاعات کارمندان این برنامه میشه رو بهش اضافه کنم؟
سرچ کنید آموزش زیاده برای این موضوع. ازجمله آموزش ساخت کتابهای اندرویدی
سلام خسته نباشید من اموزش شما را خریداری کردم . الان میخوام داده هایی که داخل sqlite هست رو ببینم و واکاوی کنم یا اصطلاحاً از توی adb pullکنم ولی متاسفانه نمیدونم دیتابیس در کدوم مسیر قرار داره لطفا کمکم کنین ممنون
داخل آموزش مسیر قرارگیری دیتابیس توضیح داده شده بزرگوار
من فایل را دانلود کردم ولی در این آموزش فقط اطلاعات را به انگلیسی میشه وارد کرد چه جوری میشه اطلاعات را به فارسی و بدون استفاده از اکتیویتی و لیوت وارد دیتا بیس کرد و فقط اطلاعات را کاربر در لیوت ببینه لطفا راهنمایی کنید
– خیر انگلیسی و فارسی تفاوتی نداره. اگه با شبیه ساز کار می کنید مربوط به این مورد میشه
– سوال دوم رو دقیق متوجه نشدم. اگه منظورتون اینه که از قبل اطلاعات رو وارد دیتابیس بکنید و کاربر فقط بتونه مشاهده کنه، مثالهاش زیاده تو نت. از جمله کتابهای اندرویدی
سلام ممنون بابت آموزشتون . خیلی روون و تمیز توضیح دادین .فقط تنها اشکالی که برنامه داشت این بود که وقتی میخوایم مجددا اجراش کنیم ، عملیات نمایش ، آپدیت و حذف انجام نمیشد مگر اینکه قبلش اطلاعات(حداقل یک نفر) insert میشد ، بعد از اون برنامه درست کار میکنه تا اجرای بعدی.اگه میشه مشکل برنامه رو چک کنید
با سلام و تشکر از آموزش خوبتون؛
آیا امکان این هست که ما دیتابیس ، جداول ، ویوو ها و دیتای اولیه مورد نیاز اپلیکیشنمون رو جداگونه بسازیم و در اندروید استودیو فقط آدرس فایل دیتابیس رو بدیم و دیگه با توابع onCreate و onUpgrade در کلاس SqlManager کاری نداشته باشیم.چون در حالت توسعه اپلیکیشن دیتابیس ممکنه خیلی تغییر کنه و استفاده از SQLite Browser خیلی راحت تر هست. ممنون از شما.
بله. فکر کنم مثالهای موجود در نت که مربوط به آموزش ساخت کتاب اندرویدی هستن شما رو سریعتر به جواب برسونه. در ساخت مواردی مثل کتاب، دیتابیس از قبل تکمیل و به اپ اضافه میشه
سلام خیلی ممنون از سایت خوبتون
چند هفته ای هست که اندروید کار میکنم و همه آموزش ها رو تا این فصل خوندم .
میخواستم ببینم میشه جدولی در اکتیویتی ایجاد کرد که دیتابیس در اون نمایش داده بشه و کاربر بتونه همه اطلاعات وارد شده در تیبل رو با هم مشاهده کنه؟
بله. یه سرچ بکنید حتما باید مثالی باشه
مثلا
how to show all database rows in android
یا…
همچنین میخواستم بدونم شما کلاس خصوصی هم برگذار می کنید ؟
خیر
سلام
من کامل مراحل رو جلو رفتم و پیغام
data base created
هم میبینم در logcat
ولی فایل دیتای من در android device monitor خالی هست
رو دیوایس مجازی اجرا می کنید یا دیوایس واقعی؟
من تو بخش اضافه کردن فایل جاوا برای ایجاد دیتا بیس مشکل دارم و اررور میده:
Unable to parse template “Class”
Error message: This template did not produce a Java class or an interface
امیدوارم قبلش سرچ کرده باشید ارور رو. من به این لینک رسیدم:
https://stackoverflow.com/questions/45497266/unable-to-parse-template-class
خیلی ممنون وتشکر از آموزش های مفیدتون
سلام خیلی عالی بود
فقط برای حرکت بین رکورد ها جلو و عقب رفتن
و نمایش رکورد ها در جدول هم توضیح بدید ممنون می شم
سلام و خسته نباشید
من قصد خرید این آموزش رو دارم (https://android-studio.ir/android-sqlite-database/)
فقط امکانش هست که یه فایل دموی اندروید از برنامه رو بفرستین که ببینیم همون چزیزی هست که می خوام که بعدش خریدش کنم؟باتشکر
فعلا امکانش نیست بزرگوار.فکر میکنم از تصویر آخری بتونید متوجه بشید این آموزش مناسب شما هست یا خیر
هزینه آموزش فوق رو پرداخت کردم اما موفق به دانلود نشدم
سلام. پرداخت شما نهایی نشده و اگر مبلغی از حسابتون کسر شده مجدد برمیگرده. لطفا مجدد اقدام کنید
سللام
فایل رو بنده خریداری کردم ولی متاسفانه دانلود نمیشه.
لطفا رسیدگی کنید.
باتشکر
با سلام. لینک دانلود مجدد ارسال شد به ایمیلتون. لطفا بررسی بفرمایید
سلام شما که اموزش به این خوبیرو دادین کاشکی اموزش رو کامل تر میکردین چجوری یک فای sql رو فراخانی منظورم از طریق فولدر اسست هست یاد میدادین چجوری داخل ریسایکلر ویوو نشون داد خیلی بهتر بود یا جدا کنین بزارین برای فروش من خریدارم
سلام. آموزشهای غیر رایگان در حد مباحث پایه و اصلی هست. مابقی موارد به صورت رایگان و ان شا الله در آموزشهای آینده بهش پرداخته میشه
سلام و خسته نباشید خدمت استاد گرامی
آموزشهاتون بسیار عالی هستن و واقعا ممنونم
یه سوال :
من از لیست ویو آیتمهارو میفرستم به دیتا بیس و با یه متد آی دی هر ایتم رو میگیرم
اما اگه آیتمهای داخل لیست ویو یکی باشه
( مثلا دوتا اسم هم نام )
همون آی دی رو به جفتشون اختصاص میده … نمیدونن چرااا!
در صورتی که ستون ای دی primarykay و unique هستش
آی دی رو autoincrement هم قرار بدید
ممنون از آموزش های خوبت عزیز،
::لینک های DB Browser for SQLite و SQLiteStudio جابجا خورده، دیدم همه چیز سایت خیلی کامله، گفتم این رو هم بگم اصلاح شه 🙂
ممنون از دقت شما. اصلاح شد
سلام
این آموزش دیتا بیس که قرار دادید روی سایت کل اون چیزی هست که ما باید در مورد دیتا بیس بدونیم ؟
مننظورم این هست که روش های دیگه ای نداریم برای ایجاد دیتا بیس ؟
آیا با همین روش میتونیم به راحتی یک کتاب اندرویدی بسازیم؟
و این که من نتونستم از طریق Android Device Monitor به دیتا بیس دسترسی داشته باشم و مثل آموزش از اون یک کپی بگیرم در حالی که تو آموزش شما گفتید اگر دیتا بیس درون پوشه data نبود یعنی اینکه دیتا بیس ساخته نشده و یک جای کار ایراد داره ولی دیتا بیس ساخته شده چون من بستن برنامه و اجرای اون به اطلاعات دخیره شده دسترسی دارم…حالا سوال اینجا ست که چرا تو پوشه data من به فایل دیتا بیس دسترسی ندارم؟
کلیت کار با دیتابیس همین هست. برای آشنایی بیشتر برای ساخت کتاب میتونید سورسهای رایگان کتاب اندروید که در سطح وب هست رو دانلود و بررسی کنید
در مورد سوال دوم، احیانا پروژه رو روی دیوایس واقعی تست نمیکنید؟
خیر … از طریق شبیه ساز به دیتا بیس دسترسی ندارم … البته اون طور که دیدم این سوال من رو بقیه هم قبلا هم پرسیدن که به دیتا بیس دسترسی ندارند ولی جوابی دیافت نکردند …ولی چه جوری میشه ما حالا اگر بخوایم به دیتا بیس دسترسی داشته باشیم که بتونیم از اون یک کپی بگیریم حتی رو دیوایس واقعی هیچ راهی وجود نداره؟
رو دیوایس واقعی بنده یکبار تست کردم و نتیجه نگرفتم. ولی دنبالش نرفتم که آیا راهی هست یا نه. در خصوص اینکه چرا روی شبیه ساز دیتابیس رو نمیبینید من چون خودم به مشکل برنخوردم، تا این لحه نرفتم دنبال دلایلی که میتونه داشته باشه. لطفا سرچ بفرمایید
سلام ممنون از سایت خوبتون. من بخش دیتا بیس مربوط به آموزشهای شما رو خیلی مطالعه کردم اما باز هم نمیدونم چه جوری جدول مربوط به جدول کلمات متقاطع رو درست و فراخوانی کنم. اگه منبع دیگه ای دارین لطفا معرفی کنین. خیلی ممنون.
آدم گیج میشه من تو ده ج درباره SQLite خوندم و هر جا از یه روشی استفاده میکنه
موندم به خدا
مسلما روشها تفاوتهایی داره. گیج شدن هم در ابتدای مطالعه مباحث جدید طبیعیه. یه تعداد آموزش رو که مطالعه و مقداری تمرین کنید در نهایت دستتون میاد. منتها بنده سعی کردم ساده ترین و در عین حال به روزترین متدها رو استفاده کنم.
سلام ؛
خدایی این sqlite سخت نیست؟ ی چیزی شنیدم در مورد دیتا بیس realm می گن بهتره .اونو برم یاد بگیرم بهتر نیست؟از این راهت تر نیست؟
از این بهتر نیست؟
اگه نه مشکلش چیه؟
خیلی ممنون.
برای هر مورد در برنامه نویسی اندروید و سایر حوزه ها راهکارهای متفاوتی هست. اما توصیه اینه که ابتدا راهکار رایج و پیش فرض رو یاد بگیریم. بعد بریم سراغ روشهای جایگزین و کوتاهتر. اینطوری مزیت های روش جایگزین رو بهتر درک میکنید. بهتره توسعه دهنده ابتدا مسائل پایه رو یاد بگیره بعد بره سراغ مباحث تکمیلی
پس اول همین sqlite رو می رم جلو بعدش اون.
خیلی ممنون.
سلام
امکانش هست این برنامه ای که نوشتید رو تغییر بدید و یک listview بذارید که اطلاعات ذخیره شده ،در لیست ویو، در اکتیویتی ،اصلی نمایش داده بشه؟
میدونم که سرچ کنم پیدا میشه اما مدام برنامم کرش میکنه.
اگر تونستید بذارید.ممنون
سلام من پرسیده بودم که sqlite من مشکل پیدا کرده و نمیشه اطلاعات به جدول ها اضافه کنم
و اینکه تازه چنین مشکلی پیدا کرده حذف و دوباره هم نصب کردم مشکل حل نشد :(((
شما سوالتون رو تو مطلب پرسش های رایج پرسیدید. من جواب دادم. اونو ندیدید مجدد اینجا همون سوال رو تکرار می کنید!
سلام من برنامه را طبق روش خودتون نوشتم اما دیتابیس تو مسیر Data ایجاد نشده .
برنامه اجرا میشه و ورودی را میگیره پیغام های log را نشون میده اما چیزی توی دیتابیس نیست .
لطفا پاسخ دهید
بزرگوار این که فرمودید دیتابیس ایجاد نشده کسی نمیتونه راهنمایی کنه. باید بررسی کنید کجای کار ایراد داره
منم همچین مشکلی دارم. دیتابیس ایجاد شده چون چند بار برنامه رو بستم و باز کردم همه فراخوانی ها از دیتابیس رو به درستی انجام میداد ولی تو صفحه Android Device Monitor پوشه data خالیه!
بررسی کردم دیدم همچین مشکلی بقیه هم داشتن:
https://stackoverflow.com/questions/13006315/how-to-access-data-data-folder-in-android-device
https://stackoverflow.com/questions/34603355/android-device-monitor-data-folder-is-empty
ولی متوجه نشدم راه حل چیه
اگه رو دیوایس واقعی ران میکنید فایل دیتابیس رو نشون نمیده
سلام مهندس
اینم سورس
این ۳تا مربوط به هم هستن یک نگاه کنید بی زحمت
http://s8.picofile.com/file/8301555442/DatabaseForHesabdari.java.html
http://s9.picofile.com/file/8301555450/DastehayekoliActivity.java.html
http://s9.picofile.com/file/8301555484/DastebandiItem.java.html
چه اروری میگیرید؟
برنامه متوقف میشه
اینم خدمت شما اروری که ظاهر میشه
اینم لینک AndroidMonitor
http://s9.picofile.com/file/8301537284/android_manitor.png
والا من به نتیجه ای نرسیدم
سلام کمک میخواستم مشکل این خطم چیه؟
String sq = ” SELECT ID,NameDastehayeKoli FROM tb1_dastehayekoli WHERE NoeDastebandi = ‘” + noeDastebandi + “‘”;
دیتابیسم اینه
db.execSQL(“CREATE TABLE tb1_dastehayekoli ( \n” +
” ID INTEGER PRIMARY KEY AUTOINCREMENT\n” +
” NOT NULL\n” +
” UNIQUE,\n” +
” NameDastehayeKoli VARCHAR( 50 ),\n” +
” NoeDastebandi VARCHAR \n” +
“);\n”);
db.execSQL(” INSERT INTO tb1_dastehayekoli (NameDastehayeKoli,NoeDastebandi) VALUES (‘سود’,’Daramad’) “);
db.execSQL(” INSERT INTO tb1_dastehayekoli (NameDastehayeKoli,NoeDastebandi) VALUES (‘دستمزد’,’Daramad’) “);
db.execSQL(” INSERT INTO tb1_dastehayekoli (NameDastehayeKoli,NoeDastebandi) VALUES (‘فروش’,’Daramad’) “);
لطفا سورس رو داخل فایل تکست آپلود و لینکش رو اینجا بذارید
سلام
ممنون بابت آموزش.
من یه سوالی داشتم، چرا همهجا برای برنامههای اندروید از دیتابیس SQLite استفاده میشه؟ آیا این دیتابیس فقط مخصوص اندرویده؟ چون من داخل PHP هم دیدم که از SQLite استفاده میشه.
خیر مخصوص اندروید نیست. دلایلش داخل متن توضیح داده شده
اینکه گفتید برای جلوگیری از کرش برنامه در قسمتdelete، شرط بگذاریم..من شرط نذاشتم و شناسه ای غیر از شناسه های ذخیره شده وارد کردم اما مشکلی چرا پیش نیومد؟
شاید مشکلی پیش نمیاد 🙂
در صفحه ی ۷۵ گفتید کهdelete مقدار long برمیگرداند در حالی که فکر می کنم مقدار int برمی گرداند.لطفا جواب صحیح را بدهید…
خیر. long برمیگردونه
امکان دسترسی به فایل ها از طریق گوشی و نه شبیه ساز، وجود نداره؟
اگه منظورتون فایل دیتابیس هست داخل آموزش توضیح داده شده
سلام.منظورتون دکمه ی نمایش هست؟
اینکه همه ی اطلاعات رو بتونیم یه جا ببینیم ، مثل اینکه انتقال بدیم به sqlitestudio
بزرگوار متن آموزش رو با دقت بخونید. توضیح داده شده!
سلام خسته نباشید ،
خیلی ممنون تمیز و شیک و عالی توضیح دادین ،
سوال داشتم ، اینکه داخل آموزش ها مثلا این هست که ، با وارد کردن مثلا ID فرد ، اطلاعات اون داخل تکس ویو یا هرچی دیگه بیاد ، و حالا تغیراتی ایجاد کنیم ، و دوباره ثبت دیتا بیس کنیم ؟
ممنون هر روز چک میکنم سایتو
سلام. خواهش می کنم. متاسفانه سوالتونو کامل متوجه نشدم
مهندس جان سلام.
من همه ی آموزش ها رو هم خوندم و هرچی هم که باید خریده میشد رو خریدم.خواستم یه خسته نباشید جانانه تقدیم حضورتون کنم.بسیار بسیار عالی و بدون عیب و نقص بودند.
واقعا احسنت و ممنون از لطفی که در حق همه ی دوست داران اندروید کردی.سپاس
سلام دوست عزیز
خوشحالم ازینکه مورد قبول شما قرار گرفته. موفق باشید
سلام
فایل همراه برنامه رو ، وقتی توی اندروید استودیو باز می کنم، ویجت های رو ی اکتیویتی رو نمایش داده نمی ده ، دلیلش چی میتونه باشه
موقع ران کردن هم نمایش نمیده؟
با سلام.
از اینکه موفقیتهای شما رو پس از برنامه نویسی و کار در عرصه سایت نویسی و طراحی سایت میبینم خیلی خوشحال میشم.
یادمه چندسال پیش ازتون درباره طراحی سایت و برنامهه نویسی سایت اطلاعات میخواستم گفتید که میخوام بیام عرصه برنامهه نویسی آندروید. الان میبینم چقدر پیشرفت داشتید و کارتون عالیه. من از مخاطب های سایتتون بودم و نمیدونستم این سایت مال همشهریمه! ۲۰
سلام جناب بذرافشان. ممنون
ان شا الله شما هم هرجا هستید موفق و پیروز باشید
من داخل super انجام میشه ولی داخل متد override شده oncreate نمیشه دلیلش چیه
بله؟
من این اموزش تهیه کردم در نمایش اطلاعات فقط یک سطر از پایگاه داده بر میگردونه اگه چند سطر بخوام لطفا توضیح بدین یا ی پیج برای رفع مشکلات و ارتباط با نویسنده بذارین
در خصوص دیتابیس اندروید (انگلیسی یا فارسی) سرچ بفرمایید مثالهای زیادی هست که به جواب می رسید بزرگوار
تشکر از آموزش های مفید شما
امیدوارم با قوت ادامه بدید
امکان این هست که این دیتابیس به صورت آنلاین باشه و اطلاعات رو هر لحظه بشه بروز کرد؟!
بله. سرچ بفرمایید مطالبی در این خصوص در سایتها موجوده