基本步骤 1. 打开数据库。
利用sqlite3_open()打开数据库会指定一个数据库文件保存路径,如果文件存在则直接打开,否则创建并打开。打开数据库会得到一个sqlite3类型对象,后面需要借助这个对象进行其他操作。2.执行SQL语句
无返回值语句:直接通过sqlite3_exec()函数执行(例如增、删、改)有返回值语句:①语法检测:sqlite3_prepare_v2()。②取数据:sqlite3_step()。③获取数据:sqlite3_column_类型()。如此反复循环直到遍历完成。3.关闭数据库
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(@"数据库打开失败"); } }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); } }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; }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(@"数据库关闭失败"); } }