我有这个奇怪的错误,我正在查询我的表'儿童',查询相当复杂。它工作正常,但由于某种原因,它会更新数据库中的另一个视图。你看到这个数据库有贴纸,一个简单的方法是给他们访问这个管理页面,这是它的窃听。我可以查询信息,但是!当我更新表时,它讨厌并且不起作用。但它在核心视图控制器内部奇怪,当我在那里更新表时它没有错误。我将代码缩小到导致此问题的原因:
-(void)leaderboardsystem
{
NSString *nexttargetsql = [NSString stringWithFormat:@"SELECT * FROM Children WHERE Completed > %d OR (Completed = %d AND Current_Stickers > %d) ORDER BY Completed ASC, Current_Stickers ASC LIMIT 1",completecount,completecount,stickercount]; //Queries table for the childs name and returns more data.
NSString *behindyousql = [NSString stringWithFormat:@"SELECT * FROM Children WHERE Completed < %d OR (Completed = %d AND Current_Stickers < %d) ORDER BY Completed DESC, Current_Stickers DESC LIMIT 1",completecount,completecount,stickercount];
nexttarget.text = [self leaderboardQuery:nexttargetsql];
behindyou.text = [self leaderboardQuery:behindyousql];
}
-(NSString*)leaderboardQuery:(NSString*)sql//does the querying
{
sqlite3_stmt *statement;
if (sqlite3_prepare_v2(Childdb, [sql UTF8String], -1, &statement, nil)==SQLITE_OK) {
while (sqlite3_step(statement)==SQLITE_ROW) {
char *ffield1 = (char *) sqlite3_column_text(statement, 0);
NSString *ffield1Str = [[NSString alloc]initWithUTF8String:ffield1];
char *ffield2 = (char *) sqlite3_column_text(statement, 8);
NSString *ffield2Str = [[NSString alloc]initWithUTF8String:ffield2];
char *ffield3 = (char *) sqlite3_column_text(statement, 10);
NSString *ffield3Str = [[NSString alloc]initWithUTF8String:ffield3];
NSLog(@"Name:%@",ffield1Str);
NSLog(@"this is completecount: %@", ffield2Str);
NSLog(@"this is stickcount: %@",ffield3Str);
return ffield1Str;
}
}
return NULL;
}
每当我调用方法排行榜系统时,它都会导致此错误,但如果我不这样做则会正常工作!说得好笑,说实话我有点惊讶。令我感到惊讶的是,它影响了一个完全不同的视图控制器,它与主视图没有任何关系。表格布局为:
[self createTable:@"Children" withField1:@"Name" withField2:@"Password" withField3:@"House" withField4:@"Sticker Collection" withField5:@"Tickets Gathered" withField6:@"Tickets Removed" withField7:@"Last Ticket Scanned" withField8:@"Current Tickets" withField9:@"Completed" withField10:@"Complete" withField11:@"Current_Stickers"];
当我在主视图中包含排行榜系统时,这是更新代码似乎失败(这是在一个完全不同的视图控制器上)
-(void)UpdateDatabase//update table, if value has been incremented
{
NSString *sql = [NSString stringWithFormat:@"UPDATE Children SET 'Current Tickets' = %d, 'Tickets Removed' = %d, 'Tickets Gathered' = %d WHERE Name = '%@'",[self.currenttickets.text integerValue], [self.removedtickets.text integerValue], [self.totaltickets.text integerValue], name];
[self updatetable:sql];
}
-(void)updatetable:(NSString*)sql
{
char *err;
if (sqlite3_exec(Childdb, [sql UTF8String], NULL, NULL, &err)!=SQLITE_OK) {
sqlite3_close(Childdb);
NSAssert(0, @"Could not update Table");
} else {
NSLog(@"Table updated");
}
}
我正试着不要在这里重复描述并保持简洁我的程序非常大,如果您需要更多信息让我知道。但我保证排行榜系统导致问题。万分感谢你能解决这个问题,一整天都在努力! :(
此外,它还会扰乱我向表中添加记录的位置,因此更新代码不会导致它。它的排行榜查询,不明白为什么:(
答案 0 :(得分:0)
好吧,我不想这样做。但是没有一个方法来管理查询,我只是在方法内重复了两次,但它有效!不确定它有什么问题。似乎没有其他人可以帮助我,所以我会留下它。
答案 1 :(得分:0)
您需要致电sqlite3_finalize(Childdb)
。它看起来像下面这样:
-(NSString*)leaderboardQuery:(NSString*)sql//does the querying
{
sqlite3_stmt *statement;
if (sqlite3_prepare_v2(Childdb, [sql UTF8String], -1, &statement, nil)==SQLITE_OK) {
while (sqlite3_step(statement)==SQLITE_ROW) {
...
}
}
sqlite3_finalize(Childdb);
return NULL;
}
这是一个非常简单的例子,因为没有错误处理。描述此内容的文档如下(位于here):
* ppStmt指向可以使用sqlite3_step()执行的已编译预准备语句。如果有错误,* ppStmt设置为 空值。如果输入文本不包含SQL(如果输入为空 字符串或注释)然后* ppStmt设置为NULL。呼唤 procedure负责使用删除已编译的SQL语句 sqlite3_finalize()完成后再使用它。 ppStmt可能不是 NULL。
此示例代码可以帮助您:https://github.com/ccgus/fmdb/blob/master/src/FMDatabase.m#L519