6

我一直在尝试在核心数据中添加对象。所以,我希望它不应该允许核心数据存储中的重复条目。怎么做?这是我与保存数据相关的代码。

  -(IBAction)save:(id)sender
    {

        if([name.text isEqualToString:@""] && [address.text isEqualToString:@""] && [phone.text isEqualToString:@""])
        {

            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Yo..!"
                                                        message:@"Data Not Saved"
                                                       delegate:nil
                                              cancelButtonTitle:@"OK"
                                              otherButtonTitles:nil];
            [alert show];
        }
    else
    {
        coreDataAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

        NSManagedObjectContext *context = [appDelegate managedObjectContext];


        NSManagedObject *newContact;
        newContact = [NSEntityDescription
                      insertNewObjectForEntityForName:@"Contacts"
                      inManagedObjectContext:context];


        [newContact setValue:name.text forKey:@"name"];
        [newContact setValue:address.text forKey:@"address"];
        [newContact setValue:phone.text forKey:@"phone"];


        name.text = @"";
        address.text = @"";
        phone.text = @"";

        NSError *error;
        [context save:&error];

        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Yo..!"
                                                    message:@"Data Saved"
                                                   delegate:nil
                                          cancelButtonTitle:@"OK"
                                          otherButtonTitles:nil];
        [alert show];

         NSLog(@"Object Saved\n");

    }


}
4

5 回答 5

6

由于没有可用的内置方法,您需要获取结果并检查结果是否包含您不想重复的对象。

这是代码片段:

-(void)checkForDuplicates
{
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Students"
                                          inManagedObjectContext:managedObjectContext];

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entity];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"students"
                                                               ascending:NO];
    NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];

    [request setSortDescriptors:sortDescriptors];
    [sortDescriptor release];

    NSError *Fetcherror;
    NSMutableArray *mutableFetchResults = [[managedObjectContext
                                        executeFetchRequest:request error:&Fetcherror] mutableCopy];

   if (!mutableFetchResults) {
        // error handling code.
    }

    if ([[mutableFetchResults valueForKey:@"users"]
         containsObject:name.text]) {
        //notify duplicates
        return;
    }
    else
    {
         //write your code to add data
    }
}

希望这可以帮助你!

于 2013-03-06T10:35:20.800 回答
2

不,coredata 没有内置的唯一性,因为它不是数据库。


您必须确保程序逻辑的唯一性。

例如,通常,一个人对一个应该是唯一的条目进行提取,如果该提取有 1 个条目,则不要添加另一个条目,否则添加它!

==> 这适用于串行 CD 访问,但在多线程环境中运行的多个上下文可能会变得复杂

于 2013-03-06T10:06:22.420 回答
2

我认为最好的方法是使用谓词调用countForFetchRequest方法来评估您的商店是否有匹配的对象。由于这种类型的请求不会拉回任何对象,因此它应该比其他解决方案具有更高的性能。这是添加到 NSManagedObject 子类的 Swift 2.0 实现。

  func tokenExists (aToken:String) -> Bool {
        let request: NSFetchRequest = NSFetchRequest(entityName: self.className!)

        let predicate = NSPredicate(format: "token == %@", argumentArray: [aToken])

        request.predicate = predicate

        let error: NSErrorPointer = nil

        let count = self.managedObjectContext!.countForFetchRequest(request, error: error)

        if count == NSNotFound {
            return false
        }
        return true
    }

注意 - (可以用任何你喜欢的相等标准代替谓词,但请记住,如果可能的话,你应该使用一个数字标识符,如果有可用的〜以获得最佳性能)

用法:

然后可以在插入过程中使用上面的函数:

func insertToken (value:String) {

        if  !tokenExists(value) {
            self.token = value
            saveState()
        }

    }
于 2015-09-14T02:18:25.267 回答
1

在 Core Data 中没有重复条目这样的东西,至少就 Core Data 而言。不是从数据库的角度来看它。这是有道理的,因为 Core Data 不是数据库,而是对象图管理系统。

因此,为了防止重复,您需要先进行搜索,然后如果搜索NULL只返回然后保存,否则什么也不做。

本文为您提供了可以根据需要自定义的代码

于 2013-03-06T10:07:51.057 回答
0

让我从 Apple 示例代码本身提出最佳方法。请参阅示例代码“ThreadedCoreData”了解更多信息。

https://developer.apple.com/library/content/samplecode/ThreadedCoreData/Introduction/Intro.html

    // before adding the earthquake, first check if there's a duplicate in the backing store
    NSError *error = nil;
    Earthquake *earthquake = nil;
    for (earthquake in earthquakes) {
        fetchRequest.predicate = [NSPredicate predicateWithFormat:@"location = %@ AND date = %@", earthquake.location, earthquake.date];

        NSArray *fetchedItems = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
        if (fetchedItems.count == 0) {
            // we found no duplicate earthquakes, so insert this new one
            [self.managedObjectContext insertObject:earthquake];
        }
    }
于 2017-05-25T12:06:01.920 回答