从NSTreeController中删除具有某个标题的对象

时间:2009-10-08 05:29:13

标签: objective-c cocoa core-data

我想知道如何删除一个对象,具体取决于它对我拥有的CoreData'name'属性的标题。 添加对象我使用以下代码:

NSManagedObjectContext *moc = [self managedObjectContext];
JGManagedObject *theParent = 
    [NSEntityDescription insertNewObjectForEntityForName:@"projects"
                                  inManagedObjectContext:moc];
[theParent setValue:nil forKey:@"parent"];
// This is where you add the title from the string array
[theParent setValue:@"myTitle" forKey:@"name"]; 
[theParent setValue:[NSNumber numberWithInt:0] forKey:@"position"];

但我似乎无法找到删除An对象的等效函数。

1 个答案:

答案 0 :(得分:0)

我不知道您是否查看了adding and deleting对象部分的核心数据编程指南。

修改

我已将其修改为从名称数组中删除。再次;使用Predicate Programming Guide工作不到5分钟。

- (void)removeObjectsWithNames:(NSArray *)nameArray {
    // Get the moc and prepare a fetch request for the required entity
    NSManagedObjectContext *moc = [self managedObjectContext];
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Project" inManagedObjectContext:moc];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDescription];

    // Create a predicate for an array of names.
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name IN %@", nameArray];
    [request setPredicate:predicate];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
    [request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];

    // Execute the fetch request put the results into array
    NSError *error = nil;
    NSArray *resultArray = [moc executeFetchRequest:request error:&error];
    if (resultArray == nil)
    {
        // Diagnostic error handling
        NSAlert *anAlert = [NSAlert alertWithError:error];
        [anAlert runModal];
    }

    // Enumerate through the array deleting each object.
    // WARNING, this will delete everything in the array, so you may want to put more checks in before doing this.
    For (JGManagedObject *objectToDelete in resultArray ) {
        // Delete the object.
        [moc deleteObject:objectToDelete];
    }
}

编辑于2009年10月10日 - 添加Joshua尝试的内容。

for(NSString *title in oldTasks) { // 1
    // Get the moc and prepare a fetch request for the required entity
    NSManagedObjectContext *moc = [self managedObjectContext];
    NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"projects" inManagedObjectContext:moc];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:entityDescription];

    // Create a predicate for an array of names.
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"title IN %d", oldTasks]; // 2
    [request setPredicate:predicate];

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
    [request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];

    // Execute the fetch request put the results into array
    NSError *error = nil;
    NSArray *resultArray = [moc executeFetchRequest:request error:&error];
    if (resultArray == nil)
    {
        // Diagnostic error handling
        NSAlert *anAlert = [NSAlert alertWithError:error];
        [anAlert runModal];
    }

    JGManagedObject *objectToDelete = [resultArray objectAtIndex:0];
    // Delete the object.
    [moc deleteObject:objectToDelete];
}

备注

我突出了两行。

  1. 您已将我的示例粘贴为for循环而不是函数调用。这只是一次取出一个字符串并将它们传递给方法。在我的例子中,我传递了一个你想要匹配的字符串数组。

  2. 这是您遇到问题的地方。如果你在阅读Predicate Programming Guide,就在顶部,在Predicates Basics部分,它表示它希望它所使用的类应符合KVC。这就是您收到有关KVC合规性的错误的原因。您正在尝试搜索标题IN ...但标题不是您的模型的属性。

  3. 我认为你可能会对谓词的作用感到困惑。看看我写的exaple代码。

    首先,我创建一个Fetch请求,它将从“Projects”实体中选择对象。

    其次,我创建了一个谓词,该谓词对于获取请求返回的每个对象,获取'name'属性的值,并将其与'namesArray'中对象的值进行比较

    第三,我正在创建一个排序描述符,它将根据'name'属性按升序对结果进行排序。

    然后,一旦我设置了这个获取请求,我就会针对moc运行它,并返回符合这些条件的对象数组。