本帖最后由 竹林风 于 2018-12-14 11:46 编辑
介绍
FMDB是iOS平台的SQLite数据库框架
FMDB以OC的方式封装了SQLite的C语言API
优点
- 使用起来更加面向对象,省去了很多麻烦,冗余的C语言代码
- 对比苹果自带的Core Data框架,更加轻量级和灵活
- 提供了多线程安全的数据库操作方法,有效的防止数据混乱
下载地址
https://github.com/ccgus/fmdb
FMDB核心类
1.FMDatabase (一个FMDatabase对象就代表一个单独的SQLite数据库 用来执行SQL语句)
2.FMResultSet (使用FMDatabase执行查询后的结果集)
3.FMDatabaseQueue (用于在多线程中执行多个查询或更新,它是线程安全的)
使用
这里我用原生写的Demo进行改造
1.打开或创建数据库
[Objective-C] 纯文本查看 复制代码 - (void)openSqlite{
//1.打开数据库(如果指定的数据库文件存在就直接打开,不存在就创建一个新的数据文件)
//参数1:需要打开的数据库文件路径(iOS中一般将数据库文件放到沙盒目录下的Documents下)
NSString *nsPath = [NSString stringWithFormat:@"%@/Documents/Person.db", NSHomeDirectory()];
// const char *path = [nsPath UTF8String];
NSLog(@"sqlite path == %@",nsPath);
//参数2:指向数据库变量的指针的地址
//返回值:数据库操作结果
//2.获得数据库
FMDatabase *dbs=[FMDatabase databaseWithPath:nsPath];
//判断执行结果
if ([dbs open]) {
NSLog(@"打开数据库成功");
}else{
NSLog(@"打开数据库失败");
}
if (!db) {
db = dbs;
}
if (![self isExistTable:@"student"]) {
[self creatTable];
}
}
2.创建表
[Objective-C] 纯文本查看 复制代码 /**
判断一张表是否已经存在
@param tablename 表名
*/
- (BOOL)isExistTable:(NSString *)tablename{
NSString *sql = [NSString stringWithFormat:@"SELECT COUNT(*) FROM sqlite_master where type= 'table' and name= '%@';",tablename];
FMResultSet *rs = [db executeQuery:sql];
// BOOL result = [db executeQuery:sql];
while ([rs next]) {
NSInteger count = [rs intForColumnIndex:0];
if (count == 0) {
return NO;
}else {
return YES;
}
}
return NO;
}
- (void)creatTable{
//1.设计创建表的sql语句
NSString * sql = @"CREATE TABLE IF NOT EXISTS student(ID INTEGER PRIMARY KEY AUTOINCREMENT, num integer,name 'text', 'sex' 'text','age' integer);";
BOOL result = [db executeUpdate:sql];
// int ret = sqlite3_exec(db, sql, NULL, NULL, NULL);
//3.判断执行结果
if (result) {
NSLog(@"创建表成功");
}else{
NSLog(@"创建表失败");
}
}
3.添加一条数据
[Objective-C] 纯文本查看 复制代码 //添加数据
- (void)addStudent:(Student *)stu {
//操作之前先打开数据库
if (![db open]) {
[self openSqlite];
}
//1.准备sqlite语句
NSString *sqlite = [NSString stringWithFormat:@"insert into student(num,name,age,sex) values (%@,'%@','%@','%@')",@(stu.num),stu.name,@(stu.age),stu.sex];
//2.执行sqlite语句
// char *error = NULL;//执行sqlite语句失败的时候,会把失败的原因存储到里面
BOOL result = [db executeUpdate:sqlite];
if (result) {
NSLog(@"添加数据成功");
} else {
NSLog(@"添加数据失败");
}
// 结束之后要记得关闭: 这一点很重要
[self closeSqlite];
}
4.更新一条数据
[Objective-C] 纯文本查看 复制代码 //修改数据
- (void)updataWithStu:(Student *)stu {
//操作之前先打开数据库
if ([db open]) {
//1.sqlite语句
NSString *sqlite = [NSString stringWithFormat:@"update student set name = '%@',sex = '%@',age = '%ld' where num = '%ld'",stu.name,stu.sex,stu.age,stu.num];
//2.执行sqlite语句
BOOL result = [db executeUpdate:sqlite];
if (result) {
NSLog(@"修改数据成功");
} else {
NSLog(@"修改数据失败");
}
// 结束之后要记得关闭: 这一点很重要
[self closeSqlite];
}
}
5.删除一条数据
[Objective-C] 纯文本查看 复制代码 //删除数据
- (void)delete:(Student*)stu {
//操作之前先打开数据库
if (![db open]) {
[self openSqlite];
}
//1.准备sqlite语句
NSString *sqlite = [NSString stringWithFormat:@"delete from student where num = '%ld'",stu.num];
//2.执行sqlite语句
BOOL result = [db executeUpdate:sqlite];
if (result) {
NSLog(@"删除数据成功");
} else {
NSLog(@"删除数据失败");
}
// 结束之后要记得关闭: 这一点很重要
[self closeSqlite];
}
6.查询数据
[Objective-C] 纯文本查看 复制代码 //查询所有数据
- (NSMutableArray*)selecAllStudent {
if (![db open]) {
[self openSqlite];
}
NSMutableArray *array = [[NSMutableArray alloc] init];
FMResultSet *rs = [db executeQuery:@"select * from student"];
// 遍历结果集
while ([rs next]) {
Student *stu = [[Student alloc] init];
stu.num = [rs intForColumn:@"num"];
stu.name = [rs stringForColumn:@"name"];
stu.age = [rs intForColumn:@"age"];
stu.sex = [rs stringForColumn:@"sex"];
[array addObject:stu];
}
[rs close];
[self closeSqlite];
return array;
}
7.关闭数据库
[Objective-C] 纯文本查看 复制代码 #pragma mark - 4.关闭数据库
- (void)closeSqlite {
BOOL result = [db close];
if (result) {
NSLog(@"数据库关闭成功");
} else {
NSLog(@"数据库关闭失败");
}
}
效果还是和Demo 的一样。
附件:
Test-FMDB.zip
(255.99 KB, 下载次数: 3)
|