您的位置:首页 > 编程语言 > Go语言

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];

}

+ (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进行了封装,封
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: