我在下面有一个运行良好的函数:
我使用它是因为在同步过程中,我必须在不同的表中插入很多行(有时在同一个同步中超过 30 000 行),并且对于其中一些,我从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 );
}
我的问题是Cursor
......该c.moveToFirst()
功能会影响过程的速度。
我做了研究,发现了很多解释,例如:
我指定我使用索引并且我已经尝试过事务。
所以,我现在想做(或知道)的是:有没有办法执行类似的事情:
currentVal.put( attrName, SELECT value FROM "+tableName+" WHERE "+tableName+".other_value = " + currentVal.getAsString(attrName) );
因为有了这个技巧,我就不必迭代我的Cursor
(这实际上是我的问题),当我插入内容时,ContentValues
它会自动处理子查询以检索要插入的实际值。
我还考虑过创建一个临时表。我插入在我的Json
对象中建立的值而不更改它们,当我插入当前表的所有值时,我将它们复制到真实表中,同时取消子查询以将不正确的值替换为正确的值.
任何想法,建议,片段,......将不胜感激