我一直在这个网站上看一段时间,但还没有找到答案。我正在尝试对我知道已经在表中的数据进行批量更新。当某个条件返回行ID时,我需要设置一列。这是单一方法,但我想提高效率,并将其作为批量处理。我们的数据库不在Provider中,因此我只使用Helper类。
public void markUnavailable(int myId) {
SQLiteDatabase db = this.getWritableDatabase();
String sql = "UPDATE " + MYTABLE + " SET " + Col.IS_AVAILABLE + "= 0"+ " WHERE " + Col.MY_ID + "=" + myId;
db.execSQL(sql);
db.close();
}
我想传入一组myIds来进行批量更新。我无法执行Insert或Replace语句,因为我无法访问所有列数据,并且由于代码更改太多而无法通过它。
public void markUnavailable(int[] myId) {
// ????
/// need some way to loop through and update in bulk
}
答案 0 :(得分:8)
尝试UPDATE tablename SET column=0 WHERE ID IN (...)
,其中...
是以逗号分隔的ID值列表。
答案 1 :(得分:7)
我不是Android开发人员,但根据良好的数据库实践,您应该:
public void markUnavailable(int[] myId) {
SQLiteDatabase db = this.getWritableDatabase();
db.beginTransaction();
SQLiteStatement upd=db.compileStatement("UPDATE "+MYTABLE+" SET "+Col.IS_AVAILABLE+"=0 WHERE "+Col.MY_ID+"=?";
for (int i = 0; i < myId.length; i++) {
upd.bindLong(1, myId[i]);
upd.execute();
}
db.endTransaction();
}
Android SQLiteDatabase.update
在这种情况下非常有用,但String [] whereArgs
不能很好地处理您的int[] myId
。
答案 2 :(得分:2)
进行批量更新的最快方法是使用开始和结束事务将其作为单个事务执行。此外,如果数据库的大小很大,最好将myID作为表的主键,因为当使用WHERE子句时,它将显着提高获取更新行的速度。[It据说索引可以降低更新和插入的速度,但是当使用where子句时,索引总是会使我的速度大幅增加。
public void markUnavailable(int[] myId) {
SQLiteDatabase db = this.getWritableDatabase();
db.beginTransaction();
SQLiteStatement upd=db.compileStatement("UPDATE "+MYTABLE+" SET "+Col.IS_AVAILABLE+"=0 WHERE "+Col.MY_ID+"=?");
for (int i = 0; i < myId.length; i++) {
upd.clearBindings();
upd.bindLong(1, myId[i]); // this matches the first "?"
upd.execute();
}
db.setTransactionSucessful();
db.endTransaction();
}