- (void)viewDidLoad
{
[super viewDidLoad];
[self openDB];
[self select];
}
#pragma mark 打开数据库
- (void)openDB
{
NSString *dbPath = [@"17houses.db" appendDocumentDir];
// 判断数据库文件是否在document目录,如果不在的话就拷贝过去
if (![[NSFileManager defaultManager] fileExistsAtPath:kDBName isDirectory:NO]) {
NSString *dbsource=[[NSBundle mainBundle]pathForResource:kDBName ofType:nil];
NSError *pathErr;
[[NSFileManager defaultManager]copyItemAtPath:dbsource toPath:dbPath error:&pathErr];
if (pathErr!=nil) {
NSAssert(pathErr!=nil, @"数据库拷贝发生错误%@",pathErr.localizedDescription);
}
}
_db = NULL;
if (SQLITE_OK == sqlite3_open([dbPath UTF8String], &_db)) {
NSLog(@"数据库打开成功");
} else {
NSLog(@"数据库打开失败");
}
}
#pragma mark 单步执行SQL
- (void)execSQL:(NSString *)sql message:(NSString *)message
{
char *errmsg = NULL;
if (SQLITE_OK == sqlite3_exec(_db, [sql UTF8String], NULL, NULL, &errmsg)) {
NSLog(@"%@成功!", message);
} else {
// C语言中字符串输出应该用%s
NSLog(@"%@失败 - %s", message, errmsg);
}
}
#pragma mark - 使用SQL查询菜谱结果集
- (NSArray *)select
{
NSString *sql = @"SELECT _id, subitem FROM userdata WHERE _id = 4";
// 1. 查询语句通常是使用字符串拼接出来的
// 因此,在正常使用查询语句之前,需要检查SQL语句的语法正确!
sqlite3_stmt *stmt = NULL;
NSMutableArray *List = nil;
if (SQLITE_OK == sqlite3_prepare_v2(_db, [sql UTF8String], -1, &stmt, NULL)) {
NSLog(@"语法正确");
List = [NSMutableArray array];
// 利用句柄,逐一查询符合条件的数据
// sqlite3_step 每次提取一条查询的记录行,不断重复,一直取到最后一条记录位置
while (SQLITE_ROW == sqlite3_step(stmt)) {
// 取到行信息,逐一获取每一列的内容
// iCol对应的就是SQL语句中字段的顺序,从0开始
// 根据实际查询字段的属性,使用sqlite3_column_xxx取得对应的内容即可
int ID = sqlite3_column_int(stmt, 0);
const unsigned char *name = sqlite3_column_text(stmt, 1);
// const unsigned char *直接输出看不出结果,需要转换
NSString *nameUTF8 = [NSString stringWithUTF8String:(const char *)name];
model *m = [model modelWithID:ID subitem:nameUTF8];
[List addObject:m];
}
} else {
NSLog(@"语法错误");
}
return List;
- }