SQLite 数据库更新需要申请重新打开才能实际显示新值
SQLite Database Update Needs Application to ReOpen to Actually Show New Values
public void updateRow(int form_no, String form_name, String question_name, String answer_1, String answer_2, String answer_3, int answer_1_count, int answer_2_count, int answer_3_count) {
String sql = "UPDATE " + DATABASE_TABLE + " SET " + KEY_ANSWER_1_COUNT + " = " + answer_1_count + ", " +KEY_ANSWER_2_COUNT + " = " + answer_2_count + ", " + KEY_ANSWER_3_COUNT + " = " + answer_3_count + " " +
"WHERE " + KEY_FORM_NO + "=" + form_no + " AND " + KEY_QUESTION_NAME + " = ?";
Cursor c = db.rawQuery(sql, new String[]{question_name});
c.close();
}
db是Sqlite的一个对象。
我也使用了 db.update() ,这也不起作用。我试图在使用此方法时将 key_answers 的计数器增加 1,但它不起作用。它只更新一次,我也无法显示它。我只有在重新打开应用程序时才能看到实际放置的更新,但它也不准确,因为它只更新一次,我又调用了 3-4 次更新。
这是什么问题,我该如何解决?谢谢。
编辑:
所以在我看到 "Der Golem" 的评论后,我认为使用 db.update() 方法更好,因为文档上说不要使用 db.execSql() 使用 db.insert() db.update() db.delete() 代替。对于每个为这个问题而苦苦挣扎的人,我发布了我的工作结果。
String where = KEY_FORM_NO + "=" + form_no + " AND " + KEY_QUESTION_NAME + " = ?";
ContentValues newValues = new ContentValues();
newValues.put(KEY_FORM_NO, form_no);
newValues.put(KEY_FORM_NAME, form_name);
newValues.put(KEY_QUESTION_NAME, question_name);
newValues.put(KEY_ANSWER_1, answer_1);
newValues.put(KEY_ANSWER_2, answer_2);
newValues.put(KEY_ANSWER_3, answer_3);
newValues.put(KEY_ANSWER_1_COUNT, answer_1_count);
newValues.put(KEY_ANSWER_2_COUNT, answer_2_count);
newValues.put(KEY_ANSWER_3_COUNT, answer_3_count);
db.update(DATABASE_TABLE,newValues,where,new String[]{question_name});
为什么whereArgs只用question_name是因为question_name是一个字符串,可以用在whereArgs需要字符串数组的地方,而form_no是一个整型值。如果有任何清理此代码的建议,我们将不胜感激。
执行命令 (INSERT
, UPDATE
, REPLACE
, DELETE
, CREATE TABLE
, ...),你必须使用 execSQL()
.
rawQuery()
仅适用于 查询 (SELECT
).
此外,您的命令是绑定参数(?)和未绑定参数的怪异混合物...
我的建议是使用清洁剂,比如
String sql = "UPDATE " + DATABASE_TABLE + " SET " + KEY_ANSWER_1_COUNT + " = ?, " +KEY_ANSWER_2_COUNT + " = ?, " + KEY_ANSWER_3_COUNT + " = ? WHERE " + KEY_FORM_NO + " = ? AND " + KEY_QUESTION_NAME + " = ?";
Cursor c = db.execSQL(sql, new String[]{answer_1_count, answer_2_count, answer_3_count, form_no, question_name});
public void updateRow(int form_no, String form_name, String question_name, String answer_1, String answer_2, String answer_3, int answer_1_count, int answer_2_count, int answer_3_count) {
String sql = "UPDATE " + DATABASE_TABLE + " SET " + KEY_ANSWER_1_COUNT + " = " + answer_1_count + ", " +KEY_ANSWER_2_COUNT + " = " + answer_2_count + ", " + KEY_ANSWER_3_COUNT + " = " + answer_3_count + " " +
"WHERE " + KEY_FORM_NO + "=" + form_no + " AND " + KEY_QUESTION_NAME + " = ?";
Cursor c = db.rawQuery(sql, new String[]{question_name});
c.close();
}
db是Sqlite的一个对象。 我也使用了 db.update() ,这也不起作用。我试图在使用此方法时将 key_answers 的计数器增加 1,但它不起作用。它只更新一次,我也无法显示它。我只有在重新打开应用程序时才能看到实际放置的更新,但它也不准确,因为它只更新一次,我又调用了 3-4 次更新。
这是什么问题,我该如何解决?谢谢。
编辑:
所以在我看到 "Der Golem" 的评论后,我认为使用 db.update() 方法更好,因为文档上说不要使用 db.execSql() 使用 db.insert() db.update() db.delete() 代替。对于每个为这个问题而苦苦挣扎的人,我发布了我的工作结果。
String where = KEY_FORM_NO + "=" + form_no + " AND " + KEY_QUESTION_NAME + " = ?";
ContentValues newValues = new ContentValues();
newValues.put(KEY_FORM_NO, form_no);
newValues.put(KEY_FORM_NAME, form_name);
newValues.put(KEY_QUESTION_NAME, question_name);
newValues.put(KEY_ANSWER_1, answer_1);
newValues.put(KEY_ANSWER_2, answer_2);
newValues.put(KEY_ANSWER_3, answer_3);
newValues.put(KEY_ANSWER_1_COUNT, answer_1_count);
newValues.put(KEY_ANSWER_2_COUNT, answer_2_count);
newValues.put(KEY_ANSWER_3_COUNT, answer_3_count);
db.update(DATABASE_TABLE,newValues,where,new String[]{question_name});
为什么whereArgs只用question_name是因为question_name是一个字符串,可以用在whereArgs需要字符串数组的地方,而form_no是一个整型值。如果有任何清理此代码的建议,我们将不胜感激。
执行命令 (INSERT
, UPDATE
, REPLACE
, DELETE
, CREATE TABLE
, ...),你必须使用 execSQL()
.
rawQuery()
仅适用于 查询 (SELECT
).
此外,您的命令是绑定参数(?)和未绑定参数的怪异混合物...
我的建议是使用清洁剂,比如
String sql = "UPDATE " + DATABASE_TABLE + " SET " + KEY_ANSWER_1_COUNT + " = ?, " +KEY_ANSWER_2_COUNT + " = ?, " + KEY_ANSWER_3_COUNT + " = ? WHERE " + KEY_FORM_NO + " = ? AND " + KEY_QUESTION_NAME + " = ?";
Cursor c = db.execSQL(sql, new String[]{answer_1_count, answer_2_count, answer_3_count, form_no, question_name});