1

我有一个奇怪的错误,我用相当复杂的查询查询我的表“儿童”。它工作正常,但由于某种原因,它会在更新数据库时破坏另一个视图。您会看到此数据库包含贴纸,并且提供它们的一种简单方法是访问此管理页面,这是它的错误所在。我可以很好地查询信息,但是!当我更新它讨厌并且不起作用的表时。但是它在核心视图控制器内部很奇怪,当我在那里更新表格时它不会出错。我将代码缩小到导致此问题的原因:

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

每当我调用方法 leaderboardsystem 时,它都会导致此错误,但如果我不这样做,它就可以正常工作!够有趣的,说实话,我有点惊讶。这让我感到惊讶,因为它影响了一个与主视图没有连接的完全不同的视图控制器。表格布局如下:

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

我尽量不在这里过度描述并保持简短我的程序非常大,如果您需要更多信息,请告诉我。但我保证是排行榜系统导致了问题。感谢一百万,如果你能解决这个问题,整天都在努力!:(

它还扰乱了我向表中添加记录的地方,因此更新代码不会导致它。它的排行榜查询,不知道为什么:(

4

2 回答 2

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;
}

这是一个非常简单的示例,因为没有错误处理。描述这一点的文档如下(位于此处):

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

此示例代码可能对您有所帮助:https ://github.com/ccgus/fmdb/blob/master/src/FMDatabase.m#L519

于 2013-02-27T23:25:08.723 回答
0

好吧,我不想这样做。但是,我没有管理查询的方法,而是在方法内部重复了两次,但它起作用了!不知道有什么问题。似乎没有其他人可以帮助我,所以我就这样吧。

于 2013-02-27T21:13:21.063 回答