Android插入数据SQLite错误由java.lang.IllegalStateException引起:数据库未打开

时间:2012-03-02 08:10:04

标签: android sqlite android-contentprovider

当我从服务器获取数据时,我将数据插入到我自己的内容提供程序中,但它总是出错。这是日志

 Caused by: java.lang.IllegalStateException: database not open
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1585)
at com.weiboa.data.StatusProvider.insert(StatusProvider.java:107
    at android.content.ContentProvider$Transport.insert(ContentProvider.java:210)
    at android.content.ContentResolver.insert(ContentResolver.java:606)
    at com.weiboa.util.WeiboUserUtil.insertTweet(WeiboUserUtil.java:121)

这是我ContentProvider中的插入代码:

SQLiteDatabase db = dbHelper.getWritableDatabase();
try{
    long id = db.insertWithOnConflict(TABLE, null, values,SQLiteDatabase.CONFLICT_REPLACE);
    if(id == -1){
        throw new RuntimeException(String.format("%s : Failed to insert [%s] to [%s] for unknow reason,", TAG, values, uri));
    }else{
        return ContentUris.withAppendedId(uri, id);
    }
 }finally{
    db.close();
 }

我在android源代码中找到错误信息,它会检查SQLiteDatabase.isOpen(),并在函数getWritableDatabase中,它总是检查数据库是否打开?

if (mDatabase != null && mDatabase.isOpen() && !mDatabase.isReadOnly()) {
        return mDatabase;  // The database is already open for business
    }

所以我不知道造成这个错误的真正原因是为什么没有打开数据库。

1 个答案:

答案 0 :(得分:0)

我有完全相同的问题。

正如@Luksprog在第一条评论中提到的那样,只需删除

即可
db.close();

通常,在内容提供程序中,您永远不必显式关闭数据库。帮手为你做的。