0

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

根据提高 SQLite 的每秒插入性能的建议?如果插入例程失败,我已从执行更新更改为仅使用替换(与 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);

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

也来自这个http://developer.android.com/reference/android/database/sqlite/SQLiteStatement.html#execute()

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

看来执行调用不适用于替换??因为它正在执行插入/更新,这是正确的吗?

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

4

1 回答 1

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();
}

executeexecuteInsert和之间的区别executeUpdateDelete仅在于返回值;如果你不需要一个,你可以使用execute任何语句

于 2013-10-14T06:53:44.123 回答