【问题标题】:Sync data with ios swift local Database and server与 ios swift 本地数据库和服务器同步数据
【发布时间】:2017-04-21 18:21:55
【问题描述】:

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

我可以构建从服务器读取和写入数据的 API。 我可以从发出 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

我怎样才能快速实现这一点,如果可能,请发布示例项目。

【问题讨论】:

  • 您会将这些数据行作为 JSON 格式的项目数组发送吗?
  • 我没有理由这样做或不这样做。

标签: ios swift sqlite


【解决方案1】:

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

分离项目的层我推荐 VIPER、Clean swift 或 ReSwift 架构。

之后,您最好的朋友将成为交互者(ReSwift 中的 Thunk),您将在那里导航 API 和数据库管理器。

示例:

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

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

当然,没有简单的解决方案更多关于这个主题 https://en.wikipedia.org/wiki/Eventual_consistency

【讨论】:

  • 我问的更像是一种标准/简单的方法。就像我之前认为它会被多次完成一样,并且有某种标准示例,顺便说一下我不需要 SQLLite
【解决方案2】:

您可以使用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

希望对你有帮助!

【讨论】:

  • 如果您在 podfile 中 use_frameworks!,则不需要导入桥接头。然后只需import FMDB
  • 其实SQLITE不是必需品 我在看你的建议。
【解决方案3】:

你可以看看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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 2011-04-25
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多