2013-05-07 81 views
0

我想构建一个sqlite数据库。它有2800个条目。当我尝试插入时,它需要一分钟左右,稍后给出系统错误消息。各自的代码如下。系统错误android sqlite insert

在创建数据库中的Java文件,

ContentValues cv4 = new ContentValues();  
public long createVariantEntry(String varid, String makeid, String modelid, String varname, String posteddate) {   
    cv4.put(VARIANT_ID, varid); 
    cv4.put(VARIANT_MAKE_ID, makeid); 
    cv4.put(VARIANT_MODEL_ID, modelid); 
    cv4.put(VARIANT_NAME, varname); 
    cv4.put(VARIANT_POSTED_DATE, posteddate); 
    return Database.insert(VARIANT_TABLE_NAME, null, cv4); 
} 

在MainActivity,

for(int i = 0; i<build_emp_database.size();i++) 
{     
    md.createVariantEntry(build_emp_database.get(i).get(0), build_emp_database.get(i).get(1), build_emp_database.get(i).get(2), build_emp_database.get(i).get(3), build_emp_database.get(i).get(4));         
} 

而且,只为2800项,它正在一分多钟,有什么办法,以加快他们?我有几个小型数据库,并已成功加载它们。这是唯一的大数据库,它在插入时创建一个问题。请帮助我哪里错了。

+0

对于初学者来说,你可以在'loop'分配'build_emp_database.get(我)'一个局部变量,并调用'得到()'方法这么多次对! – SudoRahul 2013-05-07 03:30:26

+0

感谢您的回复,通过多次调用get()方法,您的意思是什么? – bharath 2013-05-07 03:33:25

+0

'build_emp_database.get(i).get(0)','build_emp_database.get(i).get(1)'等。这是我所指的行。将'build_emp_database.get(i)'分配给一个局部变量myObj,然后调用'myObj.get(0)','myObj.get(1)'等。 – SudoRahul 2013-05-07 03:35:49

回答

1

不要试图在初学者的UI线程上运行插入操作。

我建议你使用内容提供者作为数据库的包装进行调查。 ContentResolver对象提供了批量操作的方法,并且通常是一种更健壮的数据库处理方式。使用IntentService在后台运行插入操作。

+0

感谢您的回复,创建数据库和mainactivity都是不同的java函数。你建议在asyntask中使用intentservice运行插入? – bharath 2013-05-07 03:35:34

1

如果你做了很多插入操作,你需要使用ContentProviderOperation来优化你的数据库操作。像这样的:

ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 
    for(int i = 0; i<build_emp_database.size();i++) { 
     ContentProviderOperation.Builder builder = 
       ContentProviderOperation.newInsert(yourUrl); 
     builder.withValue(VARIANT_ID, varid) 
       .withValue(VARIANT_MAKE_ID, makeid) 
       ... 
     ops.add(builder.build()); 
    } 

    yourContentResolver.applyBatch(yourauthority, ops);