使用 SQLiteStatement
的插入代码通常是这样的,
String sql = "INSERT INTO table_name (column_1, column_2, column_3) VALUES (?, ?, ?)";
SQLiteStatement statement = db.compileStatement(sql);
int intValue = 57;
String stringValue1 = "hello";
String stringValue2 = "world";
// corresponding to each question mark in the query
statement.bindLong(1, intValue);
statement.bindString(2, stringValue1);
statement.bindString(3, stringValue2);
long rowId = statement.executeInsert();
现在这工作得很好,但我在这里发现的问题是我必须非常小心地将正确的数据绑定(bind)到相应的索引。一个简单的索引交换会给我一个错误。
另外假设将来我的
column_2
从表中删除,然后我将不得不更改 column_2
索引之后的所有索引,否则该语句将不起作用。如果我只有 3 列,这似乎微不足道。想象一下,如果一个表有 10-12(甚至更多)列并且第 2 列被删除。我将不得不更新所有后续列的索引。这整个过程似乎效率低下且容易出错。有没有一种优雅的方法来处理所有这些 ?
编辑 :我为什么要使用 SQLiteStatement ?检查这个:Improve INSERT-per-second performance of SQLite?
最佳答案
插入可以用 ContentValues
完成:
ContentValues cv = new ContentValues();
cv.put("column_1", 57);
cv.put("column_2", "hello");
cv.put("column_3", "world");
long rowId = db.insertOrThrow("table_name", null, cv);
但在一般情况下,最正确的方法是使用 named parameters 。但是,Android 数据库 API 不支持这些。
如果您真的想使用
SQLiteStatement
,请编写您自己的辅助函数,从列列表构造它并负责将其与实际数据进行匹配。您还可以编写自己的 bindXxx()
包装器,将先前保存的列名称映射到参数索引。关于android - 如何将值绑定(bind)到 SQLiteStatement 以进行插入查询?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41921473/