1

我在 Android、ICS 上使用 SQLite。当我进行更新时,我得到一个SQLiteReadOnlyDatabaseException. 这很奇怪,因为我用SQLiteOpenHelper.getWritableDatabase(). 此外,我在更新发生之前测试了数据库是否是只读的myDB.isReadonly()。Gingerbread 不会发生此异常。我怀疑它与跨android版本的不同版本的sqlite有关。

这是我创建数据库的代码。

protected static class DBHelper extends SQLiteOpenHelper {
    DBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CreateStatements.CREATE_MOVIES);
...

}

public class DBAdapter {
    public static final String PACKAGE_NAME =     
    protected DBHelper dbHelper;
    protected Context context;
    protected SQLiteDatabase myDB;
    public CreateStatements statement;

    public DBAdapter(Context context) {
        this.context = context;
    }

    public void open() throws SQLException {
        dbHelper = new DBHelper(context);
        myDB = dbHelper.getWritableDatabase();
        myDB.setLockingEnabled(false);
    }

    public void close() {
        myDB.close();
    }
...

}
4

1 回答 1

0

我最近面对。这是如何解决的:

try{
   myDB = dbHelper.getWritableDatabase();
} catch (SQLiteReadOnlyDatabaseException e){
   Log.d(TAG, "SQLiteReadOnlyDatabaseException");
   startActivity(new Intent(context, MainActivity.class));
}

更新数据库时,它会保留与旧数据库的一些连接。当new DBHelper(context)数据库升级后再次执行时,帮助程序链接回旧数据库。因此,您需要关闭此类并重新初始化它。在我的例子中,MainActivity 是首先初始化 dbHelper 的类。因此,当捕获到异常并重新启动活动时,与旧数据库的连接将被删除并且工作正常。

于 2016-07-20T06:42:49.730 回答