当用户第一次下载我的应用时,该应用会下载一个包含大约100,000行数据的CSV文件。
然后,我想用它填充我的SQLite数据库。
这是我的代码:
InputStream inputStream = activity.openFileInput(file);
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String line = null;
dbHelper.beginTransaction();
while((line = bufferedReader.readLine()) != null) {
String[] values = line.replaceAll("'", "''").split(",");
dbHelper.insert(values);
}
dbHelper.setTransactionSuccessful();
dbHelper.endTransaction();
dbHelper.close();
在我的DBHelper类中,这是方法insert:
public void insert(String[] data) {
ContentValues values = new ContentValues();
values.put(DBHelper.SHAPE_ID, data[0]);
values.put(DBHelper.SHAPE_PT_LAT, data[1]);
values.put(DBHelper.SHAPE_PT_LON, data[2]);
values.put(DBHelper.SHAPE_PT_SEQUENCE, data[3]);
myDB.insert(DBHelper.TABLE_SHAPES, null, values);
}
我尝试了这个代码,但它工作了但是用了7分钟就完成了... 难道我做错了什么 ?是否有更好的方法(更快地阅读)来填充SQLite数据库?
答案 0 :(得分:2)
您应该自己下载SQLite数据库文件。
如果您要保留数据库中的其他数据,则可以
答案 1 :(得分:0)
使用prepared statement,可以提升性能。 类似的东西:
SQLiteStatement statement = db.compileStatement("INSERT INTO " + TABLE_SHAPES + " VALUES(?, ?));
并将insert()
方法更改为:
statement.bindString(1, data[0]);
statement.bindString(2, data[1]);
statement.executeInsert();
答案 2 :(得分:0)
根据this,SQLite3具有导入内置CSV文件的功能:
.separator ','
.import '/path/to/csv/data' [table]
我想这可以在Android上使用DatabaseUtils.InsertHelper:
完成DatabaseUtils.InsertHelper helper = new DatabaseUtils.InsertHelper(dbFilePath,dbTablename); helper.prepareForInsert(); //使用bind *方法将循环中的CSV数据列绑定到帮助程序 helper.execute();
我还看到该类现已标记为已弃用(API级别17),而不是SQLiteStatement,这可能与您的应用程序相关,也可能与您的应用程序无关。如果您还有其他问题,请发表评论。