我的应用程序中有一个共享的nsmutablearray。我从sqlite数据库中提取了大量数据并添加到数组中。数组具有正确数量的对象作为数据库,但是当我调用objectAtIndex时,我总是得到相同的值 - 最后的记录值。
所以我不确定我的应用是否无法添加到共享阵列或从中提取数据。这是一些代码:最后两个NSLog给出了相同的输出,这是不正确的
SYSAppDelegate *appDelegate = (SYSAppDelegate *)[[UIApplication sharedApplication] delegate];
Contra *contra = [[Contra alloc]init];
sqlite3_stmt *statement;
int recordCount = 0;
if (sqlite3_open([appDelegate.dbPathString UTF8String], &_DB)==SQLITE_OK) {
[appDelegate.array removeAllObjects];
NSString *querySql = [NSString stringWithFormat:@"SELECT * FROM DATATABBLE"];
const char* query_sql = [querySql UTF8String];
if (sqlite3_prepare(_DB, query_sql, -1, &statement, NULL)==SQLITE_OK) {
while (sqlite3_step(statement)==SQLITE_ROW) {
NSString *start = [[NSString alloc] initWithUTF8String:(const char *)sqlite3_column_text(statement, 1)];
NSString *stop = [[NSString alloc] initWithUTF8String:(const char *)sqlite3_column_text(statement, 2)];
NSString *cTime = [[NSString alloc] initWithUTF8String:(const char *)sqlite3_column_text(statement, 3)];
NSString *intensity = [[NSString alloc] initWithUTF8String:(const char *)sqlite3_column_text(statement, 4)];
NSString *timeElapsed = [[NSString alloc] initWithUTF8String:(const char *)sqlite3_column_text(statement, 5)];
NSString *hour = [[NSString alloc] initWithUTF8String:(const char *)sqlite3_column_text(statement, 6)];
[contra setStartDate:start];
[contra setStopDate:stop];
[contra setIntensity:[intensity intValue]];
[contra setCTime:[cTime intValue]];
[contra setTimeElapsed:[timeElapsed intValue]];
[contra setHour:[hour intValue]];
[appDelegate.array addObject:contra];
recordCount++;
}
}
}
//Get data from array
//Get last object
contra = [appDelegate.array lastObject];
NSLog(@"cont length: %i.", contra.cTime);
//Get an earlier object
contra = [appDelegate.array objectAtIndex:recordCount -2];
NSLog(@"two cont length: %i", contra.cTime);
答案 0 :(得分:0)
我不确定你是否合成了Contra类的属性。
我建议你把Contra * contra = [[Contra alloc] init]; while循环中的语句并试一试。
答案 1 :(得分:0)
您正在经历一个while循环,并在每次交互时将新值分配给同一对手的属性。实际上,NSMutableArray在每个位置都有相同的对象,每次迭代都会更改同一对象的属性值。因此,您将在测试的每个索引处获得相同的值 - 您在对象上设置的最后一个属性值。
移动声明Contra * contra = [[Contra alloc] init];在while循环中。然后,数组中的每个对象都是唯一的,您将得到正确的结果。