我具有以下应更新的功能,然后检索表行:
MyEntity setRemoteMyEntityGUIGByMyEntityGUID(long myEntityGUID, long remoteMyEntityGUID) {
sqlite3 *db = myDb();
sqlite3_stmt *stmt;
char *sql = "UPDATE ENTITY_TABLE "
"SET REMOTE_ENTITY_GUID = ? " \
"WHERE ENTITY_GUID = ?; " \
"SELECT " \
"ENTITY_GUID, " \
"ENTITY_TYPE, " \
"COLUMN_NAME_UPDATED_DATE " \
"FROM ENTITY_TABLE WHERE " \
"ENTITY_GUID = ?";
int rc = sqlite3_prepare(db, sql, -1, &stmt, 0);
sqlite3_bind_int(stmt, 1, remoteMyEntityGUID);
sqlite3_bind_int(stmt, 2, myEntityGUID);
sqlite3_bind_int(stmt, 3, myEntityGUID);
if (rc != SQLITE_OK) {
fprintf(stderr, "SQL error: %s\n", sqlite3_errmsg(db));
__android_log_print(ANDROID_LOG_ERROR, "MyApp", "ERR : %s", sqlite3_errmsg(db));
}
rc = sqlite3_step(stmt);
MyEntity myEntity;
if (rc == SQLITE_ROW) {
myEntityGUID = sqlite3_column_int(stmt, 0);
char *myEntityType = strdup((const char *) sqlite3_column_text(stmt, 6));
char *timeUpdated = strdup((const char *) sqlite3_column_text(stmt, 9));
myEntity._myEntityGUID = myEntityGUID;
myEntity._myEntityType = myEntityType;
myEntity._timeUpdated = timeUpdated;
sqlite3_finalize(stmt);
sqlite3_close(db);
}
return myEntity;
}
但是,它仅执行以下两项之一:更新或检索表行:
char *sql = "UPDATE ENTITY_TABLE "
"SET REMOTE_ENTITY_GUID = ? " \
"WHERE ENTITY_GUID = ?" ;
OR
char *sql = "SELECT " \
"ENTITY_GUID, " \
"ENTITY_TYPE, " \
"COLUMN_NAME_UPDATED_DATE " \
"FROM ENTITY_TABLE WHERE " \
"ENTITY_GUID = ?";
这不会完全起作用,但是第一个(更新)部分将:
char *sql = "UPDATE ENTITY_TABLE "
"SET REMOTE_ENTITY_GUID = ? " \
"WHERE ENTITY_GUID = ?; " \
"SELECT " \
"ENTITY_GUID, " \
"ENTITY_TYPE, " \
"COLUMN_NAME_UPDATED_DATE " \
"FROM ENTITY_TABLE WHERE " \
"ENTITY_GUID = ?";
我在做什么错?我如何使它工作?
答案 0 :(得分:1)
因此,由于每个准备好的语句只能使用一个SQL语句,因此必须将其分为两部分:
sqlite3_step()
执行它(它返回SQLITE_DONE
表示成功或错误代码)。sqlite3_finalize()
释放准备好的语句。sqlite3_step()
执行它。sqlite3_step()
返回了SQLITE_ROW
,请对该行中的选定列进行任何操作。(您已经完成了大部分操作;只需要针对两个准备好的语句进行修改即可)
如果准备失败,您还想确保不使用这些语句-在当前代码中,您在甚至检查sqlite3_prepare()
的返回值之前都已绑定参数。我还建议改用sqlite3_prepare_v2()
-较旧的sqlite3_prepare()
引用the documentation,“这是遗留的,应该避免。”