本文调研了10余种客户端数据库方案。用于在 Flutter
中支持离线优先的数据库。
背景
之前用rxdb做了一个简单的web应用。应用数据存在在浏览器端,可以通过在服务器上面couchdb服务来进行数据同步。最近想要把这个web应用从purescript架构重构为flutter架构。但是flutter是不支持rxdb的,所以需要找一个类似的解决方案,在 flutter 框架下支持android、macos。需要的特性有:
- 支持android、macos,最好也支持ios,web,windows
- 支持离线优先、无感切换,当无网络的时候使用存储在客户端的数据库,网络恢复时自动把数据同步到服务端。
- 支持flutter的sdk
- 最好可以不需要自己搭建服务器
方案
Firestore
google自己的产品,是一个no-sql数据库 ### 优点
- 不需要自己维护服务器
- 可以配合firebase其它的服务,例如认证服务
- 上面几个要求都能满足
缺点
- 服务商绑定,上了google的船
- google服务在国内用不了
Parse
著名的firebase开源替代品,可惜暂时还不支持离线优先。如果不考虑离线的话,的确是一个很棒的bass(Backas a service)。
Appwrite
另外一个开源bass应用,看到在issue中有考虑离线优先,但是还未实现
Space Cloud
另外一个bass,也是不支持离线优先
Kuzzle
另外的bass,依旧不支持离线优先
supabase
在考虑,还未支持
SapphireDB
支持离线优先,但是只支持js sdk
sporran
flutter的一个库,但是只支持web平台
Couchdb+Wilt
基于网络api的,不支持离线
brickk offline first
适合于查询 支持android和ios两个平台,仅支持查询缓存。
Couchbase
在flutter中有两个库可以提供支持,不是官方的支撑,还不太成熟需要一个同步网关,自建后端
Realm
realm目前在前端平台的支持很广,同时也可以使用Mongodb Realm Sync作为同步服务器。不过可惜的是,flutter 还处于alpha版本(截止2021年)
结论
除去自己动手同步sqlite之外现成的方案只有Realm,couchbase,firestore三种了,firestore因为网络问题可以先不用,couchbase后期的维护不太可靠,只能把希望寄托于realm和mongodb了。先暂时使用realm做重构,试用一段时间再来写试用报告吧。