FMDB&EGODatabase(数据持久化)

初学者思路干货:

 

FMDB不支持多线程同时使用同一个数据库连接进行操作,否则会有线程安全问题,有可能导致数据库文件损坏。

EGODatabase则引入了多线程的支持,部分代码借鉴了FMDB,两者在使用上非常的相似。

另EGODatabase提供了异步数据库操作的支持,将数据库操作封装成数据库请求(其继承于NSOperation),数据库请求创建好了,丢到一个OperationQueue中被异步的进行执行,当请求数据完成之后 ,相应的delegate方法会被调用,然后你可以在主线程更新显示了.

 

  1. + (void)addUser:(UserModel *)user {
  2.      
  3.     //用数据库文件构造数据库操作对象 
  4.     EGODatabase *dataBase = [[EGODatabase alloc] initWithPath:DataBaseFilePath]; 
  5.      
  6.     //1.打开数据库 
  7.     [dataBase open]; 
  8.      
  9.     //2.操作数据库中的表 
  10.     NSString *sql = @"INSERT INTO t_user(userID,userName,userAge) VALUES(?,?,?)"
  11.      
  12.     NSArray *params = @[user.userId,user.userName,@(user.userAge)]; 
  13.      
  14.     //同步添加数据到t_user表中 
  15.     [dataBase executeUpdate:sql parameters:params]; 
  16.      
  17.     //3.关闭数据库 
  18.     [dataBase close]; 
  19.      
  20.  
  21. //异步查询 
  22. + (void)findUser:(void (^)(NSArray *))completionBlock { 
  23.      
  24.     EGODatabase *dataBase = [[EGODatabase alloc] initWithPath:DataBaseFilePath]; 
  25.      
  26.     [dataBase open]; 
  27.      
  28.     NSString *sql = @"SELECT * from t_user"
  29.      
  30.     //异步查询 
  31.     EGODatabaseRequest *request = [dataBase requestWithQuery:sql]; 
  32.      
  33.     [request setCompletion:^(EGODatabaseRequest *request, EGODatabaseResult *result, NSError *error) { 
  34.          
  35.         //查询成功后回调的block 
  36.          
  37.         NSMutableArray *userArray = [NSMutableArray array]; 
  38.          
  39.         for (int i = 0; i<result.count; i++) { 
  40.              
  41.             //获取当前这一条数据 
  42.             EGODatabaseRow *row = result.rows[i]; 
  43.              
  44.             //创建Model 
  45.             UserModel *user = [[UserModel alloc] init]; 
  46.              
  47.             //获取到当前数据的每个字段的值 
  48.             user.userId = [row stringForColumn:@"userID"]; 
  49.             user.userName = [row stringForColumnAtIndex:1]; 
  50.             user.userAge = [row intForColumnAtIndex:2]; 
  51.              
  52.             [userArray addObject:user]; 
  53.              
  54.              
  55.         } 
  56.          
  57.         //回调传入的block 
  58.         completionBlock(userArray); 
  59.          
  60.     }]; 
  61.      
  62.      
  63.     //创建线程队列,将线程对象加入到队列中执行 
  64.     NSOperationQueue *queue = [[NSOperationQueue alloc] init]; 
  65.     [queue addOperation:request]; 
  66.      
  67.      
  68.     //关闭数据库 
  69.     [dataBase close]; 
  70.  
  71.      
+ (void)addUser:(UserModel *)user {
    
    //用数据库文件构造数据库操作对象
    EGODatabase *dataBase = [[EGODatabase alloc] initWithPath:DataBaseFilePath];
    
    //1.打开数据库
    [dataBase open];
    
    //2.操作数据库中的表
    NSString *sql = @"INSERT INTO t_user(userID,userName,userAge) VALUES(?,?,?)";
    
    NSArray *params = @[user.userId,user.userName,@(user.userAge)];
    
    //同步添加数据到t_user表中
    [dataBase executeUpdate:sql parameters:params];
    
    //3.关闭数据库
    [dataBase close];
    
}

//异步查询
+ (void)findUser:(void (^)(NSArray *))completionBlock {
    
    EGODatabase *dataBase = [[EGODatabase alloc] initWithPath:DataBaseFilePath];
    
    [dataBase open];
    
    NSString *sql = @"SELECT * from t_user";
    
    //异步查询
    EGODatabaseRequest *request = [dataBase requestWithQuery:sql];
    
    [request setCompletion:^(EGODatabaseRequest *request, EGODatabaseResult *result, NSError *error) {
        
        //查询成功后回调的block
        
        NSMutableArray *userArray = [NSMutableArray array];
        
        for (int i = 0; i<result.count; i++) {
            
            //获取当前这一条数据
            EGODatabaseRow *row = result.rows[i];
            
            //创建Model
            UserModel *user = [[UserModel alloc] init];
            
            //获取到当前数据的每个字段的值
            user.userId = [row stringForColumn:@"userID"];
            user.userName = [row stringForColumnAtIndex:1];
            user.userAge = [row intForColumnAtIndex:2];
            
            [userArray addObject:user];
            
            
        }
        
        //回调传入的block
        completionBlock(userArray);
        
    }];
    
    
    //创建线程队列,将线程对象加入到队列中执行
    NSOperationQueue *queue = [[NSOperationQueue alloc] init];
    [queue addOperation:request];
    
    
    //关闭数据库
    [dataBase close];

    
}

GeoDataBase实际的内部实现仍然是使用SQLite,只是对C语言的API进行了封装,封

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值