Ну, я думаю, ты не можешь этого сделать. Если кто-нибудь знает способ, пожалуйста, сообщите нам, как.
Итак, когда вы звоните
mySqliteOpenHelper.getReadableDatabase();
Все должно быть хорошо, как будто мы смотрим на реализацию , мы видим, что:
String path = mContext.getDatabasePath(mName).getPath();
Все хорошо. Но если мы посмотрим несколько строк вверх:
return getWritableDatabase();
Таким образом, он фактически вызывает другой метод, и если он не работает, только тогда он продолжает использовать getDatabasePath ().
Если мы посмотрим на реализацию getWritableDatabase - мы ясно увидим, что она не использует getDatabasePath, а вместо этого:
db = mContext.openOrCreateDatabase(mName, 0, mFactory);
Это подводит нас к рассмотрению того, как реализована openOrCreateDatabase, для этого мы рассмотрим ContextImpl.java
if (name.charAt(0) == File.separatorChar) {
String dirPath = name.substring(0, name.lastIndexOf(File.separatorChar));
dir = new File(dirPath);
name = name.substring(name.lastIndexOf(File.separatorChar));
f = new File(dir, name);
} else {
dir = getDatabasesDir();
f = makeFilename(dir, name);
}
Итак, мы можем видеть, что этот вспомогательный метод validateFilePath возвращает File, если он получает полный путь (например, / some / true / full / path) или пытается объединить getDatabasesDir () с именем файла.
Реализация getDatabasesDir () использует функцию getDataDirFile (), которая является общедоступной и, возможно, теоретически может быть перезаписана ... но вам придется проверить.
В настоящее время я вижу два решения:
1) Если вам не нужна сила доступа для записи sqlite db в режиме только для чтения, getWritableDatabase завершится сбоем и getDatabasePath будет вызываться
2) Передайте полный путь в конструктор SQLiteOpenHelper и убедитесь, что БД доступна для записи, что-то вроде:
public class MyDbOpenHelper extends SQLiteOpenHelper {
public MyDbOpenHelper(final Context context) {
super(context, Environment.getExternalStorageDirectory()
+ "/path/to/database/on/sdcard/database.sqlite", null, 1);
}
Это действительно не имеет смысла для меня, но, глядя на источники Android (по крайней мере, 2.3.1), кажется, что так оно и реализовано.