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

时间:2013-04-12 18:08:06

标签: java android database

我必须在数据库中插入50到500个联系人信息。我有4个arraylists分别包含图像,名称,数字,bool变量。

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

enter image description here

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

在性能方面有什么好处?

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

OR

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

4 个答案:

答案 0 :(得分:6)

  

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

我建议您创建自己的对象来表示您的表,其中对象的属性将等于表中的列,e.q。

public class Contact {

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

   //getters and setters
}

现在你的方法听起来像“意大利面条代码”。不需要有四个ArrayLists,这种设计效率不高。

现在,您将拥有一个包含500个孩子的Contact对象的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);
    }
}

答案 1 :(得分: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();
}

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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