iOS
开发的基本上都知道fmdb
,自从用了fmdb
之后都忘记了原生的sqlite3
操作了(fmdb
太好用了)。
SQLite
是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL
数据库引擎。它是一个零配置的数据库,这意味着与其他数据库一样,您不需要在系统中配置。
SQLite
是一个轻量级的关系数据库。SQLite
最初的设计目标是用于嵌入式系统,TA占用资源非常少,在嵌入式设备中,只需要几百K的内存就够了,目前应用于Android
、iOS
、Windows Phone
等智能手机。
需要注意的是:
1,有些数据库会有要求在每条SQL
命令的末尾加上分号,而SQLite
则属于另一类,TA的语句末尾不使用分号;
2,SQL
对大小写不敏感
SQLite
基础SQLite
支持的数据类型类型 | 说明 |
---|---|
INTEGER | 有符号整型 |
REAL | 浮点型 |
TEXT | 字符串类型,采用UTF-8 UTF-16编码,在iOS中注意转换 |
BLOB | 大二进制对象类型,能够存放任何二进制数据 |
VARCHAR CHAR CLOB | 转换为TEXT类型 |
FLOAT DOUBLE | 转换为REAL |
NUMERIC | 转换为 INTEGER 或者 REAL 类型 |
创建数据库前需要加入libsqlite3.0.tbd
依赖以及引入sqlite3.h
头文件#import <sqlite3.h>
1.使用sqlite3_open函数打开数据库
2.使用sqlite3_exec函数执行Create Table语句
3.使用sqlite3_close函数释放资源
代码如下:
- (NSString *)applicationDocumentsDirectorFile {
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * documentDirectory = [paths lastObject];
NSString * filePath = [documentDirectory stringByAppendingPathComponent:kNameFile];
return filePath;
}
- (void)createDataBaseTableIfNeeded {
NSString * writeTablePath = [self applicationDocumentsDirectorFile];
NSLog(@"数据库的地址是:%@",writeTablePath);
//第一个参数是数据库文件所在的完整路径
//第二个参数是数据库 DataBase 对象
if (sqlite3_open([writeTablePath UTF8String], &db) != SQLITE_OK) {// SQLITE_OK 打开成功
//失败 无论成功还是失败都要关闭数据库
sqlite3_close(db);
NSAssert(NO, @"数据库打开失败!");
}else {
char * err;
NSString * createSQL = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS StudentName (idNum TEXT PRIMARY KEY, name TEXT);"];
/*
第一个参数 db 对象
第二个参数 语句
第三个参数 和 第四个参数 回调函数和回调函数传递的参数
第五个参数 是一个错误信息
*/
if (sqlite3_exec(db, [createSQL UTF8String], NULL, NULL, &err) != SQLITE_OK) {
//失败
sqlite3_close(db);
NSAssert(NO, @"建表失败! %s",err);
}
sqlite3_close(db);
}
}
1.使用sqlite3_prepare_v2函数预处理SQL语句
2.使用sqlite3_bind_text函数绑定参数
3.使用sqlite3_step函数执行SQL语句,遍历结果集
4.使用sqlite3_column_text等函数提取字段数据
代码如下:
//查询
- (StudentModel *)searchWithIdNum:(StudentModel *)model {
NSString * path = [self applicationDocumentsDirectorFile];
if (sqlite3_open([path UTF8String], &db) != SQLITE_OK) {
[self openDatabaseError];
}else {
NSString * qsql = @"SELECT idNum,name FROM StudentName where idNum = ?";
sqlite3_stmt * statement;//语句对象
/// 预处理函数 v2
//第一个参数 数据库的对象
//第二个参数 SQL语句
//第三个参数 执行语句的长度 -1是指全部长度
//第四个参数 语句对象
//第五个参数 没有执行的语句部分 NULL
if (sqlite3_prepare_v2(db, [qsql UTF8String], -1, &statement, NULL) == SQLITE_OK) {
//进行 按主键查询数据库
NSString * idNum = model.idNum;
//绑定操作
//第一个参数 语句对象
//第二个参数 参数执行的序号,就是sql语句预留的占位符?的序号 1代表sql语句中的第一个问号,问号的下标是从1开始的
//第三个参数 我们要绑定的值
//第四个参数 绑定的字符串的长度
//第五个参数 指针 NULL
sqlite3_bind_text(statement, 1, [idNum UTF8String], -1, NULL);
//遍历结果集 有一个返回值 SQLITE_ROW常量代表查出来了
if (sqlite3_step(statement) == SQLITE_ROW) {//查出来了
//提取数据
//第一个参数 语句对象
//第二个参数 字段索引 0 查询结果集的竖列顺序
char * idNum = (char *)sqlite3_column_text(statement, 0);
//数据转换
NSString * idNumStr = [[NSString alloc] initWithUTF8String:idNum];
char * name = (char *)sqlite3_column_text(statement, 1);
NSString * nameStr = [NSString stringWithUTF8String:name];
StudentModel * model = [[StudentModel alloc] init];
model.idNum = idNumStr;
model.name = nameStr;
//释放资源
sqlite3_finalize(statement);
sqlite3_close(db);
return model;
}
}
sqlite3_finalize(statement);
sqlite3_close(db);
}
return nil;
}