دوره مجازی اندروید (جلسه 19): ذخیره سازی اطلاعات با Sqlite قسمت دوم



visibility  
mode_comment   ۳۹

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

مطالب مطرح شده در این جلسه عبارتند از :

  • گرفتن سطر های جدول
  • آپدیت کردن مقدار فیلد های سطر های جدول
  • حذف سطر از جدول
info توجه

این مطلب یک جلسه از آموزش برنامه نویسی اندروید می باشد و برای مشاهده آن باید در دوره ثبت نام کنید.

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

comment دیدگاه کاربران
sara salami replyپاسخ

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

سعید شاهینی

سلام، بخش نظرات هیچ فرقی با پست ها ندارند! فقط اسمشون فرق داره، ساختار پیاده سازیشون دقیقا شبیه همین پست هاست.

مجید زارعی هوشیار replyپاسخ

سلام استاد شاهینی خسته نباشید …………عالی بود………….به نکات خوبی اشاره کردید……… لایک
😀

نجمه آذر replyپاسخ

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

وحید صالحی

از صفحه ثبت نام دوره مورد نظرتون

جعفر پیشدادی replyپاسخ

با سلام در بخش اخر که پستهای مشاهده شده را پیاده ساری نمودید .برای تغییر رنگ پست مشاهده شده در برگشت از نوتیفای notifyنام بردید که قبلا توضیح داده شده …لطفا بگید در کدوم جلسه این بحث را توضیح دادید

سعید شاهینی

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

هادی خضرپور replyپاسخ

سلام
ببخشید استاد من توی این قسمت یه مشکلی دارم با تعویض رنگ آیتم های ریسایکلر ویوو وقتی به اینترنت وصل نیستم عمل تغییر رنگ انجام نمیشه ولی وقتی اینترنت رو قطع می کنم تغییر رنگ انجام میشه دلیلش چیه؟

سعید شاهینی

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

mehdi eslami replyپاسخ

سلام وقتتون بخیر من میخوام در recyclerview خاصیت جستجو بزارم چطور میشه در recyclerview جستجو انجام داد؟

سعید شاهینی

سلام معمولا جستجوها سمت سرور انجام میشه و پاسخ بر می گرده چون کل داده ها داخل لیستها نباید لود بشه اصولا، اما می تونید از کلاس filterable برای این منظور استفاده کنید، ایمیل بهم بدید تا لینک آموزشی براتون ارسال کنم

mehdi eslami

سلام ممنونم مشکلم حل شد
فقط یک سوال چطور میتونم داده ها رو کم کم از سرور بگیرم دقیقا مثل اینستا که با اسکرول داده ها به لیست اضافه میشن؟

سعید شاهینی

سلام، جلسه 39 آموزش خواهم داد

Amirhossein Ashrafi replyپاسخ

استاد این notify که تو جلسه 18 گفتین قبلا آموزش دادین. هر چی میگردم پیدا نمیکنم ! انگار نیست تو آموزش ها 😥

سعید شاهینی

سلام، حقیقتش من یادم نیست کدوم جلسه گفتم، اما جلسه 39 بهش احتیاج داریم و می تونید جلسه 39 رو مشاهده کنید، پس فردا منتشر می شه

جواد اشکش replyپاسخ

سلام
استاد کاش امکان سرچ و لیست علاقه مندی و همچنین تغییرسایز فونت رو هم توی این پروژه اموزش میدادید یا اگه میشه لینک اموزشش رو که بشه روی اموزش شما استفاده کرد بهم بدید استاد هیچ اموزشی به سادگی اموزشهای شما من ندیدم واسه همین شرطی شدم از شما فقط یاد میگیرم

سعید شاهینی

سلام ممنون از لطفتون. تغییر سایز فونت رو که آموزش دادیم تو این دوره و مسئله پیچیده ای نداره. برای پیاده سازی لیست علاقه مندی ها:
فرض کنید که می خواید برای صفحه ی پست ها٬ لیست علاقه مندی بسازید و یک جدول دارید که لیست پست هارو داخل نگه می دارید. داخل جدول پست ها یک فیلد اضافه می کنید٬مثلاٌ به اسم “is_favorite” که از نوع boolean هست. هر موقع که کاربر اون پست رو به لیست علاقه مندی هاش اضافه می کنه٬ این فیلد داخل جدول مقدارش ۱ می شه. بعدا که کاربر وارد صفحه لیست علاقه مندی ها شد٬ از داخل دیتابیس پست هایی رو مقدار “is_favorite” اونها ۱ هست رو دریافت می کنید و به کاربر نشون می دهید.
پیاده سازی سرچ سمت سرور باید پیاده سازی بشه مگر در موارد خاص

امیر غلامی replyپاسخ

سلام معمولا در نرم افزار های کتاب یا نرم افزار هایی که دیتابیس و دیتایی دارن که از قبل آماده شده باید از اون دیتابیس استفاده کرد چطور میشه از دیتابیس داخل assets استفاده کرد آقای شاهینی؟ 😎

سعید شاهینی

سلام. در این لینک کدهاش موجوده و می تونید ازش استفاده کنید:
http://stackoverflow.com/questions/9109438/how-to-use-an-existing-database-with-an-android-application

علی جعفری replyپاسخ

سلام
ببخشید برنامه Android Device Monitor اجرا نمیشه و حتی وقتی که با Run as administrator به صورت دستی اجرا میکنم هیچ کدوم از گزینه هاش کار نمیکنه؟
بستگی به sdk ها داره؟

سعید شاهینی

سلام متاسفانه نرم افزار Android Device Monitor باگ خیلی داره و دلیل خیلی از باگ هاش رو من نمی دونم

علی جعفری

