在一個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)錯誤導致的崩潰。但是在我的手機上沒有出過這種問題。這種情況怎么辦?
uj5u.com熱心網友回復:
dbhelper發出來看看uj5u.com熱心網友回復:
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);
}
}
uj5u.com熱心網友回復:
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;
}
uj5u.com熱心網友回復:
attempt to write a readonly databaseAndroid Sqlite 讀寫是兩個鏡像,會不會搞錯鏡像了。
批量操作加個事務看看呢
uj5u.com熱心網友回復:
用的是getWritableDatabase。在多數人手機正常,部分不正常,問題是也不知道誰,什么手機,什么情況下不正常。只能通過百度統計看到這個錯誤
uj5u.com熱心網友回復:
還是會報錯。事務代碼如下
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();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/120844.html
標籤:Android
