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

私の質問は、4 ではなく 0 にproductsなる理由にデータを追加するときですか?[products count]

使用する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

2 つの問題があります。

配列を割り当てていません。配列へのポインタを宣言しただけです。これを init に追加します。

products = [[NSMutableArray alloc]init];

また、データをフェッチする前に 2 回ステップすることで、結果の最初の行をスキップしています。

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 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メモリを配列に割り当て、

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

製品配列を初期化していないと思います。

products = [[NSMutableArray alloc]init];

最初に初期化してから、必要なことを行う必要があります。

于 2013-07-25T11:30:37.917 に答える