处理Core Data中的重复条目

Phe*_*ter 11 xcode core-data objective-c ios

我有一个允许用户保存收藏夹的应用程序.我使用Core Data将收藏夹存储为托管对象.我已经编写了一些代码来防止存储重复项的可能性,但我想知道是否有更好的方法来执行此操作.每个喜欢的对象都有一个唯一的ID字段.在下面的代码中,我只是循环并检查ID字段,如果该值已经存在,则将标志值设置为true,并打破循环.

-(BOOL)addFavorite{
    BOOL entityExists = NO;
    if(context){
        // does this favorite already exist?
        NSArray *allFaves = [AppDataAccess getAllFavorites];
        for(Favorite *f in allFaves){
            if([f.stationIdentifier isEqualToString:stID]){
                entityExists = YES;
                break;
            }
        }
        if(!entityExists){
            NSError *err = nil;
            Favorite *fave = [Favorite insertInManagedObjectContext:context];
            fave.stationRealName = riverGauge.name;
            fave.stationIdentifier = stID;
            fave.stationState = @"WV";
            if(![context save:&err]){
                NSLog(@"ERROR: Could not save context--%@", err);
            }
            return YES;            
        }
    return NO;
}
Run Code Online (Sandbox Code Playgroud)

我想知道Core Data是否能够检查添加的对象是否重复.是否有可以处理重复检查的谓词?谢谢!

Dai*_*jan 19

CoreData本身并不是唯一的.它没有两个条目相同的概念.

要启用此类行为,您必须通过执行"在插入前搜索"(也称为"在创建之前获取")来自行实现此行为.

NSFetchRequest *fetch = [NSFetchRequest fetchRequestWithEntityName:@"Favorite"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"stationIdentifier == %@", stID];
[fetch setPredicate:predicate];
YourObject *obj = [ctx executeRequest:fetch];

if(!obj) {
    //not there so create it and save
    obj = [ctx insertNewManagedObjectForEntity:@"Favorite"]; //typed inline, dont know actual method
    obj.stationIdentifier = stID;
    [ctx save];
}

//use obj... e.g.
NSLog(@"%@", obj.stationIdentifier);
Run Code Online (Sandbox Code Playgroud)

请记住,这假设是单线程访问


Htm*_*sin 6

雨燕4

func isEntityAttributeExist(id: Int, entityName: String) -> Bool {
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let managedContext = appDelegate.persistentContainer.viewContext
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)
    fetchRequest.predicate = NSPredicate(format: "id == %@", id)
    let res = try! managedContext.fetch(fetchRequest)
    return res.count > 0 ? true : false
}
Run Code Online (Sandbox Code Playgroud)


sha*_*oga 5

从iOS 9.0开始只是一个更新,您可以在模型中使用“唯一约束”轻松完成此操作。但是请注意,如果您的商店中已经包含重复的核心数据,则在应用交付时,任何自动迁移都将失败。

参见示例- 核心数据唯一约束

  • CloudKit 不支持唯一约束,并且在 iOS 14 中被禁止 (3认同)

Vah*_*hid 5

斯威夫特3

func isExist(id: Int) -> Bool {
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: myEntityName)
    fetchRequest.predicate = NSPredicate(format: "id = %d", argumentArray: id)

    let res = try! theContext.fetch(fetchRequest)
    return res.count > 0 ? true : false
}
Run Code Online (Sandbox Code Playgroud)