swift同步核心数据的数据和mysql数据库

时间:2016-03-03 14:04:33

标签: php ios mysql swift core-data

在我的swift 2应用程序中,用户可以将数据保存在核心数据中。 在未来,我想知道数据将保存在核心数据和MYSQL数据库中。

在核心数据和mysql之间同步数据的最佳方法是什么

我的想法是,在每个应用开始时,一个流程将开始:

  • 向php文件发出http post请求,该文件选择mysql数据库的所有数据并将结果返回给应用程序
  • 检查核心数据中存在哪些数据=>无事可做,哪些数据是新的=>将新数据保存在核心数据中

这是最好和最快的方法吗?

1 个答案:

答案 0 :(得分:2)

没有最快捷的方式,但我绝对可以建议一些对我有用的东西。最好与否 - 由您决定。

此外,您的问题非常通用 - 因为它包含移动应用的整个后端基础架构。我会尝试尽可能具体 -

1)对php文件发出http post请求,该文件选择mysql数据库的所有数据并将结果返回给应用程序 -

收到结果后,您可以在核心数据中解析它,如下例所示 -

    func writeDataToSqliteStore() throws {

                // Configure the Network Call here with NSURL & NSData returning an array that you can write to the Core Data SQLITE backend.
            do {
                jsonResponse = try NSJSONSerialization.JSONObjectWithData(data, options: NSJSONReadingOptions()) as? NSArray
            } catch {
                print(error)
            }
                let localEntity = self.insertNewEntity("EntityName") as? CoreDataEntityClass

                for singleObject in jsonResponse {

                    localEntity.name = singleObject.valueForKey("name")
                    localEntity.address = singleObject.valueForKey("address")
            }
  }

2)检查核心数据中存在哪些数据=>无事可做,哪些数据是新的=>将新数据保存在核心数据中 -

您可以使用时间戳进行良好的头部通话,并检查数据是否已更新。 如果数据已更新 - 更新单个Core Data属性可能会有点棘手。对我来说一直有用的是删除设备上的SQLITE后端并再次运行数据写入方法。 您可以使用以下示例 -

func removeSQLITEFiles() {
    let fileManager = NSFileManager.defaultManager()
        let URL1 = self.applicationDocumentsDirectory.URLByAppendingPathComponent("File.sqlite")
        let URL2 = self.applicationDocumentsDirectory.URLByAppendingPathComponent("File.sqlite-wal")
        let URL3 = self.applicationDocumentsDirectory.URLByAppendingPathComponent("File.sqlite-shm")

        if fileManager.fileExistsAtPath(URL1.path!) {
            do {
             try fileManager.removeItemAtURL(URL1)
            }
            catch {error}
        }

        if fileManager.fileExistsAtPath(URL2.path!) {
            do {
                try fileManager.removeItemAtURL(URL2)
            }
            catch {error}
        }

        if fileManager.fileExistsAtPath(URL3.path!) {
            do {
                try fileManager.removeItemAtURL(URL3)
            }
            catch {error}
        }

    }

之后,您可以再次运行writeDataToSqlieStore()方法。

希望有所帮助。