我必须在数据库中插入50到500个联系人信息。我有4个arraylists分别包含图像,名称,数字,bool变量。
数据中的每一行都由所有4个arraylists和SNO组合而成。请参考下图。
我的问题是,假设我有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);
}
}
答案 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。
如果您决定使用此链接中描述的方法,最好是创建一个函数来生成此查询并仅运行一次。否则正如其他人所提到的,您可以使用事务来提高许多插入的性能。