gpt4 book ai didi

java - android 和 sqlite 性能

转载 作者:行者123 更新时间:2023-11-30 09:25:09 33 4
gpt4 key购买 nike

我在使用 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 秒。

相关代码 fragment :

    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);

关于如何改进这个的任何想法?尤其是插入时间太长了。

最佳答案

根据 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;

}

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

然后在这个方向上多搜索一点,我找到了一个不同的解决方案 here这真的加快了速度,我现在减少到不到 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;
}

关于java - android 和 sqlite 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15426459/

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