Массовое обновление базы данных

Я давно искал на этом сайте, но не нашел ответа. Я пытаюсь выполнить массовое обновление данных, которые, как я знаю, уже есть в таблице. У меня есть один столбец, который должен быть установлен, когда возвращается определенное условие для идентификатора строки. Вот единственный метод, но я хочу сделать это более эффективным и сделать это в целом. Наша база данных не находится в 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
}

3 ответа

Решение

Пытаться UPDATE tablename SET column=0 WHERE ID IN (...), где ... список значений идентификаторов, разделенных запятыми

Я не разработчик 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,

Самый быстрый способ выполнить массовое обновление - это сделать его как одну транзакцию, используя начальную и конечную транзакции. Также, если размер базы данных большой, было бы неплохо сделать 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();
}
Другие вопросы по тегам