2

我在使用 sqlite 和 Android 2.3.7 时遇到了严重的性能问题。

我要存储少量数据:14 行,每行 8 列。从网页读取数据;解析数据时,我将删除数据库的全部内容,然后一次性批量插入新数据。

一些(已编辑)LogCat 输出:

03-15 14:39:51.909: Got content downloaded.
03-15 14:39:52.299: Deleting existing info from db.
03-15 14:39:52.719: Bulk inserting new data into db.
03-15 14:40:00.709: Stored data in the database.

我正在使用 ContentProvider 来访问数据库。

解析页面需要 0.4 秒。

删除需要 0.4 秒。

bulkInsert 需要 8 秒。

对所有数据的后续查询和读取再次需要大约 0.4 秒。

相关代码片段:

    Log.v(TAG, "Deleting existing info from db.");
    delete(API_TABLE, null, null);
    Log.v(TAG, "Bulk inserting new data into db.");
    bulkinsert(API_TABLE, allValues);
    Log.v(TAG, "Stored data in the database.");

字段和类型数据:

public final static String[] API_KEYS = {KEY_STATION, KEY_API, 
    KEY_POLLUTANT, KEY_SO2, KEY_NOX, KEY_CO, KEY_PHOTO, KEY_TSPRSP, 
    KEY_RSP};
public final static String[] API_TYPES = {"TEXT PRIMARY KEY", "TEXT", 
    "TEXT", "TEXT", "TEXT", "TEXT", "TEXT", "TEXT", "TEXT"};

数据库构建是这样完成的:

        StringBuilder dbCommand = new StringBuilder();
        dbCommand.append("CREATE TABLE " + API_TABLE + " (");
        dbCommand.append("'" + API_KEYS[0] + "' " + API_TYPES[0]);
        for (Integer i = 1; i < API_KEYS.length; i++)
            dbCommand.append(", '" + API_KEYS[i] + "' " + API_TYPES[i]);
        dbCommand.append(");");
        Log.v(TAG, "Creating API database now.");
        db.execSQL(dbCommand.toString());

要插入的值存储在 ContentValues[] 对象中,然后使用

context.getContentResolver().bulkInsert(API_URI, values);

关于如何改进这一点的任何想法?特别是插入时间太长了。

4

2 回答 2

2

根据 StinePike 的回复,我将提供程序类更改为包括:

@Override
public int bulkInsert(Uri uri, ContentValues[] values) {

    String table = getTable(uri);
    int count = 0;
    for (ContentValues value : values) 
        count += db.insert(table, "", value);

    return count;

}

这稍微提高了插入时间,但对于 14 个值来说,4-5 秒仍然有点长。

然后在这个方向上进行更多搜索,我在这里找到了一个不同的解决方案,它确实加快了速度,现在我的时间不到 1 秒。这是可以接受的,我认为不能再改进了。此代码是我的 ContentProvider 扩展类的一部分。

    @Override
public int bulkInsert(Uri uri, ContentValues[] values) {
    try {
        db.beginTransaction();
        String table = getTable(uri);
        for (ContentValues value : values)
            db.insert(table, null, value);
        db.setTransactionSuccessful();
    } catch (SQLException e) {
    } finally {
        db.endTransaction();
    }
    return values.length;   
}
于 2013-03-15T09:23:29.743 回答
0

使用SQLiteDatabase类进行此操作。

我使用以下方法插入,它相对更快

public void createContatctDirectory(ArrayList<String> data) {
    SQLiteDatabase db = context.openOrCreateDatabase(DATABASE_NAME,
            Context.MODE_PRIVATE, null);

    InsertHelper ih = new InsertHelper(db, TABLE_NAME);
    Iterator<String> it = data.iterator();
    final int numberColumn = ih.getColumnIndex(KEY_NUMBER);

    db.beginTransaction();
    int count = 0;
    try {
        while (it.hasNext()) {
            ++count;
            String ph;
            ph = it.next();
            ih.prepareForInsert();
            ih.bind(numberColumn, ph);

            ih.execute();
        }
    } finally {
        ih.close();
        db.setTransactionSuccessful();
        db.endTransaction();
        db.close();
    }
}
于 2013-03-15T07:46:04.543 回答