رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
پایگاه داده ها در اندروید
#1
سلام

من میخوام از  SharedPreferences    برای ذخیره  8000 متغیر  از نوع integer  استفاده کنم ، این  متغیرها  اگر برای هر کدوم  4 بایت در نظر بگیریم نهایتا"  32 کیلوبایت اشغال می کنند ،  که تو این دوره زمونه مقداری نیست ،اما میخوام قبل از استفاده مطمئن بشم تو محاسباتم اشتباه نکردم و مشکلی  پیش نمیاد

4*4000=32000
32000/1024=31.25

و اینکه اگر ممکن هست یک لینک ، Pdf یا کتاب  که به صورت گام به گام و ساده ، نحوه  کار با دیتابیس sqllite رو توضیح داده باشه  معرفی کنید لطفا"
پاسخ
تشکر شده توسط:
#2
کار با دیتابیس 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)");
    }
}
پاسخ
تشکر شده توسط: بیتا_حکمت
#3
ممنونم استاد ، پس اینطور که متوجه شدم شما صلاح نمی دونین برای موردی که عرض کردم از SharedPreferences استفاده کنم ، درسته ؟
پاسخ
تشکر شده توسط:
#4
SQLite قابلیت جستجو رو هم به شما میده. کلاً انعطاف SQLite بیشتره و توی Shared Preferences شما به حالت Key-Value محدود میشین. باید خودتون ببینید کدوم نیازتون رو برآورده میکنه.
پاسخ
تشکر شده توسط: بیتا_حکمت
#5
توی Shared Preferences اگه بخواین قابلیت جستجو داشته باشین، باید نامگذاری کلیدها رو به شکل معنادار انجام بدین و هیچ کنترلی روی Value ها ندارین ولی توی دیتابیس میتونین کوئری بزنین. در عوض سرعت Shared Preferences از دیتابیس بیشتره. انتخاب با شماست.
پاسخ
تشکر شده توسط: بیتا_حکمت
#6
برای برنامه من استفاده از Shared Preferences خیلی راحتر بود ولی چون تجربه نشون داده گاهی اوقات مسائلی پیش میاد که پیش بینی نکردیم ، مثلا بر اساس درخواست کاربرها مجبوریم امکانات بیشتری بزاریم و .. تصمیم گرفتم از SQLite استفاده کنم ، فقط مساله ای که هست این مثالی که شما زدین دیتابیس رو زمان اجرا درست می کنه ، ولی من میخوام از دیتابیس اماده استفاده کنم .اینطور که تو نت خوندم باید دیتابیس رو داخل پوشه assets قرار بدم و با دستور کپی اش کنم ولی متاسفانه سورس هایی رو که کپی کردم جواب ندادن (مجوزها رو هم دادم ) ،جدا از اینکه این مثالها کار نکرد یه عیب دیگه ای هم که داشت اینکه همشون کپی دیتابیس رو توضیح دادن ولی من میخوام از پوشه assets به حافظه SDCARD ، کات بشن (کاملا مشابه مسیری که شما تو مثال اول گفتین )
اگر به جای assets از پوشه دیگری دیتابیس رو کپی کنم ، مشکلی پیش میاد ؟؟
پاسخ
تشکر شده توسط:
#7
برحسب تجربه میگم که اگه دیتابیس رو درصورت عدم وجود، توی زمان اجرای برنامه بسازین بهتره چون ممکنه بهر دلیلی دیتابیس حذف بشه و اونوقت برنامه شما باید دوباره نصب بشه.

درمورد کپی از جای دیگه هم مشکلی پیش نمیاد ولی کلاً ترجیح میدم دیتابیس رو در اولین درخواست بسازم. البته برای این کار یک کلاس جداگانه درنظر میگیرم که از Application مشتق شده و مراحل آماده سازی رو داخل اون میگذارم و با android:name توی مانیفست، اون کلاس رو بجای کلاس Application معرفی میکنم تا قبل از هر اکتیویتی اجرا بشه و اکتیویتیها هم تمیز باقی بمونن.
پاسخ
تشکر شده توسط: بیتا_حکمت
#8
هر چند مخالفت با استاد بی ادبی به حساب میاد ، شایدم چون درک کاملی نسبت به گفته اتون نداشتم ولی فکر می کنم پیشهادتون همیشه مناسب نباشه ، مثلا دیتابیسی که چند هزار رکورد اماده داره ، زمان اجرا بسازیم و  مقادیراشو با کوئری Insert کنیم هنگ می کنه دیگه ..
پاسخ
تشکر شده توسط:
#9
توی Thread جدا بسازین تا هنگ نکنه. دقت کنید که ممکنه بنا به دلایل مختلفی دیتابیس برنامه خراب بشه و وجود یک نسخه جدا از دیتابیس برای ساخت مجدد در چنین شرایطی، قابلیت مفیدی محسوب میشه. چند هزار رکورد هم عملاً چیزی نیست که گوشیهای هوشمند امروزی بخوان بخاطرش هنگ کنن. فقط تأکید میکنم توی Thread جداگانه انجام بدین تا UI Thread شما هنگ نکنه.
پاسخ
تشکر شده توسط: بیتا_حکمت




کاربران در حال بازدید این موضوع: 1 مهمان