3

我在这个网站上找了一段时间,但没有找到答案。我正在尝试对我知道表中已经存在的数据进行批量更新。当某个条件返回行 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 数组来进行批量更新。我无法执行插入或替换语句,因为我无权访问所有列数据,并且由于代码更改过多而不想通过它。

public void markUnavailable(int[] myId) {
   // ????
   /// need some way to loop through and update in bulk
}
4

3 回答 3

8

试试UPDATE tablename SET column=0 WHERE ID IN (...),其中...是一个以逗号分隔的 ID 值列表。

于 2013-10-10T20:51:53.060 回答
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 hasSQLiteDatabase.update将非常有用,但String [] whereArgs不能很好地处理您的int[] myId.

于 2013-10-11T10:01:58.327 回答
2

进行批量更新的最快方法是将其作为单个事务进行,通过使用开始和结束事务。此外,如果数据库的大小很大,最好将 myID 作为表的主键,因为当使用 WHERE 子句时,它将显着提高获取行以进行更新的速度。 [它据说索引可以降低更新和插入的速度,但是当使用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();
}
于 2016-09-29T09:58:06.700 回答