В моем приложении я использую...
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()
заполняет ее.
Итак, вот проблема: приложение находится в бета-тестировании с 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()
для этого устройства.
Я вижу три возможных ответа...
- Хотя допустимо в версии 2.2, указание полного пути для имени базы данных не рекомендуется и будет работать с более ранними версиями
- Для хранения SD-карты допустимы полные пути, но путь "/nand" интерпретируется как "внутренний", и в этом случае допустимы только относительные пути.
- Что-то еще, что мне не хватает полностью
Если применимо какое-либо или все вышеперечисленное, я был бы признателен, если бы кто-нибудь мог помочь с тем, как я должен подходить к этому.
Спасибо.