错误:sqlite3数据库

时间:2017-01-25 14:13:56

标签: mysql objective-c uitableview sqlite

我在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上正确显示 - 如此处所示; 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 *中。但是,在选择*来自库存之后;'我可以确认数据是否正确存储在数据库中。

0 个答案:

没有答案