使用iOS Swift本地数据库和服务器同步数据

3

我正在尝试构建一个使用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中实现这个功能?如果可能的话,请提供示例项目。

你会将这些行数据作为JSON格式的项目数组发送吗? - Paramasivan Samuttiram
我对于做或不做那件事情没有理由。 - Sameh
3个回答

1
有很多情景,但我建议使用以下方案:
将项目分层,我推荐使用VIPER、Clean Swift或ReSwift架构。
之后你最好的朋友就是Interactor(在ReSwift中为Thunk),在那里你将导航API和数据库管理器。
例如:
如果我有互联网,从API下载信息,检查本地数据库中是否有类似的对象并呈现新的对象。如果本地是新的,则更新API(或不更新... :))。
如果我没有互联网,则显示本地内容并在本地更改时更新日期...
当然,这并不是一个简单的解决方案,关于此主题还有更多内容请参考https://en.wikipedia.org/wiki/Eventual_consistency

2
我更想了解一种标准/简单的方法。我认为这已经做过多次,有某种标准示例。顺便说一下,我不需要SQLLite。 - Sameh

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 ...")

关于同步过程,它并不是那么简单,因为你必须处理冲突、唯一标识等问题。
如果SQLite不是必需的,请看一下CouchDBSyncDB
希望这能帮到你!

如果您在Podfile中使用use_frameworks!,则不需要导入桥接头文件。然后只需导入FMDB即可。 - A. Barone
实际上,SQLITE 不是必需的,我正在查看您的建议。 - Sameh

0
您可以查看http://github.com/groue/GRDB.swift
这是一个Swift SQLite库,附带有示例代码,用于同步JSON文档和数据库表:https://github.com/groue/GRDB.swift/blob/master/Playgrounds/JSONSynchronization.playground/Contents.swift 此演示Playground的输出如下。您可以看到其算法非常高效,并且仅对数据库应用了最少量的更改:
-- 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')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接