博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
FMDB的使用
阅读量:4077 次
发布时间:2019-05-25

本文共 3154 字,大约阅读时间需要 10 分钟。

#import <Foundation/Foundation.h>
#import "Student.h"
@interface StudentManager : NSObject
+ (instancetype)sharedManager;
- (BOOL)add:(Student *)student;
- (BOOL)delete:(Student *)student;
- (BOOL)update:(Student *)student;
- (NSMutableArray *)selectAll;

@end

#import "StudentManager.h"

#import "FMDatabase.h"
@implementation StudentManager
{
    FMDatabase *_dataBase; // FMDB对象,这个对象负责数据库操作,它关联了我们的数据库文件
}
+ (instancetype)sharedManager {
    static StudentManager *manager = nil;
    @synchronized(self) {
        if (manager == nil) {
            manager = [[StudentManager alloc] init];
        }
    }
    return manager;
}
- (id)init {
    if (self = [super init]) {
        // 配置数据库
        // 1. 获取沙盒路径,因为数据库文件要存储在沙盒中
        NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; // 找到沙盒下面的Docuemnts文件夹路径,相当于 [NSHomeDirectory() stringByAppendingPathComponents:@"Document"]
        
        // 2. 在沙盒中指定数据库文件路径
        NSString *dbPath = [documentPath stringByAppendingPathComponent:@"DBDemo.db"];
        
        // 3. 新建FMDB对象并调用initWithPath关联数据库文件
        _dataBase = [[FMDatabase alloc] initWithPath:dbPath];
        
        // 4.  打开数据库创建表格
        // 打开数据库文件,如果这个文件(dbPath)原来是存在的, 则直接打开,不会破坏原来的内容
        // 如果不存在,则自动创建一个空的数据库文件
        if ([_dataBase open]) {
             NSString *sql = @"create table if not exists student(id varchar(128), name text, age integer, headImage blob)"; // blob:存放二进制,data
            if ([_dataBase executeUpdate:sql]) {
                NSLog(@"成功创建表格 student");
            }
        }
        [_dataBase close];
    }
    return self;
}
- (BOOL)add:(Student *)student {
    if (![_dataBase open]) {
        return NO;
    }
    NSString *sql = @"insert into student values(?,?,?,?)"; // ?占位,?表示的对象要等下填充,特别注意,在FMDB里面,要用对象填充,所以如果要填充整型,就必湏用包装器NSNumber包装成对象
    
    // 执行sql语句
    BOOL success = [_dataBase executeUpdate:sql, student.id, student.name, [NSNumber numberWithInt:student.age], UIImageJPEGRepresentation(student.headImage, 1.0)];
    if (success) {
        NSLog(@"成功插入一条数据");
    }
    [_dataBase close];
    return success;
}
- (BOOL)delete:(Student *)student {
    return [self deleteById:student.id];
}
- (BOOL)deleteById:(NSString *)studentId {
    if ([_dataBase open] == NO) {
        return NO;
    }
    NSString *sql = @"delete from student where id=?";
    BOOL success = [_dataBase executeUpdate:sql, studentId];
    [_dataBase close];
    return success;
}
- (BOOL)update:(Student *)student {
    // 根据id更新
    if ([_dataBase open] == NO) {
        return NO;
    }
    NSString *sql = @"update student set name=?, age=?, headImage=? where id=?";
    BOOL success = [_dataBase executeUpdate:sql, student.name, [NSNumber numberWithInt:student.age], UIImageJPEGRepresentation(student.headImage, 1.0), student.id];
    [_dataBase close];
    return success;
}
- (NSMutableArray *)selectAll {
    if ([_dataBase open] == NO) {
        return nil;
    }
    NSString *sql = @"select * from student";
    FMResultSet *set = [_dataBase executeQuery:sql];
    NSMutableArray *array = [NSMutableArray array];
    while ([set next]) {
        Student *student = [[Student alloc] init];
        // [set stringForColumn:@"xxx"] 根据域名xxx取相应的数据
        student.id   = [set stringForColumn:@"id"];
        student.name = [set stringForColumn:@"name"];
        student.age  = [set intForColumn:@"age"];
        // [set intForColumnIndex:3];
        student.headImage = [UIImage imageWithData:[set dataForColumn:@"headImage"]];
        [array addObject:student];
    }
    [_dataBase close];
    return array;
}
@end

转载地址:http://gcsni.baihongyu.com/

你可能感兴趣的文章
[LeetCode By Python]121. Best Time to Buy and Sell Stock
查看>>
Android2.1消息应用(Messaging)源码学习笔记
查看>>
剑指offer算法题分析与整理(三)
查看>>
JVM并发机制探讨—内存模型、内存可见性和指令重排序
查看>>
nginx+tomcat+memcached (msm)实现 session同步复制
查看>>
WAV文件解析
查看>>
WPF中PATH使用AI导出SVG的方法
查看>>
QT打开项目提示no valid settings file could be found
查看>>
java LinkedList与ArrayList迭代器遍历和for遍历对比
查看>>
drat中构造方法
查看>>
coursesa课程 Python 3 programming 统计文件有多少单词
查看>>
多线程使用随机函数需要注意的一点
查看>>
getpeername,getsockname
查看>>
所谓的进步和提升,就是完成认知升级
查看>>
如何用好碎片化时间,让思维更有效率?
查看>>
No.182 - LeetCode1325 - C指针的魅力
查看>>
Encoding Schemes
查看>>
带WiringPi库的交叉笔译如何处理二之软链接概念
查看>>
Java8 HashMap集合解析
查看>>
自定义 select 下拉框 多选插件
查看>>