从CSV文件插入大量SQLite数据库

时间:2013-07-12 02:47:15

标签: android sqlite

当用户第一次下载我的应用时,该应用会下载一个包含大约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数据库?

3 个答案:

答案 0 :(得分:2)

您应该自己下载SQLite数据库文件。

如果您要保留数据库中的其他数据,则可以

  • 将其他数据复制到下载的数据库中(因为它没有那么多数据,这应该很快);或
  • 保持下载的数据库与另一个数据库分开(如果您需要在它们之间进行连接,则将ATTACH保持为另一个。)

答案 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,这可能与您的应用程序相关,也可能与您的应用程序无关。如果您还有其他问题,请发表评论。