在我的应用中,我使用...
myFilesDir = new File(Environment.getExternalStorageDirectory().getAbsolutePath()
+ "/Android/data/" + packageName + "/files");
myFilesDir.mkdirs();
这很好,结果路径是...
/mnt/sdcard/Android/data/com.mycompany.myApp/files
我需要一个SQLite数据库,希望将其存储在SD卡上,因此我扩展了SQLiteOpenHelper如下...
public class myDbHelper extends SQLiteOpenHelper {
public myDbHelper(Context context, String name, CursorFactory factory, int version) {
// NOTE I prefix the full path of my files directory to 'name'
super(context, myFilesDir + "/" + name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase db) {
// Create tables and populate with default data...
}
}
到目前为止还不错 - 第一次调用getReadableDatabase()
或getWriteableDatabase()
方法时,空的数据库将在SD卡上创建,并且onCreate()
方法将填充它。
这里出现了问题 - 应用程序处于beta测试阶段,可能有5或6个人参与测试,他们都运行Android v2.2,一切正常。然而,我有一个测试者运行v2.1,当myDbHelper
尝试在第一次使用时创建数据库时,应用程序崩溃,提示以下错误信息...
E/AndroidRuntime( 3941): Caused by: java.lang.IllegalArgumentException: File /nand/Android/data/com.mycompany.myApp/files/myApp-DB.db3 contains a path separator
E/AndroidRuntime( 3941): at android.app.ApplicationContext.makeFilename(ApplicationContext.java:1445)
E/AndroidRuntime( 3941): at android.app.ApplicationContext.openOrCreateDatabase(ApplicationContext.java:473)
E/AndroidRuntime( 3941): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:193)
E/AndroidRuntime( 3941): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)
E/AndroidRuntime( 3941): at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:158)
获取文件目录的路径是一个奇怪的过程(“/nand”),因为它是内部存储器,虽然不是手机自身的内部存储器 - 但对于该设备,getExternalStorageDirectory()
返回的确实是这个路径。
我看到了三种可能的答案...
- 虽然在v2.2上可接受,但为DB名称指定完全限定路径并不推荐,并且在早期版本上会失败。
- 全限定路径适用于SD卡存储,但"/nand"路径被解释为“内部”,在这种情况下仅接受相对路径。
- 还有其他一些我完全没有注意到的东西。
如果上述任何一个或所有的内容都适用,我希望有人能帮助我应该如何处理。
谢谢。