SQLiteAssetHelper - проблемы на определенных телефонах, например OnePlus
Я испытываю сбои на некоторых устройствах при использовании SQLiteAssetHelper в моем приложении, больше всего на устройствах OnePlus. Теперь я прочитал здесь, что это связано с каталогом, в котором хранится база данных.
Сейчас я пытаюсь найти обходной путь, лучшее, что я мог бы найти в данный момент, это конструктор, подобный этому
public MySubclass(Context context) {
super(context, databaseName, context.getFilesDir() + "/databases", null, databaseVersion);
Это правильный способ сделать это или есть другие проблемы с этим подходом?
РЕДАКТИРОВАТЬ
Исключение составляет
Fatal Exception: android.database.sqlite.SQLiteException: Can't upgrade read-only database from version x to y: /data/data/my.package.id/databases/database.db
Извините, я связал неправильный SO-вопрос: это правильный. Там написано, что "OnePlus может скопировать базу данных в /data/data/package-name/databases/filename.db, но не позволяет получить доступ к этим данным, и я понятия не имею об этом".
2 ответа
Hey you can copy database from one to another from below mentioned code.
public class MySQLiteHelper extends SQLiteOpenHelper implements DBConstants {
private static MySQLiteHelper mInstance = null;
private SQLiteDatabase myDataBase;
private static String DB_PATH = "";
public MySQLiteHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
try {
if (checkDataBase())
openDataBase();
else
myDataBase = this.getReadableDatabase();
} catch (Exception e) {
}
}
public static MySQLiteHelper instance(Context context) {
File outFile = context.getDatabasePath(DATABASE_NAME);
DB_PATH = outFile.getPath();
if (mInstance == null) {
mInstance = new MySQLiteHelper(context);
}
return mInstance;
}
Конструктор SQLiteAssetHelper позволяет указать собственный путь к базе данных (папка должна быть доступна для записи). Если вы не укажете ничего, он будет использовать по умолчанию. Смотрите этот отрывок из репозитория Github:
if (storageDirectory != null) {
mDatabasePath = storageDirectory;
} else {
mDatabasePath = context.getApplicationInfo().dataDir + "/databases";
}