Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/190.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将数据插入数据库-最好的方法是什么_Java_Android_Database - Fatal编程技术网

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

Java 将数据插入数据库-最好的方法是什么,java,android,database,Java,Android,Database,我必须在数据库中插入50-500个联系人的信息。我有4个数组列表,分别包含image、name、number和bool变量 数据中的每一行由所有4个ArrayList和一个SNO组成。请参考下图 我的问题是,假设我从用户的联系人列表中检索到500个联系人。我有一个函数,一次将每一行插入到表中并调用500次,这是一件好事吗?或者还有别的办法吗?一个简单的想法是将所有ArrayList组合在一起,将其传递给函数并在那里检索数据,然后将insert语句重复500次 在性能方面,什么更好 for(in

我必须在数据库中插入50-500个联系人的信息。我有4个数组列表,分别包含image、name、number和bool变量

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

我的问题是,假设我从用户的联系人列表中检索到500个联系人。我有一个函数,一次将每一行插入到表中并调用500次,这是一件好事吗?或者还有别的办法吗?一个简单的想法是将所有ArrayList组合在一起,将其传递给函数并在那里检索数据,然后将insert语句重复500次

在性能方面,什么更好

for(int i =0; i < 500; i++)
{
  dbObj.insert_row(par1, par2, par3, par4, ...);
}
for(int i=0;i<500;i++)
{
dbObj.插入_行(par1、par2、par3、par4等);
}

函数插入_行(组合数组列表)
{

对于(inti=0;i将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();
}
String sql=“插入到……值(?,?,?)”;
//取得联系等
PreparedStatement stmt=conn.prepareStatement(sql);
对于(int i=0;i<500;i++)
{
stmt.setString(1,name.get(i));
stmt.setNumber(2,number.get(i));
...
stmt.executeUpdate();
}
将数据插入数据库-最好的方法是什么

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

public class Contact {

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

   //getters and setters
}
现在,您的方法听起来像“意大利面条代码”。不需要有四个ArrayList,这种设计既不高效也不正确

现在,您将拥有一个包含500个child的Contact对象的ArrayList

插入的最佳方式是什么

当然,将插入打包到一个
事务中
,这样可以快速加快插入速度,并且处理数据库的主要步骤变得更加安全,这样您就不必担心丢失数据库完整性的可能性

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

public boolean insertTransaction(int count)抛出SQLException{
布尔结果=假;
试一试{
db=openWrite(DataSource.getInstance(mContext));
ContentValues=新的ContentValues();
如果(db!=null){
db.beginTransaction();
for(int i=0;i
若要在数据库中插入500条记录,则应使用事务处理

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

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


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

首先,将4个ArrayList替换为自定义类类型的1个ArrayList。您可以构建一个
INSERT
查询以插入多行:非常感谢您的输入。等待期结束后,我们将接受您的回答。事务的范围是什么?如果单个插入失败,是否所有插入都失败?这就是事务的工作方式,如果一个插入失败,所有插入都将被取消。或者所有操作都成功执行,或者什么都没有。我知道那么,我想问你这是否是正确的逻辑。插入是如何关联的?我认为每个插入都是独立的。事务的使用将保证数据的一致性。重要的是。我的意思是事务在这里是不必要的。他插入了500个不同的行。如果一个插入没有通过(重复键、其他违反约束等)它不应影响其他插入。但使用此设置,如果一个插入失败,您将回滚并取消所有插入。此外,本例中的插入已经是ACID(他没有显示任何证据表明插入会影响任何其他内容)
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);
    }
}
database.beginTransaction();
try {
     // perform inserts
     database.setTransactionSuccessful();
finally {
     database.endTranasction();
}