ببخشید،برای ادامه آموزش از ابزار یا روش دیگه ای میشه استفاده کرد؟

سعید شاهینی

سلام منظورتون چه ابزاریه؟

علی جعفری

سلام
استاد من با شبیه ساز اندروید ۷ کارمیکنم و با جستحوی مکرر تو سایتای خارجی متوجه شدم که ابزار Android Device Monitor با apiسطح ۲۴ و ۲۵ سازگار نیست
برای همین از شبیه ساز اندروید ۶ استفاده کردم و مشکلم حل شد 😀

مختار اسمعیلی replyپاسخ

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

سعید شاهینی

سلام٬ یه چک بکنید ببینید مقدار isVisited پستها چی ست شده.

مهدی موسوی replyپاسخ

سلام
استفاده از متد onUpgrade دیتابیس رو تو آموزش ها ندیدم.
این متد از کجا ورژن دیتابیس و … رو دریافت می کنه.

سعید شاهینی

سلام٬ شما داخل Constructor یک متد super داری که پارامترها رو به کلاس پدر پاس می دی. اون ورژن هست که به متد onUpgrade داده می شه.

مهرداد قاسمیان replyپاسخ

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

سعید شاهینی

کافیه که وقتی روی پست کلیک شد٬ قبل از اینکه کاربر رو به صفحه جدید ببریم رنگ اون آیتم رو عوض کنیم. برای این کار ابتدا مقدار فیلد isVisited اون خبر رو به True تغییر می دیم و بعد متد notifyItemChange رو صدا می زنیم.

erfan23 replyپاسخ

سلام
این ارورو برای من میده
مشکل چی میتونه باشه؟

 Process: com.example.ashkan.myapplication, PID: 11004
                                                                                  java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.ashkan.myapplication/com.example.ashkan.myapplication.View.activity.PostsActivity}: android.database.sqlite.SQLiteException: no such table: posts (code 1): , while compiling: SELECT * FROM posts
                                                                                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
                                                                                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
                                                                                      at android.app.ActivityThread.access$800(ActivityThread.java:151)
                                                                                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
                                                                                      at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                                      at android.os.Looper.loop(Looper.java:135)
                                                                                      at android.app.ActivityThread.main(ActivityThread.java:5254)
                                                                                      at java.lang.reflect.Method.invoke(Native Method)
                                                                                      at java.lang.reflect.Method.invoke(Method.java:372)
                                                                                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
                                                                                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
                                                                                   Caused by: android.database.sqlite.SQLiteException: no such table: posts (code 1): , while compiling: SELECT * FROM posts
                                                                                      at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
                                                                                      at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
                                                                                      at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
                                                                                      at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
                                                                                      at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
                                                                                      at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
                                                                                      at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
                                                                                      at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1316)
                                                                                      at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1255)
                                                                                      at com.example.ashkan.myapplication.View.view.SevenLearnDataBaseOpenHelper.getPosts(SevenLearnDataBaseOpenHelper.java:106)
                                                                                      at com.example.ashkan.myapplication.View.activity.PostsActivity.getPostFromDatabase(PostsActivity.java:54)
                                                                                      at com.example.ashkan.myapplication.View.activity.PostsActivity.onCreate(PostsActivity.java:26)
                                                                                      at android.app.Activity.performCreate(Activity.java:5990)
                                                                                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
                                                                                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
سعید شاهینی

سلام٬ این ارور می گه که جدولی به اسم posts ساخته نشده.

علی اصغر جهانی replyپاسخ

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

تو اینترنت که گشتم گفته بودن نوع longBlob ولی انگاری حجمش بالاست .

واینکه ایا راهی هست با همبن url یک جوری عکسا رو از دیتتابیس برای بار اول خوند ؟
یک سوال دیگه .
Piccasso تا چه حد تصاویر رو کش میکنه ؟
اگه برای تصاویر زیادی از piccasso استفاده کنیم آیا از سرعت کم نمیشه ؟

سعید شاهینی

در حال حاضر بهترین لایبرری برای لود کردن عکس fresco هست که ساخت شرکت فیسبوکه و داخل اینستاگرام ازش استفاده شده
https://github.com/facebook/fresco

علی اصغر جهانی replyپاسخ

یک راه ک به نظرم میرسه اینه که هنگام دریافت از server آدرس تصویر در سرور رو به آدرس تصویر در External storage تبدیل کنیم و به دیتابیس بریزیم .
و هنگام شروع اکتیویتی یک سری تصویر رو به صورت دستی تو external storage ذخیره کنیم .

بعدش با همون دیتابیس assets و اینا میایم و پست ها رو به همراه آددس external storage میگیرم و نمایش میدیم .

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

سعید شاهینی

سلام، این راهی که گفتید هم باعث افت سرعت اپلیکیشن می شه و هم حجم گوشی کاربر رو الکی پر می کنه. بهتره عکس رو از سرور با استفاده از لایبرری هایی مثل پیکاسو یا glide یا fresco لود کنید.

saghar saberi replyپاسخ

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

Saeed Hoseini replyپاسخ

سلام استاد,خسته نباشید.ببخشید من تادقیقه ی سی و چهار دیدم فیلم رو.وقتی برنامه رو ران میکنم از اکتیویتی بیرون می پره.در اندروید مانیتور هم چیزی نمایش دادره نمی شه. بعد هم تو همون صفحه ی ران می نویسه TRY AGAIN.یه کمک بکنید لطفا ممنون میشم.کدم هم عینا مثل شماست.

سعید شاهینی

سلام اسکرین شات بگیرید بفرستید

ارسال نظرات

کاربر گرامی، امکان ارسال نظر و پشتیبانی برای دوره های مجازی فقط برای دانشجویان این دوره امکان پذیر می باشد.