iOS中的SQLite与Android中的一模一样,仅仅是调用方法有差异。假设单从调用来讲,Android封装的一套helper更好用一些,而iOS原生的用C语言的几个函数在操作,比較麻烦。只是引入第三方框架FMDB,使用起来就方便非常多。
一、SQLite的基本使用
使用步骤:
1. 导入系统框架 (C 语言 ) . (libsqlite3)
2. 头文件 #import< sqlite3.h >.
3 . sqlite3_open (fileName.UTF8String, & _ db ); 打开或者创建一个数据
*_db 自定义一个 sqlite3 的成员变量 . 进行正删改查时要用 .
4. sqlite3_exec (_db, sql, NULL, NULL,&error);
* 该函数可进行 insert , delete , update 操作 .
5 . 查询操作 select .
* sqlite3_prepare_v2 (_db, sql, -1, &stmt, NULL); 做查询前准备 , 检測 SQL 语句是否正确 .
* sqlite3_step(stmt) 提取查询到的数据 , 一次提取一条 .
* sqlite3_column_text(stmt, 0) 取出第 0 列的数据 .
直接看代码更易懂:
创建或打开数据库:
// 0.获取文件地址 NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]; NSString *fileName = [path stringByAppendingPathComponent:@"t_student.sqlite"]; // 1.打开或者创建一个数据库 // (1.假设数据库不存在就会自己主动创建数据库并打开, 2.假设数据库存储就会自己主动打开数据库) int result = sqlite3_open(fileName.UTF8String, &_db); if (result == SQLITE_OK) { NSLog(@"打开数据库成功"); // 2.创建表 /** sqlite3 传递已经打开的数据库 sql: 须要运行的数据库语句 */ const char *sql = "CREATE TABLE IF NOT EXISTS t_student(id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER NOT NULL);"; char *error = nil; // 在db数据库中运行sql语句 sqlite3_exec(self.db, sql, NULL, NULL, &error); if (error) { NSLog(@"创建表失败"); }else { NSLog(@"创建表成功"); } }else { NSLog(@"打开数据库失败"); }插入数据:(更新,删除与此类似)
// 1.拼接插入sql语句 NSString *name = [NSString stringWithFormat:@"Jonathan-%d", i]; int age = arc4random_uniform(100); NSString *sql = [NSString stringWithFormat:@"INSERT INTO t_student(name, age) VALUES ('%@', %d);", name, age]; char *error = nil; // 2.运行插入sql语句 sqlite3_exec(self.db, sql.UTF8String, NULL, NULL, &error); if (error) { NSLog(@"加入失败"); }else { NSLog(@"加入成功"); }查询数据:
const char *sql = "SELECT name, age FROM t_student;";// char *error = nil;// sqlite3_exec(self.db, sql, NULL, NULL, &error); sqlite3_stmt *stmt; // 用于提取数据的 // 1.做查询前的准备, 检查sql语句是否正确 int result = sqlite3_prepare_v2(self.db, sql, -1, &stmt, NULL); if (result == SQLITE_OK) {// 准备完毕, 没有错误 // 2.提取查询到的数据到stmt, 一次提取一条 // 假设返回值为SQLITE_ROW, 就代表提取到了一条记录 while(sqlite3_step(stmt) == SQLITE_ROW) { // 3.取出提取到的记录(数据)中的第0列的数据 const unsigned char *name = sqlite3_column_text(stmt, 0); int age = sqlite3_column_int(stmt, 1); NSLog(@"%s %d", name, age); } }二、FMDB的使用
FMDB的优点是对基本C库的封装,方便使用。同一时候还提供了多线程操作数据库带来的读脏数据等问题的方法。
框架地址:
使用:(须要 FMDatabase *db 成员变量 )
创建或打开:
// 0.获取沙盒路径 NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject]; NSString *fileName = [path stringByAppendingPathComponent:@"t_student.sqlite"]; // 1.获得数据库对象 self.db = [FMDatabase databaseWithPath:fileName]; // 2.打开数据库 if ([self.db open]) { NSLog(@"打开成功"); // 2.1创建表 BOOL success = [self.db executeUpdate:@"CREATE TABLE IF NOT EXISTS t_student (id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, name TEXT NOT NULL, age INTEGER NOT NULL);"]; if (success) { NSLog(@"创建表成功"); }else { NSLog(@"创建表失败"); } }else { NSLog(@"打开失败"); }插入操作: (更新,删除与此类似)
BOOL success = [self.db executeUpdate:@"INSERT INTO t_student(name , age) VALUES(?, ?);", @"xuneng", @(10)];// 注意仅仅能拼接对象类型 if (success) { NSLog(@"加入成功"); }else { NSLog(@"加入失败"); }查询:
// 1.查询 FMResultSet *set = [self.db executeQuery:@"SELECT * FROM t_student;"]; // 2.取出数据 while ([set next]) { // 取出姓名// NSString *name = [set stringForColumnIndex:1]; // 取出年龄// int age = [set intForColumnIndex:2]; NSString *name = [set stringForColumn:@"name"]; int age = [set intForColumn:@"age"]; NSLog(@"name = %@, age = %d", name, age); }FMDB还能定义操作队列 FMDatabaseQueue ,这个队列是线程安全的。( FMDatabase不是线程安全的 )
同一时候还能开启 事物 、提交事物。使用相当方便。
可參照上进行学习,写的相当具体。
转载请注明出处: