Database Xcode:SQLite在嵌入式方法中的应用

Database Xcode:SQLite在嵌入式方法中的应用,database,xcode,sqlite,Database,Xcode,Sqlite,我在处理一个新问题。 我从以下代码开始: -(IBAction) Login:(id) sender{ const char *dbpath = [databasePath UTF8String]; sqlite3_stmt *statement; if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK) { NSString *querySQL = [NSString stringWithF

我在处理一个新问题。 我从以下代码开始:

-(IBAction) Login:(id) sender{

    const char *dbpath = [databasePath UTF8String];
    sqlite3_stmt *statement;

    if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK)
    {
        NSString *querySQL = [NSString stringWithFormat: @"SELECT * FROM Contacts WHERE Login= (\"%@\") AND Password = (\"%@\")", Login.text, Password.text];

        const char *query_stmt = [querySQL UTF8String];

        if (sqlite3_prepare_v2(contactDB, query_stmt, -1, &statement, NULL) == SQLITE_OK)
        {
            if (sqlite3_step(statement) == SQLITE_ROW)
            {
                //Store '1' when a user wants to stay logged 
                **if(logSwitch.on){
                    [self aStayLogged];
                }else{
                    [self aReleaseLogged];
                }**
                Model *model = [Model sharedModel];
                model.paramLogged = Login.text;
                //[self openSecondView:nil];

            } else {
                Status.text = @"Login failed: Please check your ID and Password";
            }

            sqlite3_finalize(statement);
        }
        sqlite3_close(contactDB);
    }
}

-(void) aStayLogged {

    sqlite3_stmt *statement;

    const char *dbpath = [databasePath UTF8String];

    if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK)
    {
            NSString *updateSQL = [NSString stringWithFormat: @"UPDATE CONTACTS SET LOGGED = '1' WHERE LOGIN = (\"%@\")", Login.text];     
            const char *update_stmt = [updateSQL UTF8String];      
            sqlite3_prepare_v2(contactDB, update_stmt, -1, &statement, NULL);

        int success = sqlite3_step(statement);
            if (success == SQLITE_ERROR) {
                //NSAssert1(0, @"Error: failed to insert into the database with message '%s'.", sqlite3_errmsg(contactDB));
                Status.text = @"Update failed";
            }else{
                **Status.text = @"Stay OK";**
            }
        //sqlite3_bind_text(statement, 1, [coffeeName UTF8String], -1, SQLITE_TRANSIENT);
        //sqlite3_bind_int(statement, 2, coffeeID);

        sqlite3_finalize(statement);
    }
    sqlite3_close(contactDB);
}
交易如下:如果我将方法“aStayLogged”链接为iAction和按钮,那么更新就正确完成了。但是,当我将此方法嵌入“Login”方法时,什么也没有发生

我用以下方法对此进行检查:

-(IBAction) Check{

    sqlite3_stmt *statement;

    const char *dbpath = [databasePath UTF8String];

    if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK)
    {
        NSString *querySQL = [NSString stringWithFormat: @"SELECT LOGIN FROM CONTACTS WHERE LOGGED = '1'"]; 
        const char *query_stmt = [querySQL UTF8String];

        sqlite3_prepare_v2(contactDB, query_stmt, -1, &statement, NULL);

        if (sqlite3_step(statement) == SQLITE_ROW) {

            NSString *loggedField = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)];

            Status.text = loggedField;

            [loggedField release];

        }else{

            Status.text = @"Update failed";

        }

        sqlite3_finalize(statement);
    }
    sqlite3_close(contactDB);    

}
有趣的是,状态变为“保持正常”,这是对它应该工作的确认!有人知道这是什么原因吗?很抱歉,我发了这么长的帖子——我也碰巧问了一些愚蠢的问题,但这次我真的看不出来

我怀疑你的问题在这里:

    int success = sqlite3_step(statement);
    if (success == SQLITE_ERROR) {
        //NSAssert1(0, @"Error: failed to insert into the database with message '%s'.", sqlite3_errmsg(contactDB));
        Status.text = @"Update failed";
    }else{
        **Status.text = @"Stay OK";**
    }
检查sqlite3_步骤的实际结果。你需要继续前进,直到完成为止


如果您在每次调用后检查SQLite的结果,而不是将ifs链接在一起,那么这样的问题更容易诊断。

Hm,我认为您使用SQLite\u错误检查的错误之处,因为还有许多其他状态代码不完整,您最好检查SQLite\u OK或SQLite\u行,如果你有这个状态码,你就做得很好


如果您遇到错误,请使用sqlite3_errmsg找出错误所在。我想SQLITE_可能有点忙或锁定的问题,顺便说一句,双星应该把文本放在粗体…更新在哪里。。。SQL?你好,Moonlight,它在方法aStayLogged中。->NSString*updateSQL=[NSString stringWithFormat:@UPDATE CONTACTS SET LOGGED='1',其中LOGIN=\%@\,LOGIN.text];当您在第一个块中向下滚动时……Steven,您建议测试“SQLITE_错误”的IF语句可能不是检查语句执行成功的正确方法;然而,我没有找到另一种方法。你能给我解释一下怎么做,或者给我一个可以找到这个问题答案的来源吗?谢天谢地,这并不是说它错了,而是在检查一个特定常数是否相等时,你放弃了它可能是什么。对于这个特定问题,我将在“保持OK”行上放置一个断点并检查其值。如果是SQLITE_行,则需要再次执行步骤。如果是SQLITE_完成的,或者可能是SQLITE_OK?我不记得了,你完了。如果是别的,那就是个错误。这不仅仅是SQLITE_错误。您可能希望研究使用fmdb而不是直接使用SQLITE。它是SQLite的一个相当小的可可包装器。我已经直接使用SQLite很多年了,我一直在考虑切换。谢谢,你说的似乎是对的,我试着调试你使用SQLite的方式。虽然我还没有完成我的代码,但似乎我想在数据库被锁定时更新一些东西,因为我已经使用了SELECT语句。关于FMDB,我在网上查了一下,它看起来很有趣。然而,由于我还没有您在这些年中获得的经验,我将首先坚持使用标准SQLite代码,并对其进行深入研究。也许之后我会研究一下包装器,看看它是否真的有助于工作。谢谢你的帮助!月光,我照你说的做了。我现在使用SQLITE_OK,并添加了:NSAssert10,@创建update语句时出错。“%s',sqlite3_errmsgcontactDB;检查。然后我尝试通过“Login”和“aStayLogged”构建iAction。对于“登录”版本,我收到消息:“创建更新语句时出错。”数据库已锁定,而iAction:“创建更新语句时出错。”未知错误奇怪,没有“断言”,iAction用于工作。如果sqlite3_打开成功,如何锁定数据库?