【发布时间】:2014-06-17 21:49:20
【问题描述】:
我有一个与 SQL 数据库对话的应用程序,示例表由 OBSERVATIONSID(主键)、LEVEL0、LEVEL1、LEVEL2、LEVEL3、LEVEL4、EDITABLE 组成。
目前每次我想排,我 读取数据库以确保行不存在。 存储数据 再次读取数据库以获取刚刚添加的主键。
存储数据
+ (void) ObservationsEditSaveData : (NSString*) Level1 : (NSString*) Level2 : (NSString*)Level3 : (NSString*) Level4 : (NSString*) Level0{
sqlite3_stmt *updateStmt;
sqlite3_open([dbObservationPathString UTF8String], &ObservationDB);
NSString* updateSQL = [NSString stringWithFormat: @"INSERT INTO OBSERVATIONS(LEVEL0, LEVEL1, LEVEL2, LEVEL3, LEVEL4, EDITABLE) values (?,?,?,?,?,?)"];
sqlite3_prepare_v2(ObservationDB, [updateSQL UTF8String], -1, &updateStmt, NULL);
if(sqlite3_step(updateStmt)==SQLITE_DONE)
{
sqlite3_bind_text(updateStmt, 1, [Level0 UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(updateStmt, 2, [Level1 UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(updateStmt, 3, [Level2 UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(updateStmt, 4, [Level3 UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(updateStmt, 5, [Level4 UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_int(updateStmt, 6, 0);
sqlite3_step(updateStmt);
sqlite3_finalize(updateStmt);
}
sqlite3_close(ObservationDB);
}
读取 ID / 检查是否存在。 (在检查是否存在时,如果返回 ID,我假设它存在)
+ (int) ObservationGetID : (NSString*) Level1 : (NSString*) Level2 : (NSString*) Level3 : (NSString*) Level4 : (NSString*) Level0{
int ReturnValue = 0;
sqlite3_stmt *statement;
if (sqlite3_open([dbObservationPathString UTF8String], &ObservationDB)==SQLITE_OK)
{
NSString *querySql = [NSString stringWithFormat:@"SELECT OBSERVATIONSID FROM OBSERVATIONS WHERE LEVEL0 = '%@' AND LEVEL1 = '%@' AND LEVEL2 = '%@' AND LEVEL3 = '%@' AND LEVEL4 = '%@'", Level0 ,Level1, Level2, Level3, Level4];
const char* query_sql = [querySql UTF8String];
if (sqlite3_prepare(ObservationDB, query_sql, -1, &statement, NULL)==SQLITE_OK)
{
while (sqlite3_step(statement)==SQLITE_ROW)
{
ReturnValue = sqlite3_column_int(statement, 0);
}
}
}
sqlite3_close(ObservationDB);
return ReturnValue;
}
id喜欢做的是减少sql调用的次数,我可以把这些命令合二为一吗?
顺便说一句,如果我把代码弄乱了,请说,我不会被冒犯的。
谢谢
【问题讨论】:
-
顺便说一句,您的
observationGetID方法可能应该使用sqlite3_bind_xxx函数,就像您在observationsEditSaveData中所做的那样。您永远不想使用stringWithFormat构建 SQL。如果你觉得这样的绑定值太麻烦,可以考虑使用FMDB,这样可以更轻松地编写可靠的 SQLite 代码。此外,通常建议您只打开一次数据库,而不是在每次方法调用时打开和关闭它。 -
所以要做到这一点,我会 sqlite3_step 然后做所有的绑定吗?然后有 while (sqlite3_step(statement)==SQLITE_ROW) { ReturnValue = sqlite3_column_int(statement, 0);我很困惑 sqlite3_bind_text 和 sqlite3_column_int 是如何结合在一起的
-
参见下面的代码示例。最重要的是,step 函数将实际执行 SQL。但很明显,在绑定值之前,您不想执行 SQL。所以先绑定,再一步。
-
在
observationGetID中,您将sqlite3_prepare_v2、sqlite3_bind_xxx用于WHERE子句的所有列,然后让您的while (sqlite3_step(statement) == SQLITE_ROW)循环在其中检索带有@ 的列987654333@. -
是的,这很有道理,我对做了什么感到困惑。那里有很多不明确的建议
标签: objective-c sqlite ipad