0

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

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)

{
    fullName = "test 002";
    id = 7;
    photoName = "22.17";
}

笔记

@property (nonatomic, assign) sqlite3 *database;
@property (nonatomic, retain) NSMutableArray *products;
@property (nonatomic, assign) NSUInteger currentProduct;
4

5 回答 5

1

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

您可以在您的类 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;
 }
于 2013-07-25T11:22:09.620 回答
1
database=nil;

    products = [[NSMutableArray alloc]init]; //Paste this line  below database=nil;
于 2013-07-25T11:22:22.297 回答
1

你有两个问题;

你还没有分配你的数组,只是声明了一个指向它的指针。将此添加到您的初始化中;

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
于 2013-07-25T11:30:50.193 回答
1

products为数组分配内存,

products = [[NSMutableArray alloc]init];
于 2013-07-25T11:19:22.313 回答
0

我认为您没有初始化产品数组。

products = [[NSMutableArray alloc]init];

你需要先初始化然后做你想做的事。

于 2013-07-25T11:30:37.917 回答