繁体   English   中英

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

[英]Insert data into Database - What is the best way to do it

我必须在数据库中插入50-500个联系人的信息之间的任意位置。 我有4个arraylists分别包含图像,名称,数字,布尔变量。

数据中的每一行都由所有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);
  }
}

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

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

public class Contact {

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

   //getters and setters
}

现在,您的方法听起来像是“意大利面条代码”。 不需要有四个ArrayList,并且此设计效率不高且不正确。

现在,您将拥有一个带有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);
    }
}

将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();
}

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM