sqlite3 IOS查询错误表

sqlite3 IOS查询错误表,ios,sql,xcode,sqlite,Ios,Sql,Xcode,Sqlite,我有一个奇怪的错误,我用一个相当复杂的查询来查询我的表'Children'。它工作得很好,但由于某些原因,它会使另一个视图无法更新数据库。你可以看到这个数据库保存着标签,一个简单的方法就是访问这个管理页面,这就是它的bug所在。我可以很好地查询信息,但是!当我更新表时,它讨厌并且不工作。但是在核心视图控制器内部很奇怪,当我更新那里的表时,它没有bug。我将代码的范围缩小到问题的原因: -(void)leaderboardsystem { NSString *nexttargetsql

我有一个奇怪的错误,我用一个相当复杂的查询来查询我的表'Children'。它工作得很好,但由于某些原因,它会使另一个视图无法更新数据库。你可以看到这个数据库保存着标签,一个简单的方法就是访问这个管理页面,这就是它的bug所在。我可以很好地查询信息,但是!当我更新表时,它讨厌并且不工作。但是在核心视图控制器内部很奇怪,当我更新那里的表时,它没有bug。我将代码的范围缩小到问题的原因:

-(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;
}
这是当我在主视图中包括排行榜系统时,似乎失败的更新代码(这是在一个完全不同的视图控制器上)

我尽量不让这里的描述过多,保持简短。我的程序相当大,如果你需要更多信息,请告诉我。但我保证排行榜系统是问题的根源。如果你能解决这个问题,那就万分感谢你,你已经为此工作了一整天了!:(


此外,它还干扰了我将记录添加到表中的位置,因此更新代码不会导致此问题。这是排行榜查询,不知道为什么:(

好的,我本来不想这样做。但是我没有使用方法来管理查询,而是在方法内部重复了两次,但它成功了!不确定它出了什么问题。似乎没有其他人可以帮助我,所以我就让它去做。

你需要调用
sqlite3\u 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;
}
这是一个非常简单的示例,因为没有错误处理。描述这一点的文档如下(位于):

*ppStmt左指编译后的准备语句,该语句可以使用sqlite3_step()执行。如果出现错误,*ppStmt设置为 NULL。如果输入文本不包含SQL(如果输入为空 字符串或注释),则*ppStmt设置为NULL 过程负责使用删除已编译的SQL语句 sqlite3_finalize()在完成后。ppStmt可能不可用 空

此示例代码可能会帮助您:

-(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");
    }
}
-(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;
}