آموزش دیتابیس در اندروید (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 قرار دارد
با توجه به اینکه آموزشهای پایه با قیمت پایین در اختیار کاربر قرار گرفته و درآمد حاصل صرف تامین هزینههای وب سایت و تهیه آموزشهای آتی میشود، به اشتراک گذاری این فایل با دیگران خلاف اخلاق است.
تعداد صفحات : ۸۴
حجم : ۴ مگابایت
قیمت : ۴۶ هزار تومان
تاریخ بروزرسانی آموزش : ۱۴۰۲/۰۱/۲۳
توجه: صرفا در صورتی از درگاه پشتیبان استفاده کنید که قادر به پرداخت از طریق سبد دانلود نباشید.
افزودن به سبد دانلود درگاه پشتیبان
سلام وقت بخیر
امکانش هست ی که دیتابیس حاوی اطلاعاته رو هنگام نصب برنامه روی دیوایس کاربر بریزیم و برنامه از روی اون دیتابیس اطاعات رو بخونه و روی برنامه به کابر نمایش بده؟
اگه امکانش هست چجوری باید این کارو انجام بدیم؟
بله. همین آموزش رو اگه مطالعه کرده باشید نحوه تزریق داده به دیتابیس توضیح داده شده
سلام استاد
یک پیشنهاد داشتم و یک سوال :
اول اینکه من کل آموزشهای شما رو امروز خریداری کردم . یک مشکلی که فکر می کنم سایتتان دارد این است که حتی برای من که سابقه طراحی سایت دارم ، کمی منوی سایتتان ، گیج کننده است . یعنی به جهت اینکه سایتتان انگار چند منو دارد ، تشخیص اینکه آیا همه ی مطالب سایتتان ، خوانده شده است یا نه ، سخت هست . من قبلا که سایتی برای آموزش زبان آلمانی در بلاگفا و فقط با اسکریپت ها طراحی کرده بودم ، تمام موارد آموزشی ، در یک منو ، گنجانده شده بود که لینک ظاهری آن را برایتان گذاشته ام :
https://s6.uupload.ir/files/de1984_dla.png
سوالم این هست : امروز که تمام موارد آموزشی تان را خریدم ، علارغم آموزش های کاملی که دادید ، به نظرم نیامد که آموزش ارتباط اپلیکیشن با دیتابیس هایی مثل اوراکل را در آن آموزش داده باشید . می خواستم خواهش کنم آموزش این را هم حتما بگذارید و یا معرفی بفرمایید که برای یادگیری ، به کدام سایت مراجعه کنیم .
ضمن اینکه تلگرام فیلتر هست و فیلترشکنها هم هر چند وقت یکبار مسدود می شوند . خواهش می کنم در نرم افزارهای ایرانی مثل روبیکا که محیطی شبیه به اینستاگرام دارد و یا نرم افزار بله یا ایتا ، کانالی بجای تلگرام باز کنید .
باز هم از اینکه این همه مطلب به ما یاد دادید ، ازتون ممنون هستم .
سلام. خسته نباشید. چطور میشه از یک دیتابیس که از قبل ساخته شده در اندروید استودیو استفاده کرد ؟
من با استفاده از اندروید استودیو یک دیتابیس ساختم و فایل اون دیتابیس رو دارم الان میخوام در یک برنامه دیگه از این دیتابیس استفاده کنم. این کار چطور انجام میشه ؟
https://www.geeksforgeeks.org/how-to-view-and-locate-sqlite-database-in-android-studio
سلام
من یه دیتابیس خارجی دارم با یه تعداد ردیف (مثلا ۲۰۰ تا) که از پوشه assets کپی می کنم داخل گوشی کاربر. توی این دیتابیس یه ستون برای علاقه مندیها هست که توسط کاربر تغییر می کنه. حالا سوال اینه که چطور در ورژنهای بعدی دیتابیس که مثلا چندین ردیف دیگه به اطلاعاتم اضافه کردم:
۱-هم بتونم اون ستون علاقه مندیهای کاربر رو حفظ کنم و
۲- هم این که دیتابیس جدید رو جایگزین قدیمی بکنم.
سلام و درود
من برنامه SQLiteStudio که ظاهرا رایگان هست رو دانلود کردم.توی چنین برنامه ای حداکثر چند تا ستون یا ردیف میشه ایجاد کرد؟چون من می خوام یه کتاب قوانین درست کنم نیاز هست زیاد ردیف بسازم.ممنون بابت سایت خوبتون
محدودیتی وجود نداره
سلام و احترام و تشکر بابت سایت خوبتون یک سوال داشتم که خیلی ممون میشم راهنمایی بفرمایید من اگر بخوام یک دیتا بیس خارج از اپ لیکیشن داشته باشم که تمام کاربرا که اپ اندرویدی دارند بهش وصل بشن و تغیرات اعمال کنند نیاز به چه چیزهایی دارم ؟به ذهن خودم این جوری باید باشه که:۱) نیاز به یک وب سرویس هست توی بعضی اموزش های ویدیویی با زمپ این کارو کردم اما من درک نکردم اگر بخوام تو حالت واقعی این کارو بکنم نیاز به چه چیزایی دارم مثلا نمیدونم باید یک سرور به صورت سالانه اجاره کنم و ۲)در کنارش هم باید یک دیتا بیس مثلا mssql یا mySql باید داشته باشم یا اصلا خود اسکیوال لایت این قضیه را ساپرت میکنه هر چقدر هم که میگردم بازم تهش منتهی میشه به زمپ یا ومپ که داخلشون یه سرور آپاچی هست و دیتا بیس مای اسکیوال ولی من نیاز به یک دیتا بیس واقعی و اعمال تغیرات واقعی از سوی هر کاربر را دارم خیلی ممنون میشم راهنمایی بفرمایید و اگر لینک اموزشی (چه آموزش های خودتون و چه سایت دیگه )دارید جهان سپاس.🙏🏽🙏🏽
بله شما نیاز به تهیه یک فضای متصل به اینترنت دارید تا کاربر دائما بتونه به دیتابیس متصل بشه. حالا اینکه سرور اختصاصی باشه یا مجازی یا صرفا یه هاست اشتراکی به حجم کاربرها و تعداد کانکشن های همزمان بستگی داره
سلام و خسته نباشید.
اگر بخوایم آیتم های یک لیست ویو را ذخیره کنیم باید چکار کنیم؟
سلام خسته نباشید.
من آموزش رو به پایان رسوندم. منتها مشکلی است. من مو به مو کار هایی که گفته شده بود را انجام دادم ولی بعد از کار با برنامه ام ، وقتی برنامه را میبندم و دوباره باز میکنم همه اطلاعات قبلی پاک میشه و اصلا ذخیره سازی نمیشه.
اشکال ممکنه از چی باشه؟
Logcat رو بررسی کنید ببینید چه اروری دریافت میکنید و علت ذخیره نشدن داده چیه
سلام
استاد آموزش دیتابیس Room رو هم قرار بدین جاش خالیه
ایشالا فرصتش فراهم بشه چشم حتما
سلام. من خیلی به برنامه نویسی آشنایی ندارم، سوالم اینه ممنون میشم راهنماییم کنید:
من یه جدول دارم شامل ۱۰۰ تا خودرو که میخوام به همراه اسم مالکشون و شماره موبایلشون اگر بشه بصورت یک اپ اندروید دربیارم.
آیا برنامه ای هست که با کمترین دانش حوزه برنامه نویسی وبیشتر با آبجکتها بتونم این اپ رو عملیاتی کنم؟
سپاس از لطفتون.
راجع به سایر گزینه ها (در برابر اندروید استودیو) اطلاع و تجربه ای ندارم متاسفانه
سلام مهندس/بنده آموزش رو تمام کردم و در آخر پروژه می خواستم برنامه رو اجرا کنم/ اجرا نمی شه و متوقف میشه و این ارور رو میده
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 و ارتباط دو جدول بزارید یا بخشی از آموزش را به این مبحث اختصاص بدین
ممنون
سلام چجوری میتونیم با یه دیتابیس SQLite ک ساختیم و وجود داره و اطلاعات توش ذخیره شده برای پر کردن Spinnerو List View استفاده کنیم و برای ذخیره تو یه table دیگ Id ها رو از اون بگیرم
گوگل کنید:
load listview items from database
با سلام من تدریس می کنم آیا بعد از خرید اجازه دارم از روی pdf ها آموزش دهم؟؟؟
اگه بخواید صرفا محتوای این آموزش رو بازنویسی کنید که خب نوعی کپی محسوب میشه اما اگه با مطالعه این منبع و سایر منابع بتونید مبحث دیتابیس رو یاد بگیرید و بعد از دانش خودتون برای تهیه آموزش استفاده کنید مسلما مانعی نداره
موفق و پیروز باشید
سلام وقتتون بخیر
من برنامه رو که مینویسم تمام قسمت ها کار میکنه به جز نمایش
برنامه رو میبنده ممنون میشم راهنمایی کنید
موقع اجرا Logcat رو بررسی کنید ببیند چه قسمتی ارور میگیرید که باعث میشه برنامه کرش کنه
سلام
من ممیخوام جنتا جدول ایجاد کنم نمیشه
تا ۲ تا جدول ایجاد میکنم ولی سومیرو نمیسازه
اینو میدونم که یه کلاس باید بسازم و جداولی که نیاز دارمو تو همون کلاس بسازم که هنگام اجرا برنامه جداولمو بسازه اما دوتا میسازه
با کمی تغییرات مشکل بر طرف شد…
یک کلاس ساختم به نام database که از sqliteopenhelper ارثبری میکنه و اومدم دستورات ساخت جداولمو بهش دادم
بعد برای هر جدول یه کلاس جدا با همون قوانین ارثبری برای select insert delet ساختم….
——————————————————————————————
من برنامه نویس php هستم و تو mvc سمت ,وب ما میایم یک کلاس تعریف میکنیم که کل کارا دیتا بیس و خودش انجام میده یعنی نام جدول و دیتا هارو بهش پاس میدیم. میخام ببینم با جاوا و اندروید استادیو میشه همچین کاری کرد…. یعنی یه کلا بسازیم برای ایجاد جداول و یه کلاس برای مدیریت کل جداول به جای اینکه برای هر جدول یه کلاس تعریف کنیم.
با سلام و خسته نباشید.
می خواستم بپرسم که آیا با این کلاس SqlLiteOpenHelper که معرفی کردید، می شه دیتابیس پسوورد دار ساخت؟
یعنی در ابتدای Create کردن دیتابیس، یک رمز عبور برای ورود بهش ست بشه.
حتی وقتی که توسعه دهنده می خواد در محیط ویندوز یا Database Viewer ، پایگاه دادشو باز کنه.
در این مورد اطلاعی ندارم عزیز
Sqlite یک دیتا بیس کم حجم محلی میباشد که معمولا روی دیوایس های شخصی مثل موبایل و تبلت نصب میشه…
من پیشنهاد میکنم برای ویندوز از sqlserver
برای لینوکس از mysql
برای موبایل از sqlite استفاده کنید و بعد اگه نرم افزارتون انلاین و یا تو یه شبکه محلیه با json اطلاعاتو بین هم دیگه رد و بدل کنید.
برای ایجاد رمز و دسترسی ها هم داخل برنامه اقدام کنید…
البطه این روشیه که من انجام میدمو تا الان موفق بوده
سلام و آرزوی قبولی طاعات . من تا مرحله دخیره اطلاعات کد نویسی کردم و برنامه اجرا میشه و خطایی ندارم همینطور وقتی داده وارد میکنم هم خطا ندارم . اما لاگ ساخت جدول نمایش داده نمیشه تمامی مقادیرر را مو به مو مشابه شما وارد کردم برای ساخت جدول اما دیتایی ندارم در جدول ایجاد شده . اگر ممکنه راهنمایی بفرمایید
سورس پروژه رو ایمپورت و تست کنید ببینید بازم مشکل دارید؟
سلام. ببخشید ولی باید یه انتقادی بکنم.
من فکر میکنم زبان تخصصی شما جاوا نبوده چون اصطلاحات رو کاملا در جای اشتباه به کار میبرید مثلا به کلاس میگید متد! در این مورد لطفا بیشتر دقت کنید. از منابع خیلی فوقالعاده برای افرادی که میخوان برنامه نویسی رو با اندروید و جاوا شروع کنن، سایت جاواکاپ آموزش های جاوای عالی داره که خیلی کمک به من کرد.
و مسئله بعدی اینکه واقعا اصلا مفهومی آموزش نمیدید. یعنی دارید برنامه نویسی رو حفظی آموزش میدید! مثلا من اصلا نفهمیدم Cursor چه کلاسیه و چیکار میکنه و این متد هایی ازش فرا خوندیم چین. چون که فقط گفته بودید اگه روی Cursor متد getCount رو بزنید تعداد سطر هارو میده حالا برید این کد رو حفظ کنید! همچنین در مورد Content values و آرایه هایی که پاس کردیم به متد ها توضیح مفهومی نبود.
البته من از خریدم راضی هستم ولی اینا خیلی آزاردهندهس.
سلام. ممنون از انتقادتون
اگه مورد یا مواردی کلاسی رو اشتباها متدعنوان کردم یا بلعکس متد رو کلاس نوشتم عذرخواهی می کنم.
در مورد مفهومی آموزش دادن اما اینجا قصد آموزش جاوا نیست. فرض بر اینه که قبلا با جاوا آشنا شدیم و داریم تو اندروید ازش استفاده می کنیم. اگه قرار بود جاوا هم در حین مباحث اندروید آموزش داده بشه که دیگه نیازی نبود برای فصل اول، آموزش زبان جاوا سکان آکادمی رو معرفی کنم. البته این آموزش مربوط به اوایل راه اندازی سایت هست و حس میکنم با گذشت زمان، تو تهیه و نگارش مطالب یه مقدار پیشرفت داشتم. ممنون میشم آموزشهای اخیر رو بررسی بفرمائید و نظرتون رو منتقل کنید (چند آموزش اخیر همگی رایگان هستن)
ممنون که وقت گذاشتید برای انتقادتون
موفق و پیروز باشید
سلام مجدد! البته من هم منظورم آموزش مفهومی خود اندروید بود نه جاوا چون که خودتون هم گفتین که تکلیف جاوا فصل اول روشن شد. انشالله وقتی که به مطالب پایانی رسیدم نتیجه کلی ام رو بیان میکنم. اما غیر از این، من با مطالعه بقیۀ سایت ها فهمیدم که شما همیشه اول خیلی مفهومی تر از همه شروع میکنید اما وقتی کار به جا های حوصله سر بر و نکات ریز میرسه کد ها رو مینویسید و رد میشید! و اما از نظر دیزاین و تجربه کاربری سایتتون فوق العادهس 🙂
ممنون. ان شا الله سعی میکنم این نقص رو هم در برطرف کنم
سلام ببخشید من داشتم طبق اموزش شما پیش میرفتم فقط اسما یکمی تفاوت دارند ولی به این ارور رسیدم
http://s10.picofile.com/file/8392935842/Untitled.png
ارور که اینجا مشخص نیست. موس رو ببرید روی قسمتهایی که ارور دادن ببینید چی هست ارورها. ترجمه یا سرچشون کنید
درود
وقت بخیر
توی متد های مربوط به ویرایش و حذف رکورد توسط دستور close ارتباط با دیتابیس را قطع نکردید.(فقط در متد اضافه کردن رکورد جدید از close استفاده کردید)
این موضوع دلیل خاصی داره یا اینکه بهتر بود توی همهی متدها از close استفاده کنیم.
با سپاس
شرمنده که با تاخیر جواب میدم سوالتون رو. بستن یا نبستن دیتابیس خیلی اهمیتی نداره در حالت عادی. یه گزینه بهتر میتونه این باشه که دیتابیس فقط داخل متد onDestroy اکتیویتی close بشه. یعنی با متوقف شدن اکتیویتی، کانکشن دیتابیس هم بسته بشه
با سلام و خسته نباشید
آقای مهندس بنده به تازگی وارد این حوزه شده ام و میخواستم ببینم برای نوشتن اپ هایی که هر منو زیرمنوی دیگری دارد نیز به یک جدول نیاز است؟ بطور مثال یک کتابخانه. که وقتی بر روی نام کتاب کلیک کنیم فصلها ظاهرشود و سپس با کلیک بر روی هر فصل زیربخش دیگری باز شود
هم میتونید آیتم ها رو از دیتابیس بگیرید هم اینکه داخل خود منو تعریف بشه
جناب مطهری من همه مراحل رو طی کردم و کدها رو چندبار مرور کردم همه چی اوکیه اما وقتی اپ رو ران میکنم هم توی emulator و هم روی دیوایس واقعی , وقتی روی دکمه ذخیره کلیک میکنم اپ استاپ میشه. توی android divice manager که چک کردم ظاهرا اصلا جدول م ساخته نشده. این مشکل ساخته نشدن جدول رو چطوری حل کنم؟
سپاس
Logcat رو بررسی کنید بینید بعد کلیک روی دکمه ذخیره، چه مشکلی پیش میاد که جدول ساخته نمیشه
درود
میشه لینک دانلود sqlitestudio رو بزارید….
اینترنت ملی هست دسترسی به گوگل ندارم… موتورهای وطنی هم که افتضاح ن….
ممنون میشم لینک رو بزارید
خدمت شما (سرور ایران)
http://dl2.android-studio.ir/utility/InstallSQLiteStudio-3.2.1.exe
سپاس بیکران جناب مطهری….
اقا یه سوال دیگه هم دارم خدمتت….
واسه لپ تاپی که بشه باهاش اندروید استودیو را به راحتی کار کرد, فقط رم و سی پی یو رو در نظر بگیریم؟
میشه یه راهنمایی بکنید که چه سیستمی رو بخریم؟ ( اگر یک مشخصات متوسطی رو بگید ممنون میشم.)
اگه SSD داشته باشه خیلی بهتره. گرافیک اهمیتی نداره. رم حداقل ۱۲٫ سی پی یو حداقل i5
سلام
اگر بخوایم جدول اضافه کنیم باید چیکار کرد؟
کاش بعضی اموزش ها رو بیشتر گسترش میدادید
سلام. بعد از تکمیل آموزشهای ضروری، به امید خدا مطالب قبلی تکمیل میشه
سلام اگه بخوایم از عکس توی پایگاه داده استفاده کنیم باید چیکار کنیم؟ممنون
تو این مورد تجربه ای ندارم. سرچ بفرمایید
سلام
میتونید از کتابخانه Picasso استفاده کنید.
پیکاسو آدرس اینترنتی (url) تصویرو میگیره و در جای مناسب که شما انتخاب کردید که یک ImageView هست قرار میده…
سلام
ببخشید برای نمایش لیست محصولات در اپلیکیشن فروشگاه آنلاین از sql باید استفاده کنیم؟ به چه صورت میتونم اینکارو بکنم؟
خیر لیست و مشخصات محصولات رو باید از سرور دریافت کنید نه دیتابیس محلی. مبحث وب سرویس رو مطالعه بفرمایید:
https://android-studio.ir/web-service/
دسترسی به بانک خارجی هم آموزش بدید لطفا.این مطلب کافی نیست برای پروژه واقعی
مبحث Retrofit رو مطالعه بفرمایید
سلام خسته نباشید
چرا دیتابیس خارجی ساختین ولی ازش استفاده نکردین؟
من توی اتصال دیتابیس خارجی به برنامه مشکل داشتم و از این آموزش چیزی دستگیرم نشد!
قسمت اول صرفا جهت آشنایی با دیتابیس و SQLite هست که در متن هم ذکر شده.
سلام تونسنی مشکلت رو حل کنی؟؟ منم همین مشکل رو دارم
سلام.وقتتون بخیر.
من همه مراحل رو انجام دادم.وقتی همه تکست ویوها رو پر میکنم و دکمه ذخیره رو میزنم برنامه میپره بیرون.اروری هم ک داخل لاگ میده failed bineder transaction هست.
احتمالا روی یکی از تکست ویو ها یک داده طوالنی وارد میکنید
سلام وققتون بخیر .ایا از sqlite studio میشه برای فایل پی دی اف کتاب یا متن هم استفاده کرد ؟ نرم افزار کتاب اندروید رو فایل پی دی افش رو داخل sqlite studio بارگزاری کرد ایا امکانش هست ؟ممنون میشم از راهنماییتون .
پی دی اف فایل هست. فقط متن رو میتونید داخل دیتابیس ذخیره کنید
سلام من پروژه کار با sqllite را خریداری کردم ولی الان پروژه با اندروید ۳٫۳٫۱ بیلد نمی شود چطور می توانم پروژه را با گریدل بالاتر بیلد کنم
https://android-studio.ir/import-android-project-in-android-studio
با سلام
دیتابیس من نمایش داده نمیشه (داخل دیواس واقعی)
چطور میتونم فایلی که ایجاد شده رو ببینم؟
همچنین قسمت نمایش واسه من کار نمیکه!!!
قسمت نمایش در نسخه جدید اندروید استودیو دچار تغییرات شده. سرچ بفرمایید
سلام و درود… ممنون از اموزش های خوبتون.
در این فایل ، وارد کردن نام و رمز ورود توسط کاربر و بررسی درست یا اشتباه بودن آن هنگام ورود انجام میشه؟
خیر این آموزش صرفا ذخیره و بازیابی داده ها هست÷
سلام وقتتان بخیر
من احتیاج دارم که فایل dbبهjsonتبدیل کنم با نرمافزاررDB Browser for SQLiteامکان داره دوستان راهنمایی لازم رو برام ارسال کنند .ممنونم
با سلام ببخشید
یک سوال دارم
طبق اموزش شما در فصل ۱۰ درباره ی وب سرویس من متوجه شدم که برای خوندن اطلاعات از یک وب سایت و نمایش اون توی اپلیکیشن موبایلی هست.
توی این اموزش شما درباره ی گذاشتن صفحه ورود و ثبت نام صحبت کردید که کاربر اطلاعاتش را وارد کنه. ذخیره کنه , درسته؟؟
من فکر نمی کنم به بحث وب سرویس ربطی داشته باشه
اگه میشه لطفا کنید راهنمایی کنید
من دقیقا نمی دونم!!
خیر این دو مسئله ارتباطی به هم نداره. اینجا اطلاعات روی دیتابیس داخلی نرم افزار (روی دیوایس) ذخیره میشه ولی در وب سرویس، تبادل و ذخیره اطلاعات روی سرور انجام میشه
با سلام
امکانش هست نحوه ی نمایش دیتا بیس روی یک لیست ویو رو آموزش بدید مثلا نمایش یک لیست از اسامی ذخیره شده در دیتا بیس رو در لیست ویو با تشکر
با سلام و عرض ادب
ی سوال داشتم
بعد از خرید آموزش و انجام کلیه کار ها
می تونم یک صفحه برای ثبت نام و ورود کاربران در اپلیکیشن قرار بدم ، و اونها با اتصال به اینترنت وارد حساب کاربریشون بشن یا و ثبت نام کننن و البته تمامی کارهایی که در برنامه ذخیره می کنن و بعد خارج میشن و وارد میشن بتونن همون اطلاعات (مثال : لیست علاقه مندی و… ) ها رو دوباره ببینن.
ممنون میشم راهنمایی کنید
تشکر….
این قابلیت مربوط به مبحث وب سرویس میشه (فصل ده) که بخش اولش منتشر شده و بخشهای بعدی در حال تهیه هست
سلام
من یه مشکل عجیب واسم پیش اومده ممنونم کمک کنید:
من متن چند پاراگرافی رو داخل دیتابیس ذخیره کردم به صورت دستی وارد میکنم ولی داخل برنامه مشکل تشخیص سطر داره مثلامتن اصلی اینه:
اندروید استودیو سایت مناسبی برای اموزش هست.
ولی ایجوری داخل تکس ویو نشون داده میشه:
اندروید
استودیو سایت مناسبی
برای
اموزش هست.
چطور حلش کنم ؟
سلام خدمت شما و ممنون از آموزش خوبتون
مسیر ذخیره دیتابیس از طریق ایمولتور در دسترس هست. ولی وقتی برروی گوشی نصب می کنم نمیتونم دیتابیس رو پیدا کنم لطفا راهنمایی کنید.
روی دیوایس واقعی نشون نمیده
یه سوال در مورد خود دیتا بیس دارم
برای اینک اپلیکیشن داده هاش رو از رو دیتا بیس بخونه باید به نت وصل باشه؟؟
خیر. مگه اینکه دیتابیس رو سرور باشه
استاد گفته بودید برای اینکه ببینیم دیتابیس ساخته شده یا نه بریم تو قسمت tool –> Android –> android device monitor ولی اندروید استودیو من آخرین ورژنه فرق داره. تو قسمت tools اصلا android نداره و همین طور device monitor. میشه بگید این دیتا بیسی که ساختیم تو کجا ذخیره میشه
https://stackoverflow.com/a/51043160
با سلام
لطفا مباحث دیتا بیس رو افزایش دهید
شامل دیتا بیس بصورت اینترنتی mysql و php
مبحث بعدی که منتشر میشه مربوط به وب سرویس هست
ارورها رو بررسی کردم وقتی ذخیره میکنم می نویسه اطلاعات ذخیره شد ولی تو قسمت لاگ می نویسه:
table tbl_person has no column named name
Mahdi: Table Create
Mahdi: Data inserted
و وقتی حذف رو میزنم می نویسه:
no such column: id
خب میگه ستونی با نام name در tbl_person وجود نداره
سلام.همه ی مراحلی که آموزش دادید رو انجام دادم ولی وقتی برنامه رو اجرا میکنم ذخیره رو انجام میده ولی نمایش و بروزرسانی و حذف رو انجام نمیده و برنامه بسته میشه و از برنامه میاد بیرون.نمیدونم دلیلش چیه لطفا راهنمایی نمایید.
بخش android device monitor اول ارور میداد ولی با این که ارورش رو برطرف کردم اصلا صفحه ای باز نمیشه برام.
من از شبیه ساز خود اندروید استودیو استفاده میکنم.
وقتی برنامه بسته میشه (موقع بروزرسانی و حذف) ببینید داخل لاگ چه اروری میگیرید