我有下面描述的场景,我的问题是:
目前它每秒可以解析大约100个对象。
编辑:通过在“案例1:”上添加InsertHelper,现有值的速度上升,大多数情况都是如此。但是,当你需要“last_insert_rowid()”时,我找不到任何有关如何使用它的资源
数据库结构:
data {
id integer primary key autoincrement
name text not null
...
}
reference {
id integer (same id as in table1, not unique here tho)
source text not null
source_id text not null
}
表'reference'保持源的引用和源的id到我的DB中的id。 “数据”表中的每个条目在“参考”表中至少有一个条目。
我在流中有一个JSON,我一次解析并构建一个对象。流可以达到几MB,超过8000个对象。构建对象时,它将包含引用。
对于构建的每个对象,我想:
if(reference for this object does not exist){
if(we find the object name in data)
add to reference with the found id then break
else
add to data, get new id, add to reference then break
}
代码看起来像(一些伪代码,使其更容易阅读):
beginTransaction();
try {
while(parsing next object is successful){
if("SELECT 1 FROM reference WHERE source = ? and source_id = ?" == null){
Object[] objects = "SELECT * FROM data WHERE name = ?"
switch(objects.length){
case 0:
"INSERT INTO data (name) VALUES(?)"
"INSERT INTO reference (id, source, source_id) VALUES (last_insert_rowid(), ?, ?)"
break;
case 1:
"INSERT INTO reference (id, source, source_id) VALUES (?, ?, ?)"
break;
}
}
}
setTransactionSuccessful();
} finally {
endTransaction();
}
答案 0 :(得分:0)
如果您还没有查询字段,则可以通过在查找字段上创建索引来加快SELECT
查询。
包装SQL INSERT
命令(SQLiteDatabase.insert
和InsertHelper.execute
)的所有函数都返回插入记录的rowid
。
答案 1 :(得分:0)
您可以进入异步模式以加快操作速度。 打开sqlite后执行以下查询:
yourdb.execSQL("PRAGMA synchronous = OFF");
当您完成所需的所有内容后,请使用简单的关闭/重新打开来刷新数据库:
public synchronized SQLiteDatabase flush() {
if (database != null && database.isOpen()) {
database.close();
database = helper.getWritableDatabase();
return database;
}
return database;
}
希望这有帮助。