一、概述
在用数组保存模型时,发现数组里面的数据都一样,就是在添加数据时出错
二、问题代码:
//查询数据 - (void)select{ JZInfoModel *model = [JZInfoModel new]; //关键字 limit 0,2 从哪个位置读 每次读几个 NSString *selectSql = @"select * from t_student"; //1.预处理 -1表示语句长度自己计算 sqlite3_stmt *stmt = NULL; if (sqlite3_prepare(_sql, [selectSql UTF8String], -1, &stmt, NULL) == SQLITE_OK) { //2.一条一条读取数据 如果有 返回值就是SQLITE_ROW while (sqlite3_step(stmt) == SQLITE_ROW) { //一列一列地去读取每一条记录 1表示列 char *name = (char *)sqlite3_column_text(stmt, 1); char *age = (char *)sqlite3_column_text(stmt, 2); NSData *data = [NSData dataWithBytes:sqlite3_column_blob(stmt, 3) length:sqlite3_column_bytes(stmt, 3)]; //NSLog(@"%s, %s, %@", name, age, [UIImage imageWithData:data]); model.img = [UIImage imageWithData:data]; model.name = [NSString stringWithFormat:@"%s", name]; model.age = [NSString stringWithFormat:@"%s", age]; [self.modelsArr addObject:model]; NSLog(@"%@", self.modelsArr); } } else { NSLog(@"预处理失败"); } }
打印数组:
三、原因分析:
两个元素指向同一片地址 ,数组在保存数据时,并没有保存数具体的数值,而是保存地址。model里面属性的值在变,地址没有变。类似:
int a = 1; int a = 2;
最终model保存的是最后的数据
+
四、解决方案:
每次保存模型时,重新分配空间即可,即把创建的代码放到循环中
代码:
//查询数据 - (void)select{ //关键字 limit 0,2 从哪个位置读 每次读几个 NSString *selectSql = @"select * from t_student"; //1.预处理 -1表示语句长度自己计算 sqlite3_stmt *stmt = NULL; if (sqlite3_prepare(_sql, [selectSql UTF8String], -1, &stmt, NULL) == SQLITE_OK) { //2.一条一条读取数据 如果有 返回值就是SQLITE_ROW while (sqlite3_step(stmt) == SQLITE_ROW) {
//这样改 JZInfoModel *model = [JZInfoModel new]; //一列一列地去读取每一条记录 1表示列 char *name = (char *)sqlite3_column_text(stmt, 1); char *age = (char *)sqlite3_column_text(stmt, 2); NSData *data = [NSData dataWithBytes:sqlite3_column_blob(stmt, 3) length:sqlite3_column_bytes(stmt, 3)]; //NSLog(@"%s, %s, %@", name, age, [UIImage imageWithData:data]); model.img = [UIImage imageWithData:data]; model.name = [NSString stringWithFormat:@"%s", name]; model.age = [NSString stringWithFormat:@"%s", age]; [self.modelsArr addObject:model]; NSLog(@"%@", self.modelsArr); } } else { NSLog(@"预处理失败"); } }
分析:
原文:https://www.cnblogs.com/jianze/p/10841913.html