基本步骤
1. 打开数据库。
- 利用
sqlite3_open()
打开数据库会指定一个数据库文件保存路径,如果文件存在则直接打开,否则创建并打开。打开数据库会得到一个sqlite3
类型对象,后面需要借助这个对象进行其他操作。2.执行SQL语句
- 无返回值语句:直接通过
sqlite3_exec()
函数执行(例如增、删、改)- 有返回值语句:①语法检测:
sqlite3_prepare_v2()
。②取数据:sqlite3_step()
。③获取数据:sqlite3_column_类型()
。如此反复循环直到遍历完成。3.关闭数据库
1. 打开数据库
SQLite的C语言函数:
// 打开数据库
int sqlite3_open(
const char *filename, /* 数据库路径(UTF-8) */
sqlite3 **ppDb /* 返回的数据库句柄 */
);
(1) 作用:把一个文件名称传递给它,它会自动检测这个文件是否存在,如果不存在的话,会自动创建相应的文件(这里为数据库文件,刚创建为空)
(2) 说明:sqlite3是一种类型,db是数据库的句柄即数据库象征,如果要进行增删改查,就得操作db这个实例
(3) 返回值:int型,若返回值是SQLITE_OK则说明成功,否则失败
Objective-C实例:
// 创建唯一的数据库指针
static sqlite3 *database = nil;
// 打开数据库
- (void)openDatabaseWithName:(NSString *)dbName{
// 如果数据库指针有值,即数据库已经被打开,那么不做任何操作
if (db) {
return;
}
// 生成沙盒文件路径
NSString *directory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) lastObject];
NSString *filePath = [directory stringByAppendingPathComponent:dbName];
// 打开数据库,如果数据库存在直接打开,如果数据库不存在,创建并打开
int result = sqlite3_open(filePath.UTF8String, &database);
if (result == SQLITE_OK) {
NSLog(@"数据库打开成功");
}else{
NSLog(@"数据库打开失败");
}
}
2. 执行SQL语句
2.1 无返回值SQL
SQLite的C语言函数:
// 执行没有返回值的SQL语句
int sqlite3_exec(
sqlite3 *db, /* 数据库句柄 */
const char *sql, /* SQL语句(UTF-8) */
int (*callback)(void *, int, char **, char **), /* 回调的C函数指针 */
void *arg, /* 回调函数的第一个参数 */
char **errmsg, /* 返回的错误信息 */
);
Objective-C实例:
// 适用于建表、更新、插入和删除操作
- (void)executeNonQuery:(NSString *)sql{
if (!database) {
return;
}
char *error;
int result = sqlite3_exec(database, sql.UTF8String, NULL, NULL, &error);
if (result == SQLITE_OK) {
NSLog(@"SQL语句执行成功");
}else{
NSLog(@"SQL语句执行过程中发生错误: %s", error);
}
}
2.2 有返回值SQL
SQLite的C语言函数:
// 检查SQL语句的合法性(查询前的准备)
int sqlite3_prepare_V2(
sqlite3 *db, /* 数据库句柄 */
const char *zSql, /* SQL语句(UTF-8) */
int nByte, /* SQL语句最大长度,-1表示SQL支持的最大长度 */
sqlite3_stmt **ppStmt, /* 返回的查询结果 */
const char **pzTail /* 返回的失败信息 */
);
// 查询一行数据
int sqlite3_step(sqlite3_stmt *); /* 如果查到一行数据,就会返回SQLITE_ROW */
// 获取当前定位记录的字段名称数目
int sqlite3_column_count(sqlite3_stmt *stmt);
// 获取当前定位记录的第几个字段名称
const char *sqlite3_column_name(sqlite3_stmt *stmt, int iCol);
// 利用`stmt获得某一字段的值`
/** 获取二进制数据 */
const void * sqlite3_column_blob(sqlite3_stmt *stmt, int iCol);
/** 获取浮点型数据 */
double sqlite3_column_double(sqlite3_stmt *stmt, int iCol);
/** 获取整型数据 */
int sqlite3_column_int(sqlite3_stmt *stmt, int iCol);
/** 获取文本数据 */
const unsigned char * sqlite3_column_text(sqlite3_stmt *stmt, int iCol);
Objective-C实例:
// 执行有返回值的SQL语句
- (NSArray *)executeQuery:(NSString *)sql{
if (!database) {
return nil;
}
NSMutableArray *arr = [NSMutableArray array];
sqlite3_stmt *stmt; // 保存查询结果
int result = sqlite3_prepare_V2(database, sql.UTF8String, -1, &stmt, NULL);
if (result == SQLITE_OK) {
while (SQLITE_ROW == sqlite_step(stmt)){
int columnCount = sqlite3_step(stmt);
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
for (int i = 0; i < columnCount; i ++){
// 获取第i列的字段名称
const char *name = sqlite3_column_name(stmt, i);
// 获取第i列的字段值
const unsigned char *value = sqlite3_column_text(stmt, i);
// 保存进字典
NSString *nameStr = [NSString stringWithUTF8String:name];
NSString *valueStr = [NSString stringWithUTF8String:(const char *)value];
dict[nameStr] = valueStr;
}
[array addObject:dict];
}
sqlite3_finalize(stmt);// 释放伴随指针
return array;
}
return nil;
}
3. 关闭数据库
SQLite的C语言函数:
// 关闭数据库
int sqlite3_close(sqlite3 *db);
Objective-C实例:
- (void)closeDatabase{
if (!database){
return;
}
int result = sqlite3_close(database);
if (result == SQLITE_OK) {
database = nil;
NSLog(@"数据库关闭成功");
}else{
NSLog(@"数据库关闭失败");
}
}
补充
- Xcode中导入libsqlite3.tbd
- 头文件中引入sqlite3.h