Android 优化SQLite插入
我有一个如下功能,运行良好: 我之所以使用它,是因为在同步过程中,我必须在不同的表中插入许多行(在同一次同步中有时超过30000行),对于其中一些行,我从Android 优化SQLite插入,android,performance,sqlite,cursor,content-values,Android,Performance,Sqlite,Cursor,Content Values,我有一个如下功能,运行良好: 我之所以使用它,是因为在同步过程中,我必须在不同的表中插入许多行(在同一次同步中有时超过30000行),对于其中一些行,我从Json对象接收到的值不是真实的值。因此,在插入行之前,我必须用另一个值替换该值。这就是我使用此功能的原因: public void myFunction( String tableName, String attrName, ContentValues currentVal ) { SQLiteDatabase database
Json
对象接收到的值不是真实的值。因此,在插入行之前,我必须用另一个值替换该值。这就是我使用此功能的原因:
public void myFunction( String tableName, String attrName, ContentValues currentVal ) {
SQLiteDatabase database = this.getReadableDatabase();
long realValue = -1;
Cursor c = database.rawQuery("SELECT value FROM "+tableName+" WHERE "+tableName+".other_value = " + currentVal.getAsString(attrName), null);
if( c.moveToFirst() ) {
realValue = c.getLong(0);
}
if( c != null ) c.close();
currentVal.put( attrName, realValue );
}
我的问题是光标
。。。c.moveToFirst()
函数
影响进程的速度
我做了研究,发现了很多解释,比如:
我指定使用索引,并且已经尝试了事务。
因此,我现在想做(或想知道)的是:
有没有一种方法可以执行以下操作:
currentVal.put( attrName, SELECT value FROM "+tableName+" WHERE "+tableName+".other_value = " + currentVal.getAsString(attrName) );
因为有了这个技巧,我就不必迭代到我的光标
(这实际上是我的问题),当我插入ContentValues
的内容时,它将自动处理子查询以检索要插入的实际值
我还考虑过创建一个临时表。我插入在我的Json
对象中建立的值,而不更改它们,并且当我插入当前表的所有值时,我将它们复制到实际表中,同时取消一个子查询,以按正确值重新调整不正确值的速度
任何想法、建议、片段。。。非常感谢我尝试过的将100000多个元素插入SQLite的最佳方法是通过NDK层使用它,并使用一些简单的本机代码访问和写入DB,这与应用层写入相比速度非常快。插入不需要太多时间,问题出在更换零件上,因为直到现在,我还没有发现如何在不使用
游标的情况下完成此操作。moveToFirst()
函数每次操作后,您都必须最终游标。close()
。然后重新打开光标
对象。你这样做了吗?你使用了正确的索引吗?显示SELECT查询的输出。是的,我使用了正确的索引。在我的问题中,我说是30000行,但每个表的行数几乎相同(大约15行)。所以同步操作需要40分钟到2小时。。。很抱歉,我无法显示EXPLAIN QUARY计划的输出,但瓶颈是游标。moveToFirst()