【发布时间】:2013-03-03 19:35:49
【问题描述】:
我在使用 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 秒。
相关代码sn-p:
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);
关于如何改进这一点的任何想法?尤其是插入时间太长了。
【问题讨论】:
-
我不太确定您是如何实现“批量插入”的。您是否在单个事务中执行此操作,是否尝试过来自 outofwhatbox.com/blog/2010/12/… 的指针?
-
批量插入是通过调用 context.getContentResolver().bulkInsert(API_URI, values);使用 values 一个 ContentValues 列表,每个 ContentValues 都包含单行的数据。编辑问题以反映这一点。
标签: java android performance sqlite