我在sqlite3中创建了一个具有以下条件的数据库
表名:股票
Column 1: ID integer primary key
Column 2: Name text
Column 3: Price integer
Column 4: Quantity integer
拨打'从库存中选择*;'在sqlite 3中,我得到以下内容;
1|Tomato Sauce|3.99|7
价格和数量值在我的UITableView上正确显示 - 如此处所示;
也会显示ID,但这不是我想要显示的目标字段。我想显示产品名称,该名称属于第1列。下面是将我创建的对象与sqlite3数据库关联的代码;
-(void)readDataFromDatabase{
[self.stock removeAllObjects];
sqlite3 *database;
if (sqlite3_open([self.databasePath UTF8String], &database) == SQLITE_OK) {
char *sqlStatement = "select * from stock";
sqlite3_stmt *compiledStatement;
if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK){
while(sqlite3_step(compiledStatement) == SQLITE_ROW){
char *n = (char*)sqlite3_column_text(compiledStatement, 1);
float p = (float)sqlite3_column_int(compiledStatement, 2);
int q = sqlite3_column_int(compiledStatement, 3);
NSString *name = [NSString stringWithUTF8String:n];
NSNumber *price = [NSNumber numberWithFloat:p];
NSNumber *quantity = [NSNumber numberWithInt:q];
Data *data = [[Data alloc] initWithData:name thePrice:price theQuantity:quantity];
[self.stock addObject:data];
}
}
sqlite3_finalize(compiledStatement);
}
sqlite3_close(database);
}
让我的模拟器启动而不会出错的唯一方法是将以下列更改为0(ID)而不是1(名称);
char *n = (char*)sqlite3_column_text(compiledStatement, 0);
每当我更改0以描述Name列时,模拟器崩溃,我就会找到链接到AppDelegate的main.m文件。调试区域中显示以下错误;
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** +[NSString stringWithUTF8String:]: NULL cString'
根据我的理解,它失败了,因为它感觉编译器崩溃,因为NULL值被输入到stringWithUTF8String的常量char *中。但是,在选择*来自库存之后;'我可以确认数据是否正确存储在数据库中。