比较麻烦。
//查询 又体现了多态:父类指针可以指向子类对象。在我们增加的时候,是一个可变数组,所以内部定义一个可变的数组,但是返回的却是不可变数组。
-(NSArray *)selectAllStudents
{
NSMutableArray *mutableArray = nil;
//伴随指针
sqlite3_stmt *stmt = nil;
//查询语句
NSString *selectSQL = [NSString stringWithFormat:@"SELECT * FROM 'student'"];
//准备执行
//db 当前数据库
//selectSQL.UTF8String 执行语句
//-1 最大值
int result = sqlite3_prepare(db, selectSQL.UTF8String, -1, &stmt, NULL);
if (SQLITE_OK == result) {
//当上面的准备查询成功后才开始为数组分配内存---保证内存的有效性
mutableArray = [[NSMutableArray alloc]initWithCapacity:15];
//伴随指针是否指向当前行
while (SQLITE_ROW == sqlite3_step(stmt)) {
Student *student = [Student new];
//number 是NSInteger类型 ,后面返回的是int类型
//OC中的NSInteger只是int的别名,只不过OC中的NSInteger是根据机子是X32还是X64来分配的。
//也就是说NSInteger的存储大小事不确定的,得看是x32还是x64。
//typedef long NSInteger;
student.number = sqlite3_column_int(stmt, 0);
//根据字段查询的字符串需要强转为 const char * 类型后,再转化成OC字符串
student.name = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 1)];
student.age = sqlite3_column_int(stmt, 2);
student.gender = [NSString stringWithUTF8String:(const char *)sqlite3_column_text(stmt, 3)];
[mutableArray addObject:student];
}
for (Student *stu in mutableArray) {
NSLog(@"学生:%@",stu);
}
}
else
{
NSLog(@" 查询失败");
}
//释放指针
sqlite3_finalize(stmt);
return mutableArray;
}