码迷,mamicode.com
首页 > 移动开发 > 详细

iOS 开发指南 第11章 数据持久化之SQLite 学习

时间:2015-09-19 13:38:04      阅读:325      评论:0      收藏:0      [点我收藏+]

标签:

1 SQLite是无数据类型的数据库,就是字段不用指定类型。但从编程规范上说,应该在Create Table语句中指定数据类型:INTERGER 有符号的整数类型 REAL 浮点类型 TEXT 字符串类型 BLOB二进制类型

2 创建数据库:

   准备:添加SQLite3库到工程中 TARGETS-Link Binary With Libraries-添加libsqlite3.dylib   

   使用sqlite3_open打开数据库-使用sqlite3_exec执行Creat Table语句,创建数据库-使用sqlite3_close释放资源

  

- (void)createEditableCopyOfDatabaseIfNeeded {
    
    NSString *writableDBPath = [self applicationDocumentsDirectoryFile];
    const char* cpath = [writableDBPath UTF8String];将路径转变为C字符串
    
    if (sqlite3_open(cpath, &db) != SQLITE_OK) { sqlite3 *db;db是数据库指针
        sqlite3_close(db);
        NSAssert(NO,@"数据库打开失败。");
    } else {
        char *err;
构建SQL语句 NSString
*sql = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS Note (cdate TEXT PRIMARY KEY, content TEXT);"]; const char* cSql = [sql UTF8String]; 执行参数分别是 sqlite3指针变量 要执行的SQL语句 要回调的函数 要回调函数的参数 执行出错的字符串 if (sqlite3_exec(db, cSql,NULL,NULL,&err) != SQLITE_OK) {顺序是 先执行在判断 sqlite3_close(db); NSAssert(NO, @"建表失败"); } sqlite3_close(db); } }

**********

NSAssert()只是一个宏,用于开发阶段调试程序中的Bug,通过为NSAssert()传递条件表达式来断定是否属于Bug,满足条件返回真值,程序继续运行,如果返回假值,则抛出异常,并切可以自定义异常描述。NSAssert()是这样定义的:

#define NSAssert(condition, desc)

condition是条件表达式,值为YES或NO;desc为异常描述,通常为NSString。当conditon为YES时程序继续运行,为NO时,则抛出带有desc描述的异常信息。NSAssert()可以出现在程序的任何一个位置。

**********

3 查询数据 

   查询条件使用where语句,在程序中需要动态绑定参数给where语句

   使用sqlite3_open打开数据库-使用sqlite3_prepare_v2预处理SQL语句-使用sqlite3_bind_text绑定参数-使用sqlite3_step执行SQL语句,遍历结果集-使用sqlite3_column_text提取字段数据-使用sqlite3_finalize和sqlite3_close释放资源

//按照主键查询数据方法
-(Note*) findById:(Note*)model
{
    
    NSString *path = [self applicationDocumentsDirectoryFile];
    const char* cpath = [path UTF8String];
    
    if (sqlite3_open(cpath, &db) != SQLITE_OK) {
        sqlite3_close(db);
        NSAssert(NO,@"数据库打开失败。");
    } else {
        
        NSString *sql = @"SELECT cdate,content FROM Note where cdate =?";?代表动态参数
        const char* cSql = [sql UTF8String];
        
        sqlite3_stmt *statement;
        //预处理过程 目的是将SQL语句编译成二进制代码,提高SQL语句的执行速度。
第三个参数开始 代表全部的SQL字符串长度 语句对象:通过语句对象可以执行SQL语句 SQL语句没有执行的那部分
if (sqlite3_prepare_v2(db, cSql, -1, &statement, NULL) == SQLITE_OK) { //准备参数 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; NSString *strDate = [dateFormatter stringFromDate:model.date]; const char* cDate = [strDate UTF8String]; //绑定参数开始
参数:指针 序号:从1开始 字符串(参数) 字符串长度 函数指针
sqlite3_bind_text(statement, 1, cDate, -1, NULL); //执行 if (sqlite3_step(statement) == SQLITE_ROW) {若函数返回值等于SQLITE_ROW,表示还有其他的行没有遍历 char *bufDate = (char *) sqlite3_column_text(statement, 0);第二个参数用于指定select字段的索引 NSString *strDate = [[NSString alloc] initWithUTF8String: bufDate]; NSDate *date = [dateFormatter dateFromString:strDate]; char *bufContent = (char *) sqlite3_column_text(statement, 1); NSString * strContent = [[NSString alloc] initWithUTF8String: bufContent]; Note* note = [[Note alloc] initWithDate:date content:strContent]; sqlite3_finalize(statement); sqlite3_close(db); return note; } } sqlite3_finalize(statement); sqlite3_close(db); } return nil; }

4 修改数据 

  涉及的SQL语句有insert update delete

  使用sqlite3_open打开数据库-使用sqlite3_prepare_v2预处理SQL语句-使用sqlite3_bind_text绑定参数-使用sqlite3_step执行SQL语句-使用sqlite3_finalize和sqlite3_close关闭数据库

//插入Note方法
-(int) create:(Note*)model
{
    
    NSString *path = [self applicationDocumentsDirectoryFile];
    const char* cpath = [path UTF8String];
    
    if (sqlite3_open(cpath, &db) != SQLITE_OK) {
        sqlite3_close(db);
        NSAssert(NO,@"数据库打开失败。");
    } else {
        
        NSString *sql = @"INSERT OR REPLACE INTO note (cdate, content) VALUES (?,?)";
        const char* cSql = [sql UTF8String];
        
        sqlite3_stmt *statement;
        //预处理过程
        if (sqlite3_prepare_v2(db, cSql, -1, &statement, NULL) == SQLITE_OK) {
            
            NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
            [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
            NSString *strDate = [dateFormatter stringFromDate:model.date];
            const char* cDate  = [strDate UTF8String];
            
            const char* cContent = [model.content UTF8String];
            
            //绑定参数开始
            sqlite3_bind_text(statement, 1, cDate, -1, NULL);
            sqlite3_bind_text(statement, 2, cContent, -1, NULL);
            
            //执行插入
            if (sqlite3_step(statement) != SQLITE_DONE) {
                NSAssert(NO, @"插入数据失败。");
            }
        }
        
        sqlite3_finalize(statement);
        sqlite3_close(db);
    }
    
    return 0;
}

//删除Note方法
-(int) remove:(Note*)model
{
    NSString *path = [self applicationDocumentsDirectoryFile];
    const char* cpath = [path UTF8String];    
    
    if (sqlite3_open(cpath, &db) != SQLITE_OK) {
        sqlite3_close(db);
        NSAssert(NO,@"数据库打开失败。");
    } else {
        NSString *sql = @"DELETE  from note where cdate =?";
        const char* cSql = [sql UTF8String];
        
        sqlite3_stmt *statement;
        //预处理过程
        if (sqlite3_prepare_v2(db, cSql, -1, &statement, NULL) == SQLITE_OK) {
            NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
            [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
            NSString *strDate = [dateFormatter stringFromDate:model.date];
            const char* cDate  = [strDate UTF8String];
            
            //绑定参数开始
            sqlite3_bind_text(statement, 1, cDate, -1, NULL);
            //执行
            if (sqlite3_step(statement) != SQLITE_DONE) {
                NSAssert(NO, @"删除数据失败。");
            }
        }
        
        sqlite3_finalize(statement);
        sqlite3_close(db);
    }
    
    return 0;
}

//修改Note方法
-(int) modify:(Note*)model
{
    
    NSString *path = [self applicationDocumentsDirectoryFile];
    const char* cpath = [path UTF8String];
    
    if (sqlite3_open(cpath, &db) != SQLITE_OK) {
        sqlite3_close(db);
        NSAssert(NO,@"数据库打开失败。");
    } else {
        
        NSString *sql = @"UPDATE note set content=? where cdate =?";
        const char* cSql = [sql UTF8String];
        
        sqlite3_stmt *statement;
        //预处理过程
        if (sqlite3_prepare_v2(db, cSql, -1, &statement, NULL) == SQLITE_OK) {
            
            NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
            [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
            NSString *strDate = [dateFormatter stringFromDate:model.date];
            const char* cDate  = [strDate UTF8String];
            
            const char* cContent = [model.content UTF8String];
            
            //绑定参数开始
            sqlite3_bind_text(statement, 1, cContent, -1, NULL);
            sqlite3_bind_text(statement, 2, cDate, -1, NULL);
            //执行
            if (sqlite3_step(statement) != SQLITE_DONE) {
                NSAssert(NO, @"修改数据失败。");
            }
        }
        
        sqlite3_finalize(statement);
        sqlite3_close(db);
    }
    return 0;
}

 

iOS 开发指南 第11章 数据持久化之SQLite 学习

标签:

原文地址:http://www.cnblogs.com/haugezi/p/4821267.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!