Environment.getExternalStorageDirectory().getAbsolutePath()无法正常工作并提供/存储

Shi*_*ade 3 storage android external path android-sdcard

我的代码

myDb = openOrCreateDatabase("/sdcard/FashionGirl/ImagesDB.db", Context.MODE_PRIVATE, null);
myDb = openOrCreateDatabase(dbPath, Context.MODE_PRIVATE, null);
Run Code Online (Sandbox Code Playgroud)

工作得很好,但却发出了警告 Do not hardcode "/sdcard/"; use Environment.getExternalStorageDirectory().getPath() instead

所以我试过,

String dbPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "FashionGirl/ImagesDB.db";
myDb = openOrCreateDatabase(dbPath, Context.MODE_PRIVATE, null);
Run Code Online (Sandbox Code Playgroud)

但奇怪的是,它不起作用,其中Environment.getExternalStorageDirectory().getAbsolutePath()具有价值 /storage

所以给出错误,

12-17 19:32:02.230: E/SqliteDatabaseCpp(15620): sqlite3_open_v2("/storageFashionGirl/ImagesDB.db", &handle, 6, NULL) failed
12-17 19:32:02.230: E/SQLiteDatabase(15620): Failed to open the database. closing it.
12-17 19:32:02.230: E/SQLiteDatabase(15620): android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file
12-17 19:32:02.230: E/SQLiteDatabase(15620):    at android.database.sqlite.SQLiteDatabase.dbopen(Native Method)
12-17 19:32:02.230: E/SQLiteDatabase(15620):    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:983)
12-17 19:32:02.230: E/SQLiteDatabase(15620):    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:956)
12-17 19:32:02.230: E/SQLiteDatabase(15620):    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:932)
Run Code Online (Sandbox Code Playgroud)

那么为什么Android推荐的东西不起作用,我该怎么办?

Com*_*are 5

String dbPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "FashionGirl/ImagesDB.db";
myDb = openOrCreateDatabase(dbPath, Context.MODE_PRIVATE, null);
Run Code Online (Sandbox Code Playgroud)

请不要使用串联来构造文件路径.尝试:

File dbPath = new File(Environment.getExternalStorageDirectory(), "FashionGirl/ImagesDB.db");
myDb = openOrCreateDatabase(dbPath.getAbsolutePath(), Context.MODE_PRIVATE, null);
Run Code Online (Sandbox Code Playgroud)

但奇怪的是,它不起作用,其中Environment.getExternalStorageDirectory().getAbsolutePath()具有值/存储

那是因为/sdcard已经被弃用近三年了.

  • @WhyandHow:在Java中被认为是糟糕的形式10到15年.使用`File`构造函数不仅可以保护您免受丢​​失路径分隔符错误的影响,还可以处理其他平台细节(例如,Windows上的`/`与`\`).后一个功能对于仅支持Android的应用程序可能并不那么重要,但使用`File`构造函数而不是连接是一般的好习惯. (2认同)