我正在寻找在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卡会发生什么..
由于
答案 0 :(得分:9)
我没有尝试过你在那里所描述的内容,但可能是它可以完成并可能有效 - 只需要几点注意事项。首先,外部存储(SD卡)不安全,因此任何其他应用程序或用户都可以读/写它。其次,正如你所说,当它卸载时,数据库就会消失。
由于这些缺点,您可能最好尝试使用内部存储数据库(默认),这个数据库很小并且可能包含指向外部数据(如图像或文件)的指针 - 它们本身可以在外部存储(当外部存储不可用时,具有占位符或其他处理)。
但是,如果您想尝试一下,最好覆盖getDatabasePath的Context方法,例如使用您自己的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" />