如何用android sqlite和contentvalue进行批量替换

时间:2013-10-12 17:30:18

标签: android mysql sql sqlite android-sqlite

我有一个Android sqlite数据库,目前执行速度很慢。

根据Improve INSERT-per-second performance of SQLite?的建议,如果失败的插入例程只使用replace(与REPLACE INTO相同,也称为INSERT OR REPLACE),我已从更新更改

我现在想要从一次更换换成一次做几百次

static ArrayList<ContentValues> cvs= new ArrayList<ContentSystem>();



_dh.BeginTransaction(Table);
for(int i = 0; i < cvs.size(); ++i)
{
replace(ma, cvs.get(i), dh, Table, Key);
}
_dh.EndTransaction(Table);

使用批量系统

SQLiteStatement stmt = _dh.db.compileStatement("Replace into tablename(..) value (?,?)");
    _dh.BeginTransaction(Table);
    for(int i = 0; i < cvs.size(); ++i)
    {
    stmt.bindString(cvs.get(i));
    }
    stmt.execute();
    _dh.EndTransaction(Table);

但我不明白编译语句的外观 我也不理解我将在绑定字符串函数中放入什么 - 我将数据存储在contentvalue

同样来自http://developer.android.com/reference/android/database/sqlite/SQLiteStatement.html#execute()

  

执行此SQL语句,如果它不是SELECT / INSERT / DELETE /   UPDATE,例如CREATE / DROP表,视图,触发器,索引等。

看来执行调用不适用于replace ??因为它正在进行插入/更新 这是对的吗?

以下是我的数据库设置方式,以及我如何使用replace调用 http://sqlfiddle.com/#!7/b8af8/1

1 个答案:

答案 0 :(得分:0)

使用预准备语句对性能没有太大影响(使用事务正确更重要),但是如果要使用它,则必须手动处理每个参数,并且您必须为每条记录拨打execute一次:

db.beginTransaction();
try {
    SQLiteStatement stmt = db.compileStatement(
        "REPLACE INTO MyTable(x,y,z) VALUES(?,?,?)");
    for (int i = 0; i < cvs.size(); ++i) {
        ContentValues cv = cvs.get(i);
        stmt.bindString (1, cv.getAsString ("x"));
        stmt.bindString (2, cv.getAsString ("y"));
        stmt.bindInteger(3, cv.getAsInteger("z"));
        stmt.execute();
    }
    db.setTransactionSuccessful();
} finally {
    db.endTransaction();
}

executeexecuteInsertexecuteUpdateDelete之间的区别仅在于返回值;如果您不需要,可以使用execute 任何语句。