gpt4 book ai didi

Android - 加快向数据库中插入数据的速度

转载 作者:搜寻专家 更新时间:2023-10-30 22:16:49 26 4
gpt4 key购买 nike

我目前有一个 CSV 文件,我正在解析它并试图将数据插入到 android 数据库中。我遇到的问题是插入所有数据花费的时间太长。这是一个很好的数据量,但我觉得不应该花 20 分钟左右的时间来完成。

基本上,我创建我的数据库,然后开始解析。在解析每个单独的 CSV 行时,我获取所需的数据并将其插入数据库。总共有大约 40000 行。

有什么方法可以加快这个过程吗?我试过批量插入,但它从来没有真正帮助过(除非我做错了)。

代码在下面。

谢谢。

DatabaseHelper(我有两个基于每个 csv 行中的数据量的插入命令):

// add zipcode
public void add9Zipcode(String zip, String city, String state, String lat,
String longi, String decom) {

// get db and content values
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();

db.beginTransaction();
try{

// add the values
values.put(KEY_ZIP, zip);
values.put(KEY_STATE, state);
values.put(KEY_CITY, city);
values.put(KEY_LAT, lat);
values.put(KEY_LONG, longi);
values.put(KEY_DECOM, decom);

// execute the statement
db.insert(TABLE_NAME, null, values);

db.setTransactionSuccessful();
} finally {
db.endTransaction();
}

db.close();

}

public void add12Zipcode(String zip, String city, String state, String lat,
String longi, String decom, String tax, String pop, String wages) {

// get db and content values
SQLiteDatabase db = this.getWritableDatabase();
ContentValues values = new ContentValues();

db.beginTransaction();
try{
// add the values
values.put(KEY_ZIP, zip);
values.put(KEY_STATE, state);
values.put(KEY_CITY, city);
values.put(KEY_LAT, lat);
values.put(KEY_LONG, longi);
values.put(KEY_DECOM, decom);
values.put(KEY_TAX, tax);
values.put(KEY_POP, pop);
values.put(KEY_WAGES, wages);

// execute the statement
db.insert(TABLE_NAME, null, values);

db.setTransactionSuccessful();
} finally{
db.endTransaction();
}


db.close();
}

解析文件:

public void parse(ArrayList<String> theArray, DatabaseHandler db) {

String[] data = null;

// while loop to get split the data into new lines
// for loop to split each string in the array list of zipcodes
for (int x = 0; x < theArray.size(); x++) {

if(x == 10000 || x == 20000 || x == 30000 || x == 40000){
Log.d(TAG, "x is 10k, 20k, 30k, 40k");
}

// split string first into an array
data = theArray.get(x).split(",");

// separate based on the size of the array: 9 or 12
if (data.length == 9) {

db.add9Zipcode(data[0], data[2], data[3], data[5], data[6],
data[8]);

} else if (data.length == 12) {

db.add12Zipcode(data[0], data[2], data[3], data[5], data[6],
data[8], data[9], data[10], data[11]);

/*
* theZip.zip = data[0]; theZip.city = data[2]; theZip.state =
* data[3]; theZip.lat = data[5]; theZip.longi = data[6];
* theZip.decom = data[8]; theZip. = data[9]; theZip.population
* = data[10]; theZip.wages = data[11];
*/

}
}

最佳答案

引用我之前的回答:Inserting 1000000 rows in sqlite3 database

简而言之,使用 InsertHelper 并在每个事务中执行多次插入 - 除非您做了一些奇怪的事情,否则速度提升应该是显而易见的。

编辑:
简而言之:

  1. 您的 SQLiteOpenHelper 应该是在整个应用程序中使用的单例。
  2. 不要在你的 SQLiteDatabase 实例上四处调用 close() - 它缓存在 SQLiteOpenHelper 中,每次你关闭你强制重新打开它的助手。
  3. 批量插入,在调用 addZipCode 方法之外开始事务,并在完成所有插入后将其标记为成功 - 然后提交事务。
  4. 使用 InsertHelper - 它会将插入内容正确格式化为准备好的语句,并且非常好且可重用。
  5. 注意同步对数据库的访问 - 除非您打算在 UI 线程上完成所有数据库工作(不推荐) - 您需要启用锁定或保护对数据库的访问以避免并发访问。

关于Android - 加快向数据库中插入数据的速度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10772578/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com