SQLiteAssetHelper - 特定手机上的问题,例如OnePlus

6

我在我的应用中使用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问题:this is the correct one。在那里它说:“OnePlus能够将数据库复制到/data/data/package-name/databases/filename.db,但不允许访问该数据,我对此一无所知。”


嘿,你想把数据库从一个地方复制到另一个地方吗? - Chirag Savsani
https://dev59.com/J1wY5IYBdhLWcg3wYW1X#34260857 - Vishal Patel
哪些具体型号给你带来了这个问题?我可以尝试找到其中一个来复现此问题。 - CommonsWare
OnePlus One A2003,A2001 - swalkner
2个回答

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;
}

如果你想复制粘贴别人的答案,至少要完整地复制并给原始用户以功劳 :-| 附注:原始答案[链接](https://dev59.com/J1wY5IYBdhLWcg3wYW1X#34260857) - Build3r

2

SQLiteAssetHelper构造函数允许您指定自己的数据库目标路径(该文件夹需要可写)。如果您没有指定,则默认使用一个。请参阅来自Github repo的以下摘录:

    if (storageDirectory != null) {
        mDatabasePath = storageDirectory;
    } else {
        mDatabasePath = context.getApplicationInfo().dataDir + "/databases";
    }

但我正在设置setForcedUpgrade() - 这个问题只出现在三种设备类型上,其中 OnePlus 占了 97%。 - swalkner
你可以尝试将数据库保存在一个你确定可以读写的不同文件夹中,而不是 /data/data/my.package.id/databases/database.db 吗?也许那个特定的设备正在对数据文件夹应用某种数据保护规则。 - narko
是的,但接下来的问题是什么?有哪个目录可以确保每个设备都可以读写并适合这样的任务? - swalkner
我只是为了调试而说,并不是最终解决方案。也许是媒体文件夹的问题? 我想也许文件“database.db”没有写入授权。 - narko
1
很遗憾,我手头没有一加二手机,因此无法进行调试以找到正确的文件夹... getReadableDatabase() 也不起作用。 - swalkner
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接