CoreData 插入新数据,保留现有数据
CoreData insert new data, leave existing
我从 Web 服务获取数据,然后将其存储在 Core Data 中。
当我从 Web 服务获取新数据时,它包含我已经存储的数据。
在 Core Data 中,我存储了 Web 服务提供的每个数据集的唯一 ID。
在我当前的实现中,我只存储具有唯一 ID 的集合的多个实例。但我希望保留现有的,而忽略新的。或者,因为它们无论如何都是相同的,所以新的将覆盖现有的。
这里的方法是什么?
谢谢
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;
}
首先,您必须使用 uniqID 检查数据库中是否存在来自 API 的新对象。如果是,则将旧对象覆盖为新对象,如果无法获取,则插入一个新对象。
按照示例代码可能对您有所帮助
//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!
}
谢谢
我从 Web 服务获取数据,然后将其存储在 Core Data 中。 当我从 Web 服务获取新数据时,它包含我已经存储的数据。 在 Core Data 中,我存储了 Web 服务提供的每个数据集的唯一 ID。 在我当前的实现中,我只存储具有唯一 ID 的集合的多个实例。但我希望保留现有的,而忽略新的。或者,因为它们无论如何都是相同的,所以新的将覆盖现有的。 这里的方法是什么?
谢谢
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;
}
首先,您必须使用 uniqID 检查数据库中是否存在来自 API 的新对象。如果是,则将旧对象覆盖为新对象,如果无法获取,则插入一个新对象。
按照示例代码可能对您有所帮助
//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!
}
谢谢