SD卡上的SQLite数据库

时间:2011-01-26 15:16:03

标签: android sqlite 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);
    }

    ...

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

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

但是应该使用什么样的“工厂”论点?

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

由于

6 个答案:

答案 0 :(得分:9)

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

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

但是,如果您想尝试一下,最好覆盖getDatabasePathContext方法,例如使用您自己的Application对象,然后传递 成为常规SQLiteOpenHelper。那么你就不必担心游标工厂了(这是可选的as the source confirms - 所以如果你想要去那条路线那么就传递null。)

答案 1 :(得分:9)

在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上运行得很好,大多数应用程序都是“自动移动到SD卡”,因此不要担心数据库无法访问,因为该应用程序无法自行访问。

答案 2 :(得分:3)

然后创建自己的平面数据库 - 大多数人内部存储器很少,而且很烦人的是他们用大量的数据库把它吃掉了。

至于'如果他们删除SD'的情况 - 如果用户移除了卡显然它不会起作用!显然。只是检查你在尝试与基础交互时没有收到错误,如果你这样做,只需告诉你用户 - 问题解决了。

答案 3 :(得分:2)

Cursor factory用于返回自定义Cursor实现的实例。 通常,您只使用SQLiteCursor,在这种情况下,null将作为工厂参数传递。

答案 4 :(得分:1)

我建议不要将数据库放到SD卡上 - 这会显着缩短卡的使用寿命,因为它对可能的写入次数有一个(很大但仍然存在)限制,而且数据库需要相当多的写入

答案 5 :(得分:1)

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" />