SD卡上的SQLite数据库

use*_*701 12 sqlite android android-sdcard

我想在SD卡上创建一个sqlite数据库(不想用尽用户的内部存储).我熟悉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);
    }

    ...
Run Code Online (Sandbox Code Playgroud)

所以,如果我们想在SD卡上创建,我认为我们必须使用:

public static SQLiteDatabase openOrCreateDatabase (String path, 
      SQLiteDatabase.CursorFactory factory);
Run Code Online (Sandbox Code Playgroud)

但是什么是"工厂"的说法,应该使用什么工厂?

还有点担心如果用户在我的应用程序正在使用时删除SD卡会发生什么.

谢谢

Cha*_*ins 9

我没有尝试过你在那里描述的内容,但可能是它可以完成并可能有效 - 只需要几点注意事项.首先,外部存储(SD卡)不安全,因此任何其他应用程序或用户都可以读/写它.其次,正如你所说,当它卸载时,数据库就会消失.

由于这些缺点,您可能最好尝试使用内部存储数据库(默认),这个数据库很小并且可能包含指向外部数据(如图像或文件)的指针 - 它们本身可以位于外部存储上(当外部存储不可用时,有占位符或其他处理).

尽管如此,如果您想尝试它,最好还是覆盖ContextgetDatabasePath方法,例如使用您自己的Application对象,然后将传递给常规的SQLiteOpenHelper.然后你不必担心游标工厂(这是可选的,因为源确认 - 所以只要你想要去那条路线就传递null).


小智 9

在SQLiteOpenHelper构造函数中执行此操作:

DatabaseHelper(Context context) {
        super(context, context.getExternalFilesDir(null).getAbsolutePath() + "/" + DATABASE_NAME, null, DATABASE_VERSION);
    }
Run Code Online (Sandbox Code Playgroud)

它将在sdcard上的应用程序文件夹中创建数据库:/ sdcard/Android/data/[your_package_name]/files.这样,数据库将被android视为应用程序的一部分,并在用户卸载应用程序时自动删除.

我的应用程序我有一个大型数据库,它在大多数情况下不适合旧手机内存,例如HTC Desire.它在sdcard上运行得很好,大多数应用程序都是"自动移动到SD卡",因此不要担心数据库无法访问,因为该应用程序无法自行访问.