4

我必须在数据库中插入 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);
  }
}
4

4 回答 4

6

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

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

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);
    }
}
于 2013-04-12T18:13:45.250 回答
0

将 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();
}
于 2013-04-12T18:12:43.247 回答
0

如果要将 500 条记录插入数据库,则应使用事务

database.beginTransaction();
try {
     // perform inserts
     database.setTransactionSuccessful();
finally {
     database.endTranasction();
}
于 2013-04-12T18:16:56.737 回答
0

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

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

于 2013-04-12T18:23:05.013 回答