FMDB&EGODatabase(数据持久化)
2015-11-30 17:25
597 查看
初学者思路干货:
FMDB不支持多线程同时使用同一个数据库连接进行操作,否则会有线程安全问题,有可能导致数据库文件损坏。
EGODatabase则引入了多线程的支持,部分代码借鉴了FMDB,两者在使用上非常的相似。
另EGODatabase提供了异步数据库操作的支持,将数据库操作封装成数据库请求(其继承于NSOperation),数据库请求创建好了,丢到一个OperationQueue中被异步的进行执行,当请求数据完成之后 ,相应的delegate方法会被调用,然后你可以在主线程更新显示了.
+ (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进行了封装,封
FMDB不支持多线程同时使用同一个数据库连接进行操作,否则会有线程安全问题,有可能导致数据库文件损坏。
EGODatabase则引入了多线程的支持,部分代码借鉴了FMDB,两者在使用上非常的相似。
另EGODatabase提供了异步数据库操作的支持,将数据库操作封装成数据库请求(其继承于NSOperation),数据库请求创建好了,丢到一个OperationQueue中被异步的进行执行,当请求数据完成之后 ,相应的delegate方法会被调用,然后你可以在主线程更新显示了.
+ (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];
}
+ (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进行了封装,封
相关文章推荐
- django1.6.11配置静态文件
- Golang学习摘录(二)
- 民意调查Django实现(二)
- django数据源操作(多数据源,导入导出等)
- Go-简洁的并发
- 单纯形算法求解线性规划问题(依据《算法导论》实现)
- The good site to buy rs 2007 gold cheap on RSorder with pay by Paypal or Alipay without anyconfirmat
- Django model各个字段类型
- 不错的Django技术网址
- django使用通用视图 django.views.generic
- 善用GOOGLE -- 从入门到精通
- HDU 4267 A Simple Problem with Integers
- 《Going Deeper With Convolution》学习笔记
- 基于go语言的消息推送系统架构分析
- 基于go语言的消息推送系统架构分析
- 前向-后向算法(Forward-backward algorithm)
- API To Import Negotiations(转)
- Django-数据模型
- GO比较容易混淆的地方
- 如何用好Google、百度等搜索引擎