我從Web服務獲取數據,然後與Core Data一起存儲數據。 當我從Web服務獲取新數據時,它包含我已經存儲的數據。 在覈心數據中,我存儲了由Web服務提供的每個數據集的唯一ID。 在我目前的實現中,我只是用一個唯一的ID存儲一個集合的多個實例。但我想要保留現有的一個,而忽略新的一個。或者,因爲它們是相同的,所以新的覆蓋現有的。 這裏的方法是什麼?CoreData插入新數據,保留現有的
感謝
我從Web服務獲取數據,然後與Core Data一起存儲數據。 當我從Web服務獲取新數據時,它包含我已經存儲的數據。 在覈心數據中,我存儲了由Web服務提供的每個數據集的唯一ID。 在我目前的實現中,我只是用一個唯一的ID存儲一個集合的多個實例。但我想要保留現有的一個,而忽略新的一個。或者,因爲它們是相同的,所以新的覆蓋現有的。 這裏的方法是什麼?CoreData插入新數據,保留現有的
感謝
首先,你必須檢查它來自API的新對象並在數據庫中使用uniqID存在。如果是,則將舊對象覆蓋到新對象,如果無法插入新對象。
關注的代碼示例它可以幫助你
//MARK:- get if ClassRoom Exist
func getClassroom(_ classRooMID:String) -> Classroom? {
var allClassroom:[Classroom]!
let request = Classroom.getFetchRequest()
let keyVal = classRooMID
request.predicate = NSPredicate.init(format: "classroomid = %@", argumentArray: [keyVal])
do {
allClassroom = try managedObjectContext.fetch(request) as! [Classroom]
}
catch let error as NSError{
// failure
print("Fetch failed: \(error.localizedDescription)")
}
if allClassroom.count != 0 {
return allClassroom[0]
}
return nil
}
同時插入一個新的對象
//MARK:- InsertClassroom Data
func insertClassroomData(_ classRoomDict:NSDictionary) -> Classroom {
let keyValue = classRoomDict[KEY_CLASS_ROOM_ID] as! String
var classroomObj = self.getClassroom(keyValue)
if (classroomObj == nil){
classroomObj = NSEntityDescription.insertNewObject(forEntityName: "Classroom", into: managedObjectContext) as? Classroom
}
classroomObj!.setClassroomFromDict(classRoomDict)
return classroomObj!
}
謝謝
class func defaultInsert(data:[String:Any]) -> AppLabels {
var label = self.fetchLabelFromLabelUsingVarID(var_id: data["var_id"] as! String,screen: data["name"] as! String)
if label == nil{
label = NSEntityDescription.insertNewObject(forEntityName: "AppLabels", into: CoreDataStack.managedObjectContext) as? AppLabels
}
if data["var_id"] != nil {
label?.var_id = data["var_id"] as? String
}
if data["name"] != nil {
label?.name = data["name"] as? String
}
if data["value"] != nil {
label?.value = data["value"] as? String
}
if data["var_name"] != nil {
label?.var_name = data["var_name"] as? String
}
return label!;
}
class func fetchLabelFromLabelUsingVarID (var_id:String,screen:String) -> AppLabels? {
let fetchrequest = NSFetchRequest<AppLabels>(entityName: "AppLabels")
fetchrequest.predicate = NSPredicate(format: "var_id == %@ && name == %@", var_id,screen);
fetchrequest.fetchLimit = 1;
do {
let fetchedResults = try CoreDataStack.managedObjectContext.fetch(fetchrequest)
if let applabel = fetchedResults.first {
return applabel
}
}
catch{
}
return nil;
}
請爲您的答案添加一些更詳細的信息,只有代碼才能幫助提問者解決問題。 – CodeChanger
嘗試並取得與唯一ID現有對象;如果您沒有收到對象,請插入一個新對象。 – Paulw11
通常,最好將應用程序與服務器同步。所以只需更新來自服務器的所有內容。 – kirander
請解釋你想要什麼?你想覆蓋或不覆蓋?如果你不想覆蓋那麼請看這個鏈接實現https://github.com/Gagan5278/DemoApps/blob/master/TwitterDemo/TwitterDemo/Model/TwitterUser%2BCoreDataClass.swift 在這段代碼中你可以忽略' checkForObjectCountWithIdentifier'函數。也嘗試實現批量保存以獲得更好的性能。 –