OC

Knowledge OS
登录 注册
全部话题 移民 创业 iOS Mac Objective-C Swift Android 招聘 求职

如何解决sqlite多线程安全问题

FoxBabe
FoxBabe 发布于 2013年09月04日
无人欣赏。

现在遇到一个问题,数据库是基于系统的sqlite写的,没有使用第三方库,项目现在处于维护阶段,需要优化。有个列表一次性会获取1000多条数据,每条数据都需要与本地的数据先比较下,如果没有则添加,如果有了就更新,如果标志为删除则删除。现在的做法是直接遍历这1000多条数据,分别进行操作,但是耗时比较大。考虑使用GCD的多线程处理,但是现在的数据库操作是非线程安全的,使用GCD就直接挂了,求解如何更好的处理?(因为处理维护阶段,不想替换为FMDB,工作量较大)或者如何是现在的数据库操作变为线程安全的?

共9条回复
楼长 ·
2楼 ·
灵感之源 回复于 2013年09月04日

把取回来到数据结合业务逻辑,让join成为可能,然后放到一个临时表,然后join现有的表,条件匹配exists就update,不能匹配就插入,如果标记删除就删除。

sqlite貌似没merge语句,所以你得写3个sql完整更新/插入和删除这3个操作

逐个记录做那是谋杀系统!我负责的数据库单表几十亿记录,每天更新1000万,如果我按照你这样做,我们的集群服务器无论多少台都要哭啊

3楼 ·
FoxBabe 回复于 2013年09月04日

@灵感之源 谢谢,现在正在尝试使用sqlite的批量操作,只需单独的做插入、删除、更新操作,和你的这个建议应该类似。初入门,对数据库这块人认识远远还不够,谢谢指导!

4楼 ·
vikiliu0310 回复于 2013年09月04日

哇,学习了~高手啊

5楼 ·
王中王 回复于 2013年09月04日

"如果没有则添加,如果有了就更新" 用 REPLACE INTO 就可以了吧

6楼 ·
灵感之源 回复于 2013年09月04日

SQLite现在有这个了?我当年弄SQLite的时候2.x貌似没这个

7楼 ·
anxonli 回复于 2013年09月04日

题外话,以后新项目还是考虑使用CoreData吧,NSManagedObjectContext支持GCD,很好用。

8楼 ·
Joey 回复于 2013年09月04日

最简单的方式就是使用FMDB

9楼 ·
FoxBabe 回复于 2013年09月04日

下个项目FMDB或CoreData常识用起来,要跟上节奏!

登录 或者 注册

AltStyle によって変換されたページ (->オリジナル) /