//在官方文档中看到这样的一句话 学习学习
Using a single instance of FMDatabase from multiple threads at once is a bad idea
这句话的意思是:使用单利创建的FMDatabase 在多线程中使用是一个不好的选择或者说意见
最后他说了不要在多线程中使用FMDatabase
So don't instantiate a single FMDatabase object and use it across multiple threads.
那么我们应该使用什么区处理一些线程安全的操作数据库呢?
Instead, use FMDatabaseQueue. Instantiate a single FMDatabaseQueue and use it across multiple threads. The FMDatabaseQueue object will synchronize and coordinate access across the multiple threads.
相反使用 FMDatabaseQueue 初始化创建一个 FMDatabaseQueue 并且跨线程在多个想成中使用,FMDatabaseQueue 将同步协调 多个线程的访问;
//最后一句我删掉了 说是 👇看看如何使用FMDatabaseQueue
创建一个 FMDatabaseQueue 对象的方法
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:aPath];
//使用方法是这样的
[queue inDatabase:^(FMDatabase *db) {
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @1];
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @2];
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @3];
FMResultSet *rs = [db executeQuery:@"select * from foo"];
while ([rs next]) {
}
}];
还有下面的一种操作方法 如果发生错误就会停止操作,并让已经操作的数据回滚到原值
还有下面的一种操作方法 如果发生错误就会停止操作,并让已经操作的数据回滚到原值
[queue inTransaction:^(FMDatabase *db, BOOL *rollback) {
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @1];
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @2];
[db executeUpdate:@"INSERT INTO myTable VALUES (?)", @3];
//如果出现什么不愉快的事情 将 回滚 (rollback) 指针 设置为 YES 就可以
if (whoopsSomethingWrongHappened) {
*rollback = YES;
return;
}
// etc ...
}];
sql:select * from tablename order by filename1 desc;
解释:上面语句的意思就是根据”filename1字段“排序,倒叙输出tablename表中的数据。 备注:asc是表示升序,desc表示降序。
网友评论