用于在关系中的对象下添加的CoreData

时间:2013-07-11 16:45:11

标签: objective-c ipad core-data nsmutablearray

对于熟悉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中看到有三个问题

  1. question = \“什么是......?
  2. question = \“怎么样??
  3. question = \“......在哪里??
  4. 它还表明关系中有一个战略部分:

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

    我需要做的是访问此策略并向Type NSString添加单个对象。

    一旦分配完毕,我需要将作为策略的Pull作为NSMutableArray推进到UITableView。

    我知道这很重要,但对Apple Guru来说这可能听起来像蛋糕和冰淇淋。

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

      

    “有时最难的部分是找到正确的方式来问问   问题“。

    任何帮助都得到了很多赞赏!

2 个答案:

答案 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;并在其中存储数组,但您必须仔细查看如何)。