Ios 在NSMuttable数组中添加产品无效

Ios 在NSMuttable数组中添加产品无效,ios,objective-c,sqlite,nsmutablearray,nsarray,Ios,Objective C,Sqlite,Nsmutablearray,Nsarray,我在下面的代码中获取数据 database=nil; if (sqlite3_open([sqlitePath UTF8String], &database) == SQLITE_OK){ const char *sql = [[NSString stringWithFormat:@"select * from products"] UTF8String]; sqlite3_stmt *updateStmt = nil; if(sq

我在下面的代码中获取数据

database=nil;
    if (sqlite3_open([sqlitePath UTF8String], &database) == SQLITE_OK){
        const char *sql = [[NSString stringWithFormat:@"select * from products"] UTF8String];
        sqlite3_stmt *updateStmt = nil;
        if(sqlite3_prepare_v2(database, sql, -1, &updateStmt, NULL) != SQLITE_OK)
        {
            //NSAssert1(0, @"Error while creating update statement. '%s'", sqlite3_errmsg(database));
        }
        if (SQLITE_DONE != sqlite3_step(updateStmt)){
            //NSAssert1(0, @"Error while creating database. '%s'", sqlite3_errmsg(database));
        }

        NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
        while(sqlite3_step(updateStmt) == SQLITE_ROW) {
            NSLog(@"ok=====");
            NSNumber *recordID = [NSNumber numberWithInt: sqlite3_column_int(updateStmt, 0)];
            NSString *fullName = [[NSString alloc] initWithUTF8String: (char *)sqlite3_column_text(updateStmt, 1)];
            NSString *photoName = [[NSString alloc] initWithUTF8String: (char *)sqlite3_column_text(updateStmt, 2)];

            NSLog(@"=====%@===%@====%@====", recordID, fullName, photoName);

            NSDictionary *product = [[NSDictionary alloc] initWithObjectsAndKeys: recordID, @"id", fullName, @"fullName", photoName, @"photoName", nil];
            [products addObject: product];
            [product release];
        }

        NSLog(@"total data is ==== %d", [products count]);

        [numberFormatter release];

        sqlite3_reset(updateStmt);
        sqlite3_finalize(updateStmt);

    }
当我运行这段代码时,我得到如下输出

2013-07-25 14:12:14.785 SQLTest[88568:11303] =====2===test 002====21.45====
2013-07-25 14:12:14.786 SQLTest[88568:11303] =====4===test 002====21.45====
2013-07-25 14:12:14.786 SQLTest[88568:11303] =====6===test 002====22.16====
2013-07-25 14:12:14.787 SQLTest[88568:11303] =====7===test 002====22.17====
2013-07-25 14:12:14.787 SQLTest[88568:11303] total data is ==== 0
我的问题是,当我在
products
中添加数据时,为什么我将
[products count]
设置为0而不是4

当我使用
NSLog(@“print===%@”,product)时我看到以下输出(针对所有ID)


将内存分配给
产品
阵列

products = [[NSMutableArray alloc]init];

将内存分配给
产品
阵列

products = [[NSMutableArray alloc]init];

很可能产品从未初始化,因此您的
[products addObject:product]
将生成一条nil消息,该消息不会给出任何错误,但也不会向产品添加任何内容

您可以在类init中选择init产品:

- (id)init {
   self = [super init];
   if (self) {
      self.products = [[NSMutableArray alloc] init];
   }
   return self;
}
或者,您可以仅在第一次调用时延迟加载产品:

 - (NSMutableArray *)products {
    if (!_products) _products = [[NSMutableArray alloc] init];
    return _products;
 }

很可能产品从未初始化,因此您的
[products addObject:product]
将生成一条nil消息,该消息不会给出任何错误,但也不会向产品添加任何内容

您可以在类init中选择init产品:

- (id)init {
   self = [super init];
   if (self) {
      self.products = [[NSMutableArray alloc] init];
   }
   return self;
}
或者,您可以仅在第一次调用时延迟加载产品:

 - (NSMutableArray *)products {
    if (!_products) _products = [[NSMutableArray alloc] init];
    return _products;
 }

我认为您没有初始化产品阵列

products = [[NSMutableArray alloc]init];

您需要先初始化,然后再执行所需操作。

我认为您没有初始化产品阵列

products = [[NSMutableArray alloc]init];
你需要先初始化,然后做你想做的事。

你有两个问题

您没有分配数组,只是声明了一个指向它的指针。将此添加到您的init中

products = [[NSMutableArray alloc]init];
在获取数据之前,您还通过两次单步执行跳过结果的第一行

if (SQLITE_DONE != sqlite3_step(updateStmt)){     // <-- skips first row
    //NSAssert1(0, @"Error while creating database. '%s'", sqlite3_errmsg(database));
}

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
while(sqlite3_step(updateStmt) == SQLITE_ROW) {   // Starts at second row
if(SQLITE\u DONE!=sqlite3\u步骤(updateStmt)){/您有两个问题

您还没有分配数组,只是声明了一个指向它的指针

products = [[NSMutableArray alloc]init];
在获取数据之前,您还通过两次单步执行跳过结果的第一行

if (SQLITE_DONE != sqlite3_step(updateStmt)){     // <-- skips first row
    //NSAssert1(0, @"Error while creating database. '%s'", sqlite3_errmsg(database));
}

NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
while(sqlite3_step(updateStmt) == SQLITE_ROW) {   // Starts at second row

if(SQLITE\u DONE!=sqlite3\u步骤(updateStmt)){//您是否分配了
产品
?您是否分配了
产品
?它在工作…但我面临一个问题…当我提取数据时,数据是从第二条记录开始的…我没有得到第一条记录…知道为什么会发生这种情况吗?您的代码看起来不错,但在其他地方可能是您出错了,但不确定。它在工作…但我面临一个问题…当我提取数据时,数据是从第二条记录开始的…我没有得到第一条记录..知道为什么会发生这种情况吗?您的代码看起来不错,但在其他地方可能是您出错了,但不确定。