تخفیف ویژه

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

دسته بندی: اندروید
زمان مطالعه: 1 دقیقه
۱۰ شهریور ۱۳۹۵

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

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

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

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

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

چه امتیازی به این مقاله می دید؟
نویسنده سعید شاهینی

جلسات دوره

نظرات کاربران

مهدی اسماعیل زادگان

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

Saeed Hoseini

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

سعید شاهینی

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

saghar saberi

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

علی اصغر جهانی

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

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

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

سعید شاهینی

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

علی اصغر جهانی

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

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

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

سعید شاهینی

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

erfan23

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

 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 ساخته نشده.

مهرداد قاسمیان

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

سعید شاهینی

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

مهدی موسوی

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

سعید شاهینی

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

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

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

   public List getVisitedposts() {
 List posts = new ArrayList();
 SQLiteDatabase sqLiteDatabase = this.getReadableDatabase();
 Cursor cursor = sqLiteDatabase.rawQuery(&#8220;SELECT * FROM&#8221; +SKIN_TABLE_NAME+&#8221; WHERE&#8221;+COL_IS_VISITED+&#8221;=1&#8243;, null);
 cursor.moveToFirst();
 if (cursor.getCount() &gt; 0) {
   while (!cursor.isAfterLast()) {
  Post post = new Post();
  post.setId(cursor.getInt(0));
  post.setTitle(cursor.getString(1));
  post.setContent(cursor.getString(2));
  post.setListImage(cursor.getString(3));
  post.setIsVisited(cursor.getInt(4));
  post.setLiked(cursor.getInt(5));
  post.setDate(cursor.getString(6));
  posts.add(post);
  cursor.moveToNext();
   }
 }
 cursor.close();
 sqLiteDatabase.close();
 return posts;
  } 
سعید شاهینی

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

علی جعفری

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

سعید شاهینی

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

علی جعفری

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

سعید شاهینی

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

پایان زمان پشتیبانی

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

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

نیاز به لاگین

برای ارسال دیدگاه و یا پرسیدن سوال خود در این قسمت، باید در سایت لاگین شوید.