База данных SQLite на SD-карте
Я ищу, чтобы создать базу данных 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-карту, пока мое приложение находится в использовать..
спасибо
6 ответов
Я не пытался сделать то, что вы там описываете, но, по-видимому, это можно сделать и может сработать-с несколькими оговорками. Во-первых, внешнее хранилище (SD-карта) не является безопасным, поэтому любое другое приложение или пользователь могут читать/писать на него. Во-вторых, как вы заметили, когда он размонтирован, DB уходит.
из - за этих недостатков вам, вероятно, будет лучше попробовать использовать внутреннюю базу данных хранилища (по умолчанию), которая является небольшой и, возможно, включает указатели на внешние данные (например, изображения или файлы) - которые сами могут находиться на внешнем хранилище (и которые имеют заполнители или другую обработку, когда внешнее хранилище недоступно).
тем не менее, если вы хотите попробовать, вам может быть лучше переопределить getDatabasePath метод контекст, например, с вашим собственным приложение
сделайте это в своем конструкторе SQLiteOpenHelper:
DatabaseHelper(Context context) {
super(context, context.getExternalFilesDir(null).getAbsolutePath() + "/" + DATABASE_NAME, null, DATABASE_VERSION);
}
он создаст базу данных в папке приложения на sdcard:/sdcard/Android/data/[your_package_name] / files. Таким образом, база данных будет рассматриваться как часть приложения на Android и автоматически удаляется, если пользователь удаляет приложение.
I мое приложение у меня большая база данных, и она в большинстве случаев не поместится на внутренней памяти старых телефонов, например HTC Desire. Он отлично работает на sdcard и большинстве приложений в любом случае, они" перемещены на sdcard", поэтому не беспокойтесь о том, что база данных недоступна, потому что приложение не будет доступно самостоятельно.
затем сделайте свою собственную плоскую базу данных-у большинства людей очень мало внутренней памяти, и это раздражает, что они едят ее с огромной базой данных.
а что касается сценария "что, если они удаляют SD" - если пользователь удаляет карту, очевидно, что она не будет работать! Очевидно. Просто проверьте, что вы не получили ошибку при попытке взаимодействовать с базой, и если вы это сделали, просто скажите вам, что проблема пользователя решена.
Cursor factory используется для возврата экземпляра вашей пользовательской реализации Курсора. Обычно вы просто используете SQLiteCursor, и в этом случае null передается как заводской аргумент.
Я бы рекомендовал не помещать базу данных на SD-карту - вы значительно уменьшите срок службы карты, так как у нее есть (большой, но все еще существующий) предел количества возможных записей, а базы данных требуют довольно много записей.
public DataBaseHelper(final Context context) {
super(context, Environment.getExternalStorageDirectory()
+ File.separator+ MYDATABASE_NAME, null, MYDATABASE_VERSION);
}
также добавьте разрешение в манифест android
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />