选择Stmt期间的iOS 8.2 SQLite未知错误

时间:2015-02-02 03:38:20

标签: ios sqlite runtime-error

尝试使用select语句查询应用程序的数据库时出现Unknown Error SQLite错误。我已经查了十几次代码,但它对我来说看起来很好(显然在某些地方出现了问题)。

以下是我发现问题的代码:

- (Boolean)loginAttempt
{
    // Do any additional setup after loading the view.
    //Startup Checks on Database

    //Get Docs Directory
    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);

    docDir = [dirPaths objectAtIndex:0];

    //Build path to DB file
    dbPath = [[NSString alloc] initWithString: [docDir stringByAppendingPathComponent: @"AGDB.sqlite"]];

    //NSC

    fManager = [NSFileManager defaultManager];

    if ([fManager fileExistsAtPath: dbPath] == NO)
    {
        [self callAlert:@"Database Not Found!" :@"For some reason we could not find your Angles and Gridz Database.  Let us know about this error right away!" :@"Ok"];
    }

    else
    {
        dbpath = [dbPath UTF8String];
    }

    if (sqlite3_open(dbpath,&dbCon) == SQLITE_OK)
    {
        const char *insertSQL = "select Password from Login where Username=?";

        if (sqlite3_prepare_v2(dbCon,insertSQL,-1,&stmt,NULL) == SQLITE_OK)
        {
            if (sqlite3_bind_text(stmt,1,[user_Text.text UTF8String],-1,NULL) != SQLITE_OK)
            {
                sqlErr = [NSString stringWithUTF8String:sqlite3_errmsg(dbCon)];

                return FALSE;
            }

            if (sqlite3_step(stmt) == SQLITE_ROW)
            {
                int cols = sqlite3_column_count(stmt);

                if (cols > 0)
                {
                    for (int i1 = 0; i1 < cols; i1++)
                    {
                        switch(i1)
                        {
                            case 2:
                                rPass = [[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(stmt,i1)];
                                break;

                            default:
                                break;
                        }
                    }
                }

                sqlite3_clear_bindings(stmt);
                sqlite3_finalize(stmt);
                sqlite3_close(dbCon);

                //Check against supplied password
                if (![rPass isEqualToString:pass_Text.text])
                {
                    return FALSE;
                }

                else
                {
                    return TRUE;
                }

            }

            else
            {
                sqlErr = [NSString stringWithUTF8String:sqlite3_errmsg(dbCon)];

                return FALSE;
            }
        }

        else
        {
            sqlErr = [NSString stringWithUTF8String:sqlite3_errmsg(dbCon)];

            return FALSE;
        }
    }

    else
    {
        sqlErr = [NSString stringWithUTF8String:sqlite3_errmsg(dbCon)];
        return FALSE;
    }
}

这对我来说都是正确的。这是打开数据库的.m文件中唯一的位置,以及打开数据库的应用程序中的其他位置。一旦完成数据库上的操作,我将完成任何语句并关闭数据库连接。< / p>

它能够找到数据库和表,因为我之前有一个不同的错误,说明Username列不存在(它实际上是Usename,在我编写select语句时拼写错误)。

如果有人发现代码有任何问题或知道可能导致此问题的原因,请告诉我们!感谢。

1 个答案:

答案 0 :(得分:0)

我弄清楚发生了什么事。起初我错过了一级SQL错误检查。相反,错误检查发生在step语句块内部,该语句块不应该返回sql错误消息,但如果col计数返回为0,则返回“数据库空”消息。

修正了另一个问题,我应该为0而不是2进行套管,并解决了这个问题。由于没有要返回的sql错误消息,因此返回了未知错误。