我正在尝试做什么
在我的应用程序中,我有一个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;
}
答案 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;