在我的swift 2应用程序中,用户可以将数据保存在核心数据中。 在未来,我想知道数据将保存在核心数据和MYSQL数据库中。
在核心数据和mysql之间同步数据的最佳方法是什么
我的想法是,在每个应用开始时,一个流程将开始:
这是最好和最快的方法吗?
答案 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()
方法。
希望有所帮助。