我已经阅读了 Apple 开发人员指南和教程,并且阅读了两本关于 Core Data 主题的 iPhone 书籍。
我习惯于处理事物的“值对象”/“实体”方面,然后将它们发送到 Web 服务等。但在 iPhone 上,我可以自己处理所有事情……残酷的世界 :)
Locations
Apple Developer 网站上的TaggedLocations
和PhotoLocations
示例并没有以我可以“计算”的方式给我答案。我希望这里有人可以启发我。
我已经使用数据模型 GUI 设置了我的模型。两个实体,Person
和Dream
。
Person
具有personName
字符串属性和一对多的dreams
关系。
Dreams
具有description
字符串属性和一对一的person
关系。
我一直在设置一个简单的tableView
应用程序。第一个视图是人员列表,第二个视图是他们的梦想列表。
这就是我将一个人添加到modelObjectContext
:
Person *newPerson = (Person *)[NSEntityDescription
insertNewObjectForEntityForName:@"Person"
inManagedObjectContext:managedObjectContext];
[newPerson setPersonName:@"Ben Hur"];
好的,然后我在上下文中添加一个新的梦想:
Dream *newDream = (Dream *)[NSEntityDescription
insertNewObjectForEntityForName:@"Dream"
inManagedObjectContext:managedObjectContext];
[newDream setDescription:@"I had a nightmare"];
我现在将梦想添加到这样的人身上:
[newPerson addDreamObject:newDream];
这里对我来说有点模糊,因为 xcode 在Person
Class 上为我生成了不同的方法/访问器:
@class Dream;
@interface Person : NSManagedObject
{
}
@property (nonatomic, retain) NSString * personName;
@property (nonatomic, retain) NSSet* dream;
@end
@interface Person (CoreDataGeneratedAccessors)
- (void)addDreamObject:(Dream *)value;
- (void)removeDreamObject:(Dream *)value;
- (void)addDream:(NSSet *)value;
- (void)removeDream:(NSSet *)value;
@end
在其他情况下,我不必处理实际的保存、检索数据。我会构建一个名为的实体/值对象person
,并赋予它一个Array
来存储梦想。但这不是核心数据中可能的属性类型,也不是这样做的方法,我已经读过(在这里也有类似的线程)。
那么这个样板代码是如何工作的呢?我应该使用它addDream
并发送一个NSSet
充满梦想的东西吗?还是我可以只信任核心数据来实例化它并专门使用addDreamObject
发送Person
类型的实体对象Dreams
?
我还使用 xcode 中的样板代码保存上下文。现在我想用这个人更新视图,更准确地说是他的名字。
在cellForRowAtIndexPath
我给它的方法中:
NSManagedObject *managedObject = [fetchedResultsController objectAtIndexPath:indexPath];
cell.textLabel.text = [[managedObject valueForKey:@"personName"] description];
一切都很好,名称显示在列表中。
我将我的设置DreamViewController
为将Person
对象作为参数。
Person *selectedObject = [[self fetchedResultsController] objectAtIndexPath:indexPath];
dreamView.selectedPerson = selectedObject;
然后我将 压入viewController
堆栈,然后我们进入DreamView
. 在这里,我似乎无法理解与我“送来”的人有关的梦境。
这是我在DreamViewController
'sviewDidLoad
方法中尝试的(selectedPerson
是我用来传递Person
对象的访问器):
- (void)viewDidLoad {
[super viewDidLoad];
self.title = @"One Person";
NSManagedObjectContext *context = selectedPerson.managedObjectContext;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Dream"
inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSError *error;
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects == nil) {
// Handle the error.
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
exit(-1); // Fail
}
NSMutableArray *mutableArray = [fetchedObjects mutableCopy];
self.dreamArray = mutableArray;
NSLog(@"the length of dreamArray: %i",[self.dreamArray count] );
Dream *d = [dreamArray objectAtIndex:0];
NSLog(@"The Dream object says: %@", [d description]);
[mutableArray release];
[fetchRequest release];
}
我似乎真的无法掌握这一点,而且我目前使用 Objective C 的经验不允许我从 Apple 文档的字里行间中抓住“最佳实践”的精髓。