对于熟悉CoreData的iPhone开发人员来说,这可能更容易,但我不是,并且非常想知道如何在关键的截止日期内正确访问我的数据。
这是我的核心数据一旦设置为NSMutableArray
并使用NSLog拉
Questions List KM: (
"<Question: 0x8589630> (entity: Question; id: 0x8588820 <x-coredata://FDC76465-4884-473A-B46A-3451BCB74F5C/Question/p1> ; data: {\n orderID = 0;\n project = \"0x818e300 <x-coredata://FDC76465-4884-473A-B46A-3451BCB74F5C/Project/p1>\";\n question = \"What is ...? \";\n strategy = \"<relationship fault: 0x8264930 'strategy'>\";\n})",
"<Question: 0x85898d0> (entity: Question; id: 0x8588830 <x-coredata://FDC76465-4884-473A-B46A-3451BCB74F5C/Question/p2> ; data: {\n orderID = 1;\n project = \"0x818e300 <x-coredata://FDC76465-4884-473A-B46A-3451BCB74F5C/Project/p1>\";\n question = \"How is ...? \";\n strategy = \"<relationship fault: 0x826fa60 'strategy'>\";\n})",
"<Question: 0x8589930> (entity: Question; id: 0x8588840 <x-coredata://FDC76465-4884-473A-B46A-3451BCB74F5C/Question/p3> ; data: {\n orderID = 2;\n project = \"0x818e300 <x-coredata://FDC76465-4884-473A-B46A-3451BCB74F5C/Project/p1>\";\n question = \"Where is ...? \";\n strategy = \"<relationship fault: 0x826c430 'strategy'>\";\n})"
)
我能够通过以下方式轻松将其拉到数组中:
// fetch and sort questions
NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Question" inManagedObjectContext:self.managedObjectContext];
[request setEntity:entity];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"orderID" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[request setSortDescriptors:sortDescriptors];
NSError *error = nil;
NSMutableArray *mutableFetchResults = [[self.managedObjectContext executeFetchRequest:request error:&error] mutableCopy];
if (mutableFetchResults == nil) {
// Handle the error.
NSLog(@"No Results in Questions Array.");
}
[self setQuestionsList:mutableFetchResults];
这是Question.h或问题定义:
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@class Project, Strategy;
@interface Question : NSManagedObject
@property (nonatomic, retain) NSNumber * orderID;
@property (nonatomic, retain) NSString * question;
@property (nonatomic, retain) Project *project;
@property (nonatomic, retain) NSSet *strategy;
@end
@interface Question (CoreDataGeneratedAccessors)
- (void)addStrategyObject:(Strategy *)value;
- (void)removeStrategyObject:(Strategy *)value;
- (void)addStrategy:(NSSet *)values;
- (void)removeStrategy:(NSSet *)values;
@end
这里是Strategy.h的定义:
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@class Question;
@interface Strategy : NSManagedObject
@property (nonatomic, retain) NSString * strategy;
@property (nonatomic, retain) Question *question;
@end
你可以在数据的NsLog中看到有三个问题
它还表明关系中有一个战略部分:
strategy = \"<relationship fault: 0x826c430 'strategy'>\
我需要做的是访问此策略并向Type NSString添加单个对象。
一旦分配完毕,我需要将作为策略的Pull作为NSMutableArray推进到UITableView。
我知道这很重要,但对Apple Guru来说这可能听起来像蛋糕和冰淇淋。
如果需要更多信息来回答,请在评论中告诉我......一位伟大的StackOverflow成员曾告诉我
“有时最难的部分是找到正确的方式来问问 问题“。
任何帮助都得到了很多赞赏!
答案 0 :(得分:0)
我不确定我是否正确理解了您的问题,但访问的策略是
一个问题只需通过访问器方法完成。
(请注意,strategy
是一个多对多关系,所以更好的名称是strategies
,和
我会在这里使用它)
Question *theQuestion = ... //
NSSet *strategiesAsSet = theQuestion.strategies; // set of related Strategy objects
// or:
NSArray *strategiesAsArray = [theQuestion.strategies allObjects]; // array of related Strategy objects.
要添加策略,您必须创建对象:
Strategy *newStrategy = [NSEntityDescription insertNewObjectForEntityForName:@"Strategy" inManagedObjectContext:context];
然后设置关系。您可以 设置
newStrategy.question = theQuestion;
或 或者,
[question addStrategyObject:newStrategy];
由于反向关系的性质,这两个操作是等价的, 一个意味着另一个。
答案 1 :(得分:0)
不是使用获取请求来使用问题实体的所有填充数组,然后使用它来提供表格,而是查看NSFetchedResultsController
http://developer.apple.com/library/ios/#DOCUMENTATION/CoreData/Reference/NSFetchedResultsController_Class/Reference/Reference.html
它可以非常容易地用作表视图的数据源,并且不会立即将所请求类型的每个实体加载到内存中。有三个问题可能并不重要,但如果你可以添加问题,它可能会开始变得重要。
Martin R在访问两个实体之间的关系时有正确的想法。虽然如果每个问题可以有多个策略,但每个策略只能有一个问题,我不确定实体是否有保证。您可能希望看到有关将NSSet
字符串直接存储在Question实体的属性中的信息。 (我非常确定您可以将属性类型设置为&#39;数据&#39;并在其中存储数组,但您必须仔细查看如何)。