7

我对核心数据编程非常陌生。我有一个问题希望得到澄清。

假设我有一个名为 的 NSManagedObject Company,具有以下属性:

  • 公司名
  • 公司邮箱
  • 公司电话号码
  • 公司用户名
  • 公司密码

在这个对象中,companyName属性被索引。

所以,我的问题是,我怎样才能确保只有相同的 companyName、companyEmail、companyPhoneNo、companyUserName 和 companyPassword 条目?

我是否需要请求检查是否有任何具有相同属性值的记录,或者使用对象 ID 进行简单检查是否足够?

谢谢。

4

2 回答 2

13

这是一个示例可能会有所帮助:

NSError * error;
NSFetchRequest * fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:NSStringFromClass([self class])
                                    inManagedObjectContext:managedObjectContext]];
[fetchRequest setFetchLimit:1];

// check whether the entity exists or not
// set predicate as you want, here just use |companyName| as an example
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"companyName == %@", companyName]];

// if get a entity, that means exists, so fetch it.
if ([managedObjectContext countForFetchRequest:fetchRequest error:&error])
  entity = [[managedObjectContext executeFetchRequest:fetchRequest error:&error] lastObject];
// if not exists, just insert a new entity
else entity = [NSEntityDescription insertNewObjectForEntityForName:NSStringFromClass([self class])
                                            inManagedObjectContext:managedObjectContext];
[fetchRequest release];

// No matter it is new or not, just update data for |entity|
entity.companyName = companyName;
// ...

// save
if (! [managedObjectContext save:&error])
  NSLog(@"Couldn't save data to %@", NSStringFromClass([self class]));

提示:countForFetchRequest:error:实际上并不获取实体,它只是返回一些与predicate您之前设置的实体匹配的实体。

于 2012-04-22T06:21:24.113 回答
1

您有两种选择来维护您的商店而没有重复:

  1. 在插入中获取。
  2. 插入所有新数据,然后在保存之前删除重复项。

什么是更快更方便?大概是第一种方式。但是您最好使用 Instruments 对其进行测试,并为您的应用找到正确的方法。

这是有关此问题的文档。 http://developer.apple.com/library/mac/ipad/#documentation/Cocoa/Conceptual/CoreData/Articles/cdImporting.html#//apple_ref/doc/uid/TP40003174-SW1

于 2012-04-22T06:03:20.083 回答