首页 文章

swift同步核心数据数据和mysql数据库[关闭]

提问于
浏览
0

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

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

我的想法是,在每个应用程序启动时,一个进程将开始:

  • 对php文件发出http post请求,该文件选择mysql数据库的所有数据并将结果返回给app

  • 检查核心数据中存在哪些数据=>无事可做,以及哪些数据是新的=>将新数据保存在核心数据中

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

1 回答

  • 2

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

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

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

    收到结果后,您可以在Core Data中解析它,如下例所示 -

    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() 方法 .

    希望有所帮助 .

相关问题