【发布时间】:2016-08-19 17:27:01
【问题描述】:
当我将数据保存到 Core Data 时,重复数据不会保存在一行中。 当我保存新数据时,会出现一个新行。这是发生错误(不准确的数据结果)显示。如何处理 Core Data 中的重复数据。
【问题讨论】:
标签: ios iphone swift ipad core-data
当我将数据保存到 Core Data 时,重复数据不会保存在一行中。 当我保存新数据时,会出现一个新行。这是发生错误(不准确的数据结果)显示。如何处理 Core Data 中的重复数据。
【问题讨论】:
标签: ios iphone swift ipad core-data
对于您的场景,您需要添加一个唯一列来唯一标识一行,如主键,如果您已经添加,请忽略。
当你要在核心数据实体中插入一个元组时,不要使用
对象 C:
[NSEntityDescription insertNewObjectForEntityForName:@"Document" inManagedObjectContext:context];
斯威夫特:
NSEntityDescription.insertNewObjectForEntityForName("Document", inManagedObjectContext:context)
这将每次创建一个新元组。
相反,
编写一个方法来检查你要插入的数据是否已经可用。
如果可用,则返回该记录对象。因此,您可以只更新记录的值,而不是为数据创建新记录。
例如,
这里我使用 PortionInbox 作为实体并将唯一值作为 TransID 存储到元组中。
首先检查数据是否已经存在..
PortionInbox *portionInbox = [self checkAvailabilityWithTransId:portionDict[@"TransID"] context:context];
如果(部分收件箱 == 无){ partInbox = [NSEntityDescription insertNewObjectForEntityForName:@"PortionInbox" inManagedObjectContext:context]; }
如果已存在,请获取 Entity 对象以更新您拥有的值。否则,为新数据创建一个新条目。
编写一些谓词以从 partInbox 实体中检索该特定条目。
如下.. 我用 Obj C 编写的。只需将其更改为 Swift。
-(PortionInbox *)checkAvailabilityWithTransId:(NSString *)transId context:(NSManagedObjectContext *)context{
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"PortionInbox" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"transID contains[cd] %@", transId];
[fetchRequest setReturnsObjectsAsFaults:NO];
[fetchRequest setPredicate:pred];
NSError* error;
NSArray *fetchedRecords = [context executeFetchRequest:fetchRequest error:&error];
if (fetchedRecords.count>0)
{
return [fetchedRecords objectAtIndex:0];
}
else
{
return nil;
}}
希望对你有帮助..
【讨论】:
要将一些数据保存到 CoreData 你应该使用这个例子 代码 swift 3.0
let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context: NSManagedObjectContext = appDelegate.persistentContainer.viewContext
let user = NSEntityDescription.insertNewObject(forEntityName: "Example", into: context)
user.setValue("GOODDUDE", forKey: "name")
appDelegate.saveContext()
【讨论】: