سلام
من میخوام از SharedPreferences برای ذخیره 8000 متغیر از نوع integer استفاده کنم ، این متغیرها اگر برای هر کدوم 4 بایت در نظر بگیریم نهایتا" 32 کیلوبایت اشغال می کنند ، که تو این دوره زمونه مقداری نیست ،اما میخوام قبل از استفاده مطمئن بشم تو محاسباتم اشتباه نکردم و مشکلی پیش نمیاد
4*4000=32000
32000/1024=31.25
و اینکه اگر ممکن هست یک لینک ، Pdf یا کتاب که به صورت گام به گام و ساده ، نحوه کار با دیتابیس sqllite رو توضیح داده باشه معرفی کنید لطفا"
کار با دیتابیس SQLite هیچ چیز سختی نداره. شما باید اول مجوز نوشتن روی دیسک رو بدین و بعد با کلاس SQLiteDatabase کار کنید.
اول باید مجوز رو توی مانیفست بدین:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
بعد باید مسیر نگهداری دیتابیس رو مشخص کنید و درصورت نیاز بسازین و بقیه کارها رو انجام بدین. مثال:
(مباحثی از این دست رو توی دوره پیشرفته اندروید تدریس میکنیم - میتونید مجازی و غیرحضوری هم شرکت کنید -
لینک)
package ir.ncis.course.app.database;
import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
public class DatabaseActivity extends Activity {
public static SQLiteDatabase database;
public static final String DIR_SDCARD = Environment.getExternalStorageDirectory().getAbsolutePath();
public static final String DIR_DATABASE = DIR_SDCARD + "/database-test/";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
new File(DIR_DATABASE).mkdirs();
database = SQLiteDatabase.openOrCreateDatabase(DIR_DATABASE + "database.sqlite", null);
// Create Table
database.execSQL("CREATE TABLE IF NOT EXISTS person (" +
"id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL UNIQUE , " +
"name TEXT, " +
"family TEXT, " +
"age INTEGER" +
")");
// Insert rows
for (int i = 1; i <= 20; i++) {
database.execSQL("INSERT INTO person (name,family,age) VALUES ('NAME#" + i + "','Family#" + i + "'," + i + ")");
}
// Read records
Cursor cursor = database.rawQuery("SELECT * FROM person WHERE (age>10)", null);
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex("name"));
String family = cursor.getString(cursor.getColumnIndex("family"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
Log.i("LOG", "Record: " + name + " | " + family + " | " + age);
}
cursor.close();
// Update records
database.execSQL("UPDATE person SET name='test1',family='test2' WHERE (age>7)");
// Delete records
database.execSQL("DELETE FROM person WHERE (age>10)");
}
}
ممنونم استاد ، پس اینطور که متوجه شدم شما صلاح نمی دونین برای موردی که عرض کردم از SharedPreferences استفاده کنم ، درسته ؟
SQLite قابلیت جستجو رو هم به شما میده. کلاً انعطاف SQLite بیشتره و توی Shared Preferences شما به حالت Key-Value محدود میشین. باید خودتون ببینید کدوم نیازتون رو برآورده میکنه.
توی Shared Preferences اگه بخواین قابلیت جستجو داشته باشین، باید نامگذاری کلیدها رو به شکل معنادار انجام بدین و هیچ کنترلی روی Value ها ندارین ولی توی دیتابیس میتونین کوئری بزنین. در عوض سرعت Shared Preferences از دیتابیس بیشتره. انتخاب با شماست.
برای برنامه من استفاده از Shared Preferences خیلی راحتر بود ولی چون تجربه نشون داده گاهی اوقات مسائلی پیش میاد که پیش بینی نکردیم ، مثلا بر اساس درخواست کاربرها مجبوریم امکانات بیشتری بزاریم و .. تصمیم گرفتم از SQLite استفاده کنم ، فقط مساله ای که هست این مثالی که شما زدین دیتابیس رو زمان اجرا درست می کنه ، ولی من میخوام از دیتابیس اماده استفاده کنم .اینطور که تو نت خوندم باید دیتابیس رو داخل پوشه assets قرار بدم و با دستور کپی اش کنم ولی متاسفانه سورس هایی رو که کپی کردم جواب ندادن (مجوزها رو هم دادم ) ،جدا از اینکه این مثالها کار نکرد یه عیب دیگه ای هم که داشت اینکه همشون کپی دیتابیس رو توضیح دادن ولی من میخوام از پوشه assets به حافظه SDCARD ، کات بشن (کاملا مشابه مسیری که شما تو مثال اول گفتین )
اگر به جای assets از پوشه دیگری دیتابیس رو کپی کنم ، مشکلی پیش میاد ؟؟
برحسب تجربه میگم که اگه دیتابیس رو درصورت عدم وجود، توی زمان اجرای برنامه بسازین بهتره چون ممکنه بهر دلیلی دیتابیس حذف بشه و اونوقت برنامه شما باید دوباره نصب بشه.
درمورد کپی از جای دیگه هم مشکلی پیش نمیاد ولی کلاً ترجیح میدم دیتابیس رو در اولین درخواست بسازم. البته برای این کار یک کلاس جداگانه درنظر میگیرم که از Application مشتق شده و مراحل آماده سازی رو داخل اون میگذارم و با android:name توی مانیفست، اون کلاس رو بجای کلاس Application معرفی میکنم تا قبل از هر اکتیویتی اجرا بشه و اکتیویتیها هم تمیز باقی بمونن.
هر چند مخالفت با استاد بی ادبی به حساب میاد ، شایدم چون درک کاملی نسبت به گفته اتون نداشتم ولی فکر می کنم پیشهادتون همیشه مناسب نباشه ، مثلا دیتابیسی که چند هزار رکورد اماده داره ، زمان اجرا بسازیم و مقادیراشو با کوئری Insert کنیم هنگ می کنه دیگه ..
توی Thread جدا بسازین تا هنگ نکنه. دقت کنید که ممکنه بنا به دلایل مختلفی دیتابیس برنامه خراب بشه و وجود یک نسخه جدا از دیتابیس برای ساخت مجدد در چنین شرایطی، قابلیت مفیدی محسوب میشه. چند هزار رکورد هم عملاً چیزی نیست که گوشیهای هوشمند امروزی بخوان بخاطرش هنگ کنن. فقط تأکید میکنم توی Thread جداگانه انجام بدین تا UI Thread شما هنگ نکنه.