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