Вставить несколько записей в Sqflite - PullRequest
0 голосов
/ 30 мая 2019

Как быстро вставить несколько записей в sqflite?Стандартный быстрый метод:

await database.insert(table, object.toMap())

Но я не думаю, что вставка записи один в один с циклом - хорошая идея.Или я могу вставить весь список с транзакцией?

Ответы [ 4 ]

1 голос
/ 30 мая 2019

Как я уже упоминал в комментарии, вы можете использовать Batch.Вот образец.

Batch batch = db.batch();
batch.insert('Test', {'name': 'item'});
batch.update('Test', {'name': 'new_item'}, where: 'name = ?', whereArgs: ['item']);
batch.delete('Test', where: 'name = ?', whereArgs: ['item']);

Теперь, если вы ищете результат (это будет стоить вам немного памяти), вы используете

results = await batch.commit();

А если вы ищете быструю производительность, просто проигнорируйте результат ииспользуйте

await batch.commit(noResult: true);

Источник

1 голос
/ 30 мая 2019

Если у вас есть список объектов, которые вы хотите вставить, вы можете сделать это следующим образом (это не очень чистый код, но он работает):

  insertClients(List<Client> clients) async {
    final db = await database;
    var buffer = new StringBuffer();
    clients.forEach((c) {
      if (buffer.isNotEmpty) {
        buffer.write(",\n");
      }
      buffer.write("('");
      buffer.write(c.firstName);
      buffer.write("', '");
      buffer.write(c.lastName);
      buffer.write("', '");
      buffer.write(c.address);
      buffer.write("')");
    });
    var raw =
        await db.rawInsert("INSERT Into Clients (firstName,lastName,address)"
            " VALUES ${buffer.toString()}");
    return raw;
  }

Я использую это утверждение из SQLite:

INSERT INTO 'tablename' ('column1', 'column2') VALUES
                ('data1', 'data2'),
                ('data1', 'data2'),
                ('data1', 'data2');
1 голос
/ 30 мая 2019

Вы можете использовать партию в таком случае.

batch = db.batch();
batch.insert('Test', {'name': 'item'});
batch.update('Test', {'name': 'new_item'}, where: 'name = ?', whereArgs: ['item']);
batch.delete('Test', where: 'name = ?', whereArgs: ['item']);
results = await batch.commit();

большие партии, вы можете использовать await batch.commit(noResult: true);

0 голосов
/ 08 июня 2019

Я видел возможность использования базы данных транзакций, очень похожих на Android.Я считаю, что лучше использовать их, здесь я показываю пример кода, если он может быть кому-то полезен.В моем примере показаны try-catches, но можно использовать обратные вызовы функций Future для получения более чистого кода:

Future<List<dynamic>> insertAll(String table, List<dynamic> objects) async {
List<dynamic> listRes = new List();
var res;
try {
  await DbHelper().database.transaction((db) async {
    objects.forEach((obj) async {
      try {
        var iRes = await db.insert(table, obj.toMap());
        listRes.add(iRes);
      } catch (ex) {
        DbHelper().databaseLog(CON_INSERT_MULTIPLE, "Error!", ex);
      }
    });
  });
  DbHelper().databaseLog(CON_INSERT_MULTIPLE, table, listRes);
  res = listRes;
} catch (er) {
  res = OutComeCallClient.ERROR;
  DbHelper().databaseLog(CON_INSERT_MULTIPLE, "Error!", er);
}
return res;

}

...