【问题标题】:Insert data into Database - What is the best way to do it将数据插入数据库 - 最好的方法是什么
【发布时间】:2013-04-05 09:02:35
【问题描述】:

我必须在数据库中插入 50 - 500 个联系人的信息。我有 4 个数组列表,分别包含图像、名称、数字、布尔变量。

数据中的每一行都由所有 4 个数组列表和一个 SNO 组合而成。请参考下图。

我的问题是,假设我从用户的联系人列表中检索到 500 个联系人。这是一件好事吗,我有一个函数可以一次将每一行插入到表中并调用它 500 次?还是有其他方法?一个卑鄙的想法是将所有数组列表组合在一起,将其传递给函数并在那里检索数据并重复插入语句 500 次。

在性能方面什么更好?

for(int i =0; i < 500; i++)
{
  dbObj.insert_row(par1, par2, par3, par4, ...);
}

function insert_row(Combined ArrayLists)
{
  for(int i=0; i<500; i++)
  {
    db.execSql(//Insert Statement);
  }
}

【问题讨论】:

标签: java android database


【解决方案1】:

将数据插入数据库 - 最好的方法是什么

我建议您创建自己的对象来代表您的表,其中对象的属性将等于表中的列,例如。

public class Contact {

   private String name;
   private String number;
   private String image;
   private boolean conn;

   //getters and setters
}

现在您的方法听起来像是“意大利面条代码”。没有必要有四个ArrayList,这种设计效率不高,也不正确。

现在,您将拥有一个包含 500 个孩子的联系人对象的 ArrayList。

什么是最好的插入方式?

请务必将您的插入内容包装到一个 TRANSACTION 上,这样可以快速加快您的插入速度,并且您处理数据库的主要内容会变得更加安全,然后您无需担心丢失数据库完整性的可能性。

交易示例(我个人示例项目中的一种方法):

public boolean insertTransaction(int count) throws SQLException {
    boolean result = false;
    try {
        db = openWrite(DataSource.getInstance(mContext));
        ContentValues values = new ContentValues();
        if (db != null) {
            db.beginTransaction();
            for (int i = 0; i < count; i++) {
                values.put(SQLConstants.KEY_TYPE, "type" + i);
                values.put(SQLConstants.KEY_DATE, new Date().toString());
                db.insertOrThrow(SQLConstants.TEST_TABLE_NAME, SQLConstants.KEY_TYPE, values);
                values.clear();
            }
            db.setTransactionSuccessful();
            result = true;
        }
        return result;
    }
    finally {
        if (db != null) {
            db.endTransaction();
        }
        close(db);
    }
}

【讨论】:

  • 非常感谢您的意见。等待期结束后将接受您的回答..
【解决方案2】:

如果你要向数据库中插入 500 条记录,你应该使用事务

database.beginTransaction();
try {
     // perform inserts
     database.setTransactionSuccessful();
finally {
     database.endTranasction();
}

【讨论】:

  • 交易范围是什么?如果一个插入失败,是否所有插入都失败?
  • 事务是这样工作的,如果一个插入失败,所有的插入都会被取消。要么一切都执行成功,要么什么都没有。
  • 我知道,我问你这是否是正确的逻辑。插入是如何关联的?我认为每个人都是独立的。
  • 使用事务将保证数据的一致性,这很重要。
  • 我的意思是这里的交易是不必要的。他正在插入 500 行不同的行。如果一个插入没有通过(重复键、其他违反约束等),它不应该影响其他插入。但是使用此设置,如果插入失败,您将回滚并取消所有插入。另外,这种情况下的插入已经是酸性的(他没有证明插入会影响其他任何东西)
【解决方案3】:

如前所述,创建您自己的类来表示一行或使用ContentValues class SQlite 不能像 MySQL 那样在一个查询中插入许多行,但有一些方法可以解决它你可以阅读here

如果您决定使用此链接中描述的方法,最好创建一个函数来生成此查询并只运行一次。否则正如其他人已经提到的,您可以使用事务来提高许多插入的性能。

【讨论】:

    【解决方案4】:

    将 4 个数组转换为一个对象数组使代码更好。但是您可以创建这些对象,而无需这样做。

    使用绑定变量(? 或 :vars)准备 sql 语句,然后通过为每一行设置绑定变量在循环中多次执行该语句。

    String sql = "insert into..... values (?,?,?,?)";
    // Get connection etc
    PreparedStatement stmt = conn.prepareStatement(sql);
    for(int i =0; i < 500; i++)
    {
       stmt.setString(1, name.get(i));
       stmt.setNumber(2, number.get(i));
       ...
    
       stmt.executeUpdate();
    }
    

    【讨论】:

      猜你喜欢
      • 2020-05-15
      • 1970-01-01
      • 2016-04-20
      • 1970-01-01
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多