2017-09-29 82 views
0

我从Web服务获取数据,然后与Core Data一起存储数据。 当我从Web服务获取新数据时,它包含我已经存储的数据。 在核心数据中,我存储了由Web服务提供的每个数据集的唯一ID。 在我目前的实现中,我只是用一个唯一的ID存储一个集合的多个实例。但我想要保留现有的一个,而忽略新的一个。或者,因为它们是相同的,所以新的覆盖现有的。 这里的方法是什么?CoreData插入新数据,保留现有的

感谢

+0

尝试并取得与唯一ID现有对象;如果您没有收到对象,请插入一个新对象。 – Paulw11

+0

通常,最好将应用程序与服务器同步。所以只需更新来自服务器的所有内容。 – kirander

+0

请解释你想要什么?你想覆盖或不覆盖?如果你不想覆盖那么请看这个链接实现https://github.com/Gagan5278/DemoApps/blob/master/TwitterDemo/TwitterDemo/Model/TwitterUser%2BCoreDataClass.swift 在这段代码中你可以忽略' checkForObjectCountWithIdentifier'函数。也尝试实现批量保存以获得更好的性能。 –

回答

0

首先,你必须检查它来自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! 
    } 

谢谢

0
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; 
} 
+0

请为您的答案添加一些更详细的信息,只有代码才能帮助提问者解决问题。 – CodeChanger