Bulk Insert for cordovaSQLite

Bulk Insert for cordovaSQLite

本文关键字:cordovaSQLite for Insert Bulk      更新时间:2023-09-26

cordovaSQLite有批量插入吗?我有很多数据,我想将其保存在sqlite Db中。

我现在的代码是

var query = "INSERT INTO Card (CardId, CardSetId, FrontText, BackText, ControlType, CardLevel, IsDirty, ChangedAt, Active) VALUES (?,?,?,?,?,?,?,?,?)";
for (var i = 0; i < cardList.length; i++) {
    $cordovaSQLite.execute(db, query, [cardList[i].CardId, cardList[i].CardSetId, cardList[i].FrontText, cardList[i].BackText, cardList[i].ControlType, cardList[i].CardLevel, cardList[i].IsDirty, cardList[i].ChangedAt, cardList[i].Active]);
}

它可以工作,但非常非常慢!

当我使用此代码时:

var query = "INSERT INTO Card (CardId, CardSetId, FrontText, BackText, ControlType, CardLevel, IsDirty, ChangedAt, Active) VALUES ";
var data = [];
var rowArgs = [];
cardList.forEach(function (card) {
    rowArgs.push("(?,?,?,?,?,?,?,?,?)");
    data.push(card.CardId);
    data.push(card.CardSetId);
    console.log(card.CardSetId);
    data.push(card.FrontText);
    data.push(card.BackText);
    data.push(card.ControlType);
    data.push(card.CardLevel);
    data.push(card.IsDirty);
    data.push(card.ChangedAt);
    data.push(card.Active);
});
query += rowArgs.join(", ");
$cordovaSQLite.execute(db, query, [data]).then(function (res) {
    console.log("inserted");
    }, function(err) {
          console.dir(err);
});

然后我收到以下错误:sqlite3_step失败:非空约束失败:卡集ID

但是在数据数组中,CardSetId 不为空!

有没有办法让它更快,或者用批量插入来做?

谢谢

你可以尝试使用 cordova-sqlite-porter。使用 importJsonToDb(( 将您的插入作为 JSON 结构传递,它将优化插入到 SQLite 数据库中。

示例项目演示了插入 15,000+ 条记录。在三星 Galaxy S4 上,使用单个 SQL 插入语句执行此操作大约需要 5 分钟/300 秒,但优化的 JSON 等效项(使用 UNION SELECT - 有关信息请参阅此处(在同一设备上大约需要 3 秒 - 快 100 倍。