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";
    }
Другие вопросы по тегам