使用ios swift本地数据库和服务器同步数据

时间:2017-04-21 18:21:55

标签: ios swift sqlite

我正在尝试构建一个使用SQLITE并将其同步到我的PHP后端服务器的iOS swift应用程序。

我可以构建从服务器读取和写入数据的API。 我可以使用swift从发出HTTP请求的服务器读取和写入数据。

我在这里要完成的是:将数据保存到本地数据库并将其同步到服务器数据库,本地数据库是用户特定的,服务器数据库包含所有用户数据。

本地数据库

--------------------------
| maint item | due date | 
| abc        | 29-3-2018
| DNA        | 24-1-2017
| boy        | 17-2-2017
--------------------------

服务器数据库

---------------------------
| Maine item | due date | user 
| abc        | 29-3-2018| Jane 
| DNA        | 24-1-2017| Jane
| boy        | 17-2-2017| Jane
| amc        | 22-7-2017| cameleon

如何在swift中实现这一点,如果可能的话,请发布示例项目。

3 个答案:

答案 0 :(得分:1)

有很多场景,但我推荐这个:

将项目的各个层分开,我建议使用VIPER,Clean swift或ReSwift架构。

之后,你最好的朋友将是Interactor(ReSwift中的Thunk),在那里你将导航API和数据库管理员。

示例:

如果我有互联网,请从API检查下载信息如果本地数据库中有类似的对象并提供新的对象。如果本地是新的更新API(或不.. :))。

如果我没有互联网显示本地并更新日期,如果本地更改...

当然,没有简单的解决方案可以解决这个问题 https://en.wikipedia.org/wiki/Eventual_consistency

答案 1 :(得分:0)

您可以使用FMDB来处理SQLite,只需将其添加到您的podfile:

pod "FMDB"

然后安装:

pod install

并将其导入您的桥接标题:

#import <FMDB/FMDB.h>

文档在Objective-C中,但在swift中很容易翻译。例如:

import FMDB

let path = NSSearchPathForDirectoriesInDomains(.libraryDirectory, .userDomainMask, true)[0] + "/database.db"
let db = FMDatabase(path: path)
guard db.open() else {
            log.error("Unable to open database")
            return
}
db.executeStatements("CREATE TABLE ...")

关于同步过程,它不是那么简单,因为你必须处理冲突,唯一ID等。

如果不要求SQLite,请查看CouchDBSyncDB

我希望这会对你有所帮助!

答案 2 :(得分:0)

您可以查看http://github.com/groue/GRDB.swift

它是一个Swift SQLite库,附带了用于同步JSON文档和数据库表的示例代码:https://github.com/groue/GRDB.swift/blob/master/Playgrounds/JSONSynchronization.playground/Contents.swift

此演示操场的输出如下。您可以看到它的algorithm非常高效,并且只对数据库应用了最少量的更改:

-- Initial import {
--   "persons": [{
--     "id": 1,
--     "name": "Arthur"
--   }, {
--     "id": 2,
--     "name": "Barbara"
--   }, {
--     "id": 3,
--     "name": "Craig"
--   }, ]
-- }
SELECT * FROM persons ORDER BY id
INSERT INTO "persons" ("id", "name") VALUES (1,'Arthur')
INSERT INTO "persons" ("id", "name") VALUES (2,'Barbara')
INSERT INTO "persons" ("id", "name") VALUES (3,'Craig')

-- Import {
--   "persons": [{
--     "id": 2,
--     "name": "Barbie" (name is modified)
--   }, {
--     "id": 3,
--     "name": "Craig"  (not modified)
--   }, {
--     "id": 4,
--     "name": "Daniel" (new person)
--   }, ]
-- }    
SELECT * FROM persons ORDER BY id
DELETE FROM "persons" WHERE "id"=1
UPDATE "persons" SET "name"='Barbie' WHERE "id"=2
INSERT INTO "persons" ("id", "name") VALUES (4,'Daniel')