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不是线程安全的 )
同时还能开启
事物
、提交事物。使用相当方便。
可参照https://github.com/ccgus/fmdb上进行学习,写的相当详细。