SQLite 基本使用

- (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;

  1. }
原文地址:https://www.cnblogs.com/airy99/p/3727356.html