sqlite3 IOS查询窃听表

时间:2013-02-27 18:16:12

标签: ios sql xcode sqlite

我有这个奇怪的错误,我正在查询我的表'儿童',查询相当复杂。它工作正常,但由于某种原因,它会更新数据库中的另一个视图。你看到这个数据库有贴纸,一个简单的方法是给他们访问这个管理页面,这是它的窃听。我可以查询信息,但是!当我更新表时,它讨厌并且不起作用。但它在核心视图控制器内部奇怪,当我在那里更新表时它没有错误。我将代码缩小到导致此问题的原因:

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

我正试着不要在这里重复描述并保持简洁我的程序非常大,如果您需要更多信息让我知道。但我保证排行榜系统导致问题。万分感谢你能解决这个问题,一整天都在努力! :(

此外,它还会扰乱我向表中添加记录的位置,因此更新代码不会导致它。它的排行榜查询,不明白为什么:(

2 个答案:

答案 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