Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 优化SQLite插入_Android_Performance_Sqlite_Cursor_Content Values - Fatal编程技术网

Android 优化SQLite插入

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

我有一个如下功能,运行良好:

我之所以使用它,是因为在同步过程中,我必须在不同的表中插入许多行(在同一次同步中有时超过30000行),对于其中一些行,我从
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()