标签:
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;
}
标签:
原文地址:http://www.cnblogs.com/haugezi/p/4821267.html