更改布尔值时EXC_BAD_ACCESS(code = 2,adress = 0x0)

时间:2013-07-23 06:31:41

标签: objective-c sqlite boolean runtime-error

我正在尝试做什么


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

问题


在我的方法中,我定义了一个布尔值并将其设置为Null。之后我有一个If-Clause,它检查数据是否可以写入我的数据库,并将定义的布尔值更改为true或false。这让我误以为错误: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;
}

2 个答案:

答案 0 :(得分:2)

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

首先创建一个指向BOOL的指针。您将其指向的地址设置为NULL。然后,您尝试将其指向的地址的值设置为YES。

或简短:您尝试在地址0x00处写字。那不行。

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

- (BOOL) createLogin:(NSInteger *)user_id
               usr: (NSString *)username
               pwd: (NSString *)password
              date: (NSDate *)last_login{
    BOOL returnValue = NO;
    /* ... */
    returnValue = YES;
    /* ... */
    return returnValue;
}

答案 1 :(得分:-1)

尝试从开始初始化Bool为False。

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