for循环中更新/插入sqlite数据库报错

bxjxxyy 2019-08-05 03:12:42

在一个for循环中执行数据库更新/插入操作,数据库代码如下
   Cursor c = dbhelper.getReadableDatabase().rawQuery(
"select * from ReadCount where domain=?", new String[]{model.getDomain()});
int count = c.getCount();
c.close();
ContentValues cv = new ContentValues();
cv.put("domain", model.getDomain());
cv.put("time", model.getTime());
cv.put("rulecount", model.getRulecount());
if (count > 0) {
String where = "domain = ?";
String[] whereValues = {model.getDomain()};
dbhelper.getWritableDatabase().update("ReadCount", cv, where, whereValues);
} else {
dbhelper.getWritableDatabase().insert("ReadCount", null, cv);
}


通过百度统计后台的崩溃统计会看到大量的android.database.sqlite.SQLiteReadOnlyDatabaseException: attempt to write a readonly database (Sqlite code 1032), (OS error - 2:No such file or directory)错误导致的崩溃。但是在我的手机上没有出过这种问题。这种情况怎么办?
...全文
508 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
bxjxxyy 2019-08-08
  • 打赏
  • 举报
回复
引用 4 楼 assky124 的回复:
attempt to write a readonly database Android Sqlite 读写是两个镜像,会不会搞错镜像了。 批量操作加个事务看看呢
还是会报错。事务代码如下

    public void TransactionUpdrule(List<ReadCountModel> list){
        List<ContentValues> insertlist=new ArrayList<ContentValues>();
        List<ContentValues> updlist=new ArrayList<ContentValues>();
        for(int i=0;i<list.size();i++){
            Cursor c = dbhelper.getReadableDatabase().rawQuery(
                    "select * from ReadCount where domain=?", new String[]{list.get(i).getDomain()});
            int count = c.getCount();
            c.close();
            ContentValues cv = new ContentValues();
            cv.put("domain", list.get(i).getDomain());
            cv.put("time", list.get(i).getTime());
            cv.put("rulecount", list.get(i).getRulecount());
            if(count>0){
                updlist.add(cv);
            }else{
                insertlist.add(cv);
            }
        }
        SQLiteDatabase db = dbhelper.getWritableDatabase();
        db.beginTransaction(); // 手动设置开始事务
        for(ContentValues v:insertlist){
            db.insert("ReadCount", null, v);
        }
        for(ContentValues v:updlist){
            String[] whereValues = {v.getAsString("domain")};
            db.update("ReadCount", v, "domain = ?", whereValues);
        }
        db.setTransactionSuccessful(); // 设置事务处理成功,不设置会自动回滚不提交
        db.endTransaction(); // 处理完成
        db.close();
    }

bxjxxyy 2019-08-06
  • 打赏
  • 举报
回复
引用 4 楼 assky124 的回复:
attempt to write a readonly database Android Sqlite 读写是两个镜像,会不会搞错镜像了。 批量操作加个事务看看呢
用的是getWritableDatabase。在多数人手机正常,部分不正常,问题是也不知道谁,什么手机,什么情况下不正常。只能通过百度统计看到这个错误
assky124 2019-08-06
  • 打赏
  • 举报
回复
attempt to write a readonly database Android Sqlite 读写是两个镜像,会不会搞错镜像了。 批量操作加个事务看看呢
bxjxxyy 2019-08-06
  • 打赏
  • 举报
回复
引用 1 楼 m-oj 的回复:
dbhelper发出来看看

  private Context context;
    private static ReadDbHelper dbhelper;
    //原版
    public ReadDbCmd(Context context) {
        this.context = context;
//        dbhelper = new ReadDbHelper(context, null, null, 9);
        dbhelper = getInstance(context);
    }

    private static ReadDbHelper getInstance(Context context) {
        if (dbhelper == null) {
            dbhelper = new ReadDbHelper(context, null, null, 9);
        }
        return dbhelper;
    }
bxjxxyy 2019-08-06
  • 打赏
  • 举报
回复
引用 1 楼 m-oj 的回复:
dbhelper发出来看看


public class ReadDbHelper extends SQLiteOpenHelper {
public static final String CREATE_ReadCount = "create TABLE IF NOT EXISTS ReadCount (id INTEGER PRIMARY KEY autoincrement,domain varchar,rulecount INTEGER,count INTEGER,time INTEGER)";
public ReadDbHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, "ReadCount", null, version);
}

@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_ReadCount);
System.out.println("执行创建s");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS ReadCount");
onCreate(db);
}
}
m-oj 应用层 2019-08-05
  • 打赏
  • 举报
回复
dbhelper发出来看看

80,348

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