Der er ingen hurtigste måde, men jeg kan helt sikkert foreslå noget, der virker for mig. Bedst eller ej - det er op til dig at afgøre.
Også dit spørgsmål er meget generisk - da det omfatter hele backend-infrastrukturen i en mobilapp. Jeg vil prøve at være så specifik som jeg kan -
1) Lav en http post-anmodning til en php-fil, som vælger alle data i mysql-databasen og giver resultatet tilbage til appen -
Når du har modtaget resultatet, kan du parse det i kernedata som eksemplet nedenfor -
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) Tjek hvilke data der findes i kernedata => intet at gøre, og hvilke data der er nye => gem de nye data i kernedata -
Du kan lave et godt hovedopkald med et tidsstempel og tjekke, om dataene er blevet opdateret. Hvis dataene er blevet opdateret - kan det blive lidt vanskeligt at opdatere individuelle Core Data-attributter. Det, der altid har virket for mig, er at slette SQLITE-backend'en på enheden og køre dataskrivningsmetoden igen. Du kan bruge eksemplet nedenfor -
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}
}
}
Derefter kan du køre writeDataToSqlieStore()
metode igen.
Håber det hjælper.