【问题标题】:Multiple Insert or Replace Query in Android SQLiteAndroid SQLite 中的多个插入或替换查询
【发布时间】:2015-08-12 09:59:25
【问题描述】:

我正在使用以下查询在“联系人”表中插入或替换“数字”和“时间”。有什么方法可以在 SQLite for Android 中插入或替换多条记录?

"Insert or replace into Contacts (_id, number, status) values ((select _id from Contacts where number = '123456'), '123456','sent');"

【问题讨论】:

  • @Andrew Fielden,它适用于 Sqlite 而不是 MySql
  • @Andrew Fielden,我已经解决了这个问题,但无法通过插入和替换正确调整它。如果你能举一个插入和替换的例子吗?

标签: android sqlite


【解决方案1】:

您可以使用事务和 compileStatement 的概念来提高多个/批量数据库插入或替换操作的速度,这样您的查询将只编译一次。

例如:

    db.beginTransaction();
    try {
         String sql = "Insert or Replace into Items (itemNumber, description,unitOfMeasure, weight) values(?,?,?,?)";
         ArrayList<ItemMaster> itemsList = // Retrieve your items list here
         for(int i=0;i<itemsList.size();i++)
         {

             SQLiteStatement insert = db.compileStatement(sql);
             insert.bindString(1, item.getItemNumber());
             insert.bindString(2, item.getItemDescription1());
             insert.bindString(3, item.getSellingUOM());
             insert.bindDouble(4, item.getWeight());
             insert.execute();
         }
         db.setTransactionSuccessful();
    } finally {
      db.endTransaction();
    }

【讨论】:

  • 感谢您的代码 Patel,但如果您处理 100 条记录,这是一个非常缓慢的过程。我正在寻找任何快速的方法。
  • 不,我相信它并不慢。我已经使用传统的 insert v/s 批量插入方法完成了插入 100 条记录的演示。传统插入需要 1672 毫秒,批量插入只需 92 毫秒。看看这个techrepublic.com/blog/software-engineer/…
【解决方案2】:

试试这个代码来插入多个条目

public void insertIntoTable(ArrayList<YourModelClass> alist) {

        SQLiteDatabase db = this.getWritableDatabase();

        String sql = "insert into tableName (colomname1,colomnname2) values(?,?)";
        db.beginTransaction();
        SQLiteStatement stmt = db.compileStatement(sql);
        for (int i = 0; i < alist.size(); i++) {
            stmt.bindString(1, alist.get(i).getMethod1());
            stmt.bindString(2, alist.get(i).getMethod2());
            stmt.execute();
            stmt.clearBindings();
        }
        db.setTransactionSuccessful();
        db.endTransaction();

        db.close();
    }

同时创建一个模型类来指定你的变量名。 例如:

class ModelClass {

String var1,var2;

public void setVar1(String var1)
{
this.var1=var1;
}

public String getVar1()
{
return var1;
}
public void setVar2(String var2)
{
this.var2=var2;
}

public String getVar2()
{
return var2;
}
}

【讨论】:

    【解决方案3】:

    不确定我是否理解查询,但看起来您可以只更新而不是插入或替换(如果找不到数字,则选择将返回 null

    Update Contacts set status = 'sent' where number in (...)
    

    【讨论】:

    • 如果没有记录存在则失败。
    • 如果是新记录,你想要哪个_idnull 看起来很糟糕
    • _id 是自动递增的,这就是为什么我没有为 _id 提供任何值的原因。 + 如果 number 不存在 _id 则它将插入,否则将更新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多