0

我正在尝试做的事情


在我的应用程序中,我有一个 SQL-Lite 数据库,为此我编写了一些方法。方法的回调是一个布尔值。True = 可以写入数据,False = 无法写入数据。该代码在 X-Code 中没有显示任何错误,所以我应该是对的。

问题


在我的方法中,我定义了一个布尔值并将其设置为 Null。之后我有一个 If-Clause,它检查数据是否可以写入我的数据库,并将定义的布尔值更改为真或假。这给我带来了错误:EXC_BAD_ACCESS (code = 2, address = 0x0)

关键是,我不明白为什么会出现这个错误。你们能告诉我,我做错了什么以及如何解决它。您可以在此处找到代码:

代码


    - (BOOL *) createLogin:(NSInteger *)user_id
                   usr: (NSString *)username
                   pwd: (NSString *)password
                  date: (NSDate *)last_login{

    BOOL *returnvalue = NULL;

    self.ivo_db = [[ivo_database alloc] init];

    if((sqlite3_open_v2([[ivo_db getWritableDatabase] UTF8String], &sqldb, SQLITE_OPEN_READWRITE, NULL) != SQLITE_OK)){

    NSLog(@" %s Couldn't open writable database '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(sqldb), sqlite3_errcode(sqldb));

    }else{
        int userid = *user_id;
        NSString *sqlString = [NSString stringWithFormat:@"INSERT INTO tbl_login (user_id, username, password, last_login) VALUES (%d,'%@','%@','%@')", userid, username, password, last_login];

    const char *putLoginData = [sqlString UTF8String];
    sqlite3_stmt *sqlStatement;

    if(sqlite3_prepare(sqldb, putLoginData, -1, &sqlStatement, NULL) != SQLITE_OK)
    {
        NSLog(@"%s SQLITE_ERROR while preparing Statement '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(sqldb), sqlite3_errcode(sqldb));
        *returnvalue = NO;
    }else{

    sqlite3_step(sqlStatement);
    sqlite3_finalize(sqlStatement);

    int lastInsert = sqlite3_last_insert_rowid(sqldb);
    NSLog(@"lastinsertid:%d", lastInsert);
    sqlite3_close(sqldb);
    *returnvalue = YES;
    }
   }
    return returnvalue;
}
4

2 回答 2

2
BOOL *returnvalue = NULL;
/* ... */
*returnvalue = YES;

您首先创建一个指向 BOOL 的指针。您将它指向的地址设置为 NULL。然后您尝试将它指向的地址的值设置为“是”。

或者简而言之:您尝试在地址 0x00 处写入。那是行不通的。

您想使用 BOOL。原始类型,没有指针。

- (BOOL) createLogin:(NSInteger *)user_id
               usr: (NSString *)username
               pwd: (NSString *)password
              date: (NSDate *)last_login{
    BOOL returnValue = NO;
    /* ... */
    returnValue = YES;
    /* ... */
    return returnValue;
}
于 2013-07-23T06:34:57.793 回答
-1

尝试从 Start 将 Bool 初始化为 False。

并且当您更改变量的值时,请执行 returnvalue = YES;

于 2013-07-23T06:35:01.040 回答