13

我正在寻找在 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 卡会发生什么..

谢谢

4

6 回答 6

10

我没有尝试做你在那里描述的事情,但大概它可以完成并且可能工作 - 有一些警告。首先,外部存储(SD 卡)不安全,因此任何其他应用程序或用户都可以对其进行读/写。其次,正如您所指出的,当它被卸载时,数据库就会消失。

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

不过,如果您想尝试它,最好覆盖Context的getDatabasePath方法,例如使用您自己的Application对象,然后将其传递常规SQLiteOpenHelper。然后你就不必担心游标工厂(这是可选的,正如消息来源所证实的那样——所以如果你想走那条路,只需传递 null )。

于 2011-01-26T15:44:25.650 回答
10

在您的 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”,因此不必担心无法访问数据库,因为应用程序无法自行访问。

于 2012-06-14T07:53:11.353 回答
2

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

于 2011-01-26T15:57:10.497 回答
2

然后制作你自己的平面数据库——大多数人的内存很少,而且他们用庞大的数据库把它吃掉很烦人。

至于“如果他们移除 SD 会怎样”的场景 - 如果用户移除卡显然它不会工作!清楚地。只需检查您在尝试与基础交互时是否出现错误,如果出现错误,请告诉您用户 - 问题已解决。

于 2011-02-09T16:38:54.010 回答
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" />
于 2015-03-11T06:53:15.830 回答
0

我建议不要将数据库放在 SD 卡上 - 您将显着降低卡的使用寿命,因为它对可能的写入次数有(很大但仍然存在)限制,并且数据库需要相当多的写入。

于 2011-01-26T16:03:29.083 回答