初学者思路干货:
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进行了封装,封