1

当用户第一次下载我的应用程序时,该应用程序会下载一个包含大约 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 类中,插入方法如下:

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 数据库?

4

3 回答 3

2

您应该下载 SQLite 数据库文件本身。

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

  • 将其他数据复制到下载的数据库中(因为它没有那么多数据,这应该很快);或者
  • 将下载的数据库和另一个数据库分开(如果需要在它们之间进行连接,则将一个连接到另一个)
于 2013-07-12T12:51:06.543 回答
0

使用准备好的语句,这应该会提高性能。就像是:

SQLiteStatement statement = db.compileStatement("INSERT INTO " + TABLE_SHAPES + " VALUES(?, ?));

并更改您的insert()方法以执行以下操作:

statement.bindString(1, data[0]);
statement.bindString(2, data[1]);
statement.executeInsert();
于 2013-07-12T03:18:35.637 回答
0

据此 SQLite3 具有导入内置 CSV 文件的功能:

.separator ','
.import '/path/to/csv/data' [table]

我想这可以使用DatabaseUtils.InsertHelper在 Android 上完成:

DatabaseUtils.InsertHelper helper = new DatabaseUtils.InsertHelper(dbFilePath, dbTablename); helper.prepareForInsert(); // 使用 bind* 方法将 CSV 数据列绑定到循环中的帮助器 helper.execute();

我还看到该类现在被标记为已弃用(API 级别 17)代替SQLiteStatement,这可能与您的应用程序相关,也可能不相关。如果您还有其他问题,请发表评论。

于 2013-07-12T03:45:29.873 回答