0

对于熟悉 CoreData 的 iPhone 开发人员来说,这可能更容易,但我不是而且真的很想知道如何在关键期限内正确访问我的数据。

这就是我的核心数据一旦设置为 anNSMutableArray并使用 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 中看到有 3 个 Questions

  1. 问题=“什么是……?
  2. 问题=\“……怎么样?
  3. 问题 = \"……在哪里?

它还表明关系中有一个策略部分:

strategy = \"<relationship fault: 0x826c430 'strategy'>\

我需要做的是访问此策略并向其添加一个 NSString 类型的对象。

一旦分配,我需要将策略作为策略拉到 NSMutableArray 以推送到 UITableView。

我知道这是很多东西,但对于 Apple Guru 来说,这可能听起来像是蛋糕和冰淇淋。

如果需要更多信息来回答,请在评论中告诉我.... 一位伟大的 StackOverflow 成员曾经告诉我

“有时最困难的部分是找到提出问题的正确方法。”

任何帮助深表感谢!

4

2 回答 2

0

不要使用获取请求来填充包含所有问题实体的数组,然后使用它来提供表格,而是查看NSFetchedResultsController http://developer.apple.com/library/ios/#DOCUMENTATION/CoreData/Reference/NSFetchedResultsController_Class /参考/参考.html

它可以很容易地用作表视图的数据源,并且不会一次将请求类型的每个实体加载到内存中。三个问题可能无关紧要,但如果你可以添加问题,它可能会开始变得重要。

在访问两个实体之间的关系时,Martin R 有正确的想法。虽然如果每个问题都可以有多个策略,但每个策略只能有一个问题,我不确定一个实体是否有必要。您可能希望了解如何将NSSet字符串直接存储在 Question 实体的属性中。(我很确定您可以将属性类型设置为“数据”并在其中存储一个数组,但您必须查看它以了解如何)。

于 2013-07-11T18:05:57.507 回答
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];

由于逆关系的性质,这两个操作是等价的,一个隐含另一个。

于 2013-07-11T17:48:32.730 回答