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

标签 android mysql sql sqlite android-sqlite

我有一个 android sqlite 数据库,目前执行速度非常慢。

根据Improve INSERT-per-second performance of 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);

但我不明白编译语句是什么样的 我也不明白我会在绑定(bind)字符串函数中放入什么 - 我将数据存储在 contentvalue 中

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

Execute this SQL statement, if it is not a SELECT / INSERT / DELETE / UPDATE, for example CREATE / DROP table, view, trigger, index etc.

执行调用似乎无法与替换一起使用?因为它正在执行插入/更新 这是正确的吗?

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

最佳答案

使用准备好的语句不会对性能产生太大影响(正确使用事务更重要),但是如果你想使用它,你必须手动处理每个参数,并且您必须为每条记录调用一次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

关于android - 如何使用 android sqlite 和 contentvalue 进行批量替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19337134/

相关文章:

asp.net - SQL:自动插入日期

android - react 原生 : A problem occurred evaluating project ':app' when trying to run on Android

php - 将“全部搜索”选项添加到下拉菜单?

java - SQL Server 2012 上的 "New request is not allowed to start because it should come with valid transaction descriptor"

mysql - 按年、月分组时对值进行计数

mysql - 用于查找多次出现的值的 SQL 查询

sql - 如何在 PostgreSQL 中获取分区(窗口)的大小?

java - 使用glide加载位图到ImageView

android - 在 sdcard 准备好之前,如何在将数据写入 sdcard 完成启动时停止 android 服务?

android - Realm 与 Android 数据绑定(bind)混淆