/ / SQLite база данни на SD карта - android, sqlite, android-sdcard

SQLite база данни на SD карта - android, sqlite, android-sdcard

Търся да създам база данни на sqlite на sd картата (не искам да използвам вътрешното хранилище на потребителя). Запознат съм с модела OpenHelper:

public DatabaseFoo(Context context) {
OpenHelper openHelper = new OpenHelper(context);
mDb = openHelper.getWritableDatabase();
}

private static class OpenHelper extends SQLiteOpenHelper {
public OpenHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

...

така че ако искаме да създаваме на sd картата, мисля, че вместо това трябва да използваме:

public static SQLiteDatabase openOrCreateDatabase (String path,
SQLiteDatabase.CursorFactory factory);

Но какъв трябва да бъде аргументът "фабрика", каква фабрика трябва да се използва?

Също така малко притеснен какво ще се случи, ако потребителят премахне SD картата, докато приложението ми е в употреба ..

Благодаря

Отговори:

9 за отговор № 1

Не съм се опитвал да правя това, което описваш там,но вероятно това може да се направи и може да работи - с няколко предупреждения. Първо, външното хранилище (SD карта) не е защитено, така че всяко друго приложение или потребителят може да чете / пише в него. Второ, както отбелязахте, когато се демонтира, DB изчезва.

Поради тези недостатъци бихте го направиливероятно е по-добре да опитате да използвате вътрешна база данни за съхранение (по подразбиране), която е малка и вероятно включва указатели към външни данни (като изображения или файлове) - които самите те могат да бъдат във външното хранилище (и които имат запазени места, или друга работа, когато външното хранилище не е налично).

И все пак, ако искате да опитате, може би е по-добре да замените getDatabasePath метод на контекст, като например със собствения си Приложение обект и след това преминете че в редовен SQLiteOpenHelper. Тогава няма да се притеснявате за фабриката на курсора (което не е задължително, както потвърждава източникът - така че просто преминете null, ако вместо това искате да отидете по този маршрут).


9 за отговор № 2

Направете това във вашия конструктор на SQLiteOpenHelper:

DatabaseHelper(Context context) {
super(context, context.getExternalFilesDir(null).getAbsolutePath() + "/" + DATABASE_NAME, null, DATABASE_VERSION);
}

Той ще създаде базата данни в папката на приложениетона sdcard: / sdcard / Android / data / [your_package_name] / files. По този начин базата данни ще бъде видяна като част от приложението от android и ще бъде премахната автоматично, ако потребителят деинсталира приложението.

Аз си приложение имам голяма база данни и тя ще вповечето случаи не се побират на вградената памет на стари телефони, напр. HTC Desire. Той работи отлично на sdcard и повечето приложения и без това са "преместени на sdcard", така че не се притеснявайте, че базата данни няма да бъде достъпна, тъй като приложението няма да бъде достъпно само.


3 за отговор № 3

След това направете своя собствена плоска база данни - повечето хора имат много малко вътрешна памет и е досадно, че я изяждат с огромна база данни.

А що се отнася до "какво, ако премахнат SD"сценарий - ако потребителят премахне картата очевидно няма да работи! Ясно е. Просто проверете дали не сте получили грешка, когато се опитвате да взаимодействате с базата, и ако сте го направили, просто кажете на потребителя - проблемът е решен.


2 за отговор № 4

Фабриката на курсора се използва за връщане на екземпляр на вашата персонализирана реализация на курсора. Обикновено просто използвате SQLiteCursor, в който случай null се предава като фабричен аргумент.


1 за отговор № 5

Бих препоръчал да не се поставя база данниSD карта - значително ще намалите продължителността на живота на картата, тъй като тя има (голям, но все още съществуващ) лимит за възможния брой записи и базите данни изискват доста записи.


1 за отговор № 6
public DataBaseHelper(final Context context) {
super(context, Environment.getExternalStorageDirectory()
+ File.separator+ MYDATABASE_NAME, null, MYDATABASE_VERSION);
}

Също така добавете разрешение в android Manifest

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />