使用 Magical Record 添加到创建的实体属性

Posted

技术标签:

【中文标题】使用 Magical Record 添加到创建的实体属性【英文标题】:Adding to created Entities attributes using Magical Record 【发布时间】:2013-10-23 05:52:56 【问题描述】:

所以我在我的项目中使用 Magical Record,我正在尝试执行以下操作:

- (void)persistNewReadingWithOneA:(NSString *)oneA oneB:(NSString *)oneB

    NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];

    FinalRead *reading1A = [FinalRead MR_createInContext:localContext];

    reading1A.a1 = oneA;
    reading1A.b1 = oneB;


    [localContext MR_saveOnlySelfAndWait];



如您所见,我坚持使用新条目,现在我需要能够通过添加属性来更新同一条目。我尝试执行以下操作:

- (void)updateReadingWithTwoA:(NSString *)twoA twoB:(NSString *)twoB

    NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];

    FinalRead *reading2A = [FinalRead MR_createInContext:localContext];

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstname ==[c] %@ AND lastname ==[c] %@"];
    FinalRead *finalRead = [FinalRead MR_findFirstWithPredicate:predicate inContext:localContext];

    reading2A.a2 = twoA;
    reading2A.b2 = twoB;


    [localContext MR_saveOnlySelfAndWait];



有什么想法吗?

编辑:

我正在从 JSON 响应中获取数据,如下所示:

- (void)fetchedData:(NSData *)responseData 

    if (self.buttonPressed)

        //parse out the json data
        NSError* error;
        NSArray* json = [NSJSONSerialization
                              JSONObjectWithData:responseData

                              options:kNilOptions
                              error:&error];

       NSString *string = [NSString stringWithFormat:@"%@", [json objectAtIndex:0]];

        [self persistNewReadingWithOneA:string
                                   oneB:nil];


    else

        //parse out the json data
        NSError* error;
        NSArray* json = [NSJSONSerialization
                              JSONObjectWithData:responseData

                              options:kNilOptions
                              error:&error];

        NSString *string = [NSString stringWithFormat:@"%@", [json objectAtIndex:0]];

        [self persistNewReadingWithOneA:nil
                                   oneB:string];



    


然后像这样存储到新创建的对象中:

- (void)persistNewReadingWithOneA:(NSString *)oneA oneB:(NSString *)oneB

    NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];

    FinalRead *reading1A = [FinalRead MR_createInContext:localContext];

    reading1A.a1 = oneA;
    reading1A.b1 = oneB;


    [localContext MR_saveOnlySelfAndWait];



然后 ViewController 推送到另一个询问另一个问题的问题,其中再次解析和存储更多 JSON,但进入刚刚在前一个 ViewController 中创建的 SAME 对象。我在 NSManagedObject 中有以下属性 PER 对象:

@interface FinalRead : NSManagedObject

@property (nonatomic, retain) NSString *a1;
@property (nonatomic, retain) NSString *b1;
@property (nonatomic, retain) NSString *a2;
@property (nonatomic, retain) NSString *b2;
@property (nonatomic, retain) NSString *a3;
@property (nonatomic, retain) NSString *b3;
@property (nonatomic, retain) NSString *a4;
@property (nonatomic, retain) NSString *b4;

@end

所以基本上,每次我更改一个新的 viewController 时,我都想添加到同一个对象,直到最终的 View 被使用。

【问题讨论】:

【参考方案1】:

您的更新方法也会创建一个新对象:

FinalRead *reading2A = [FinalRead MR_createInContext:localContext];
// ... other stuff
reading2A.a2 = twoA;
reading2A.b2 = twoB;

并且这里获取的对象:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstname ==[c] %@ AND lastname ==[c] %@"];
FinalRead *finalRead = [FinalRead MR_findFirstWithPredicate:predicate inContext:localContext];

完全未使用。事实上,我希望 fetch 请求会崩溃,因为 谓词使用不提供参数的%@ 格式。

更新一个对象,你必须先获取它。要获取它,您需要一些 标识要更新的对象的属性。例如:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"firstname ==[c] %@ AND lastname ==[c] %@",
       firstName, lastName];
FinalRead *finalRead = [FinalRead MR_findFirstWithPredicate:predicate inContext:localContext];
if (finalRead) 
    finalRead.a2 = twoA;
    finalRead.b2 = twoB;
    // ... save context ...
 else 
    // no matching object found


更新:在您的情况下,解决方案可能是从一个传递 finalRead 对象 视图控制器到下一个,而不是在每个视图控制器中重新获取它。

【讨论】:

好的,我明白了。好吧,名字和姓氏是我在示例中找到的。老实说,我不确定如何在我的核心数据模型中搜索新创建的对象。 我对如何正确使用NSPredicate不太熟悉。 @JohnSmith:您的数据库中有多个FinalRead 对象吗?您要更新众多对象中的哪一个? 让我更新我的问题,以便更清楚一点。道歉。 @JohnSmith:旁注:我认为 MR_contextForCurrentThread 已被弃用。但这是一个不同的问题,与 this 问题无关。

以上是关于使用 Magical Record 添加到创建的实体属性的主要内容,如果未能解决你的问题,请参考以下文章

使用 Kiwi、Core Data 和 Magical Record 进行单元测试

Magical Record添加对象,不同的上下文错误

Magical Record IOS 目标 C. 我们应该创建啥上下文?

更改的属性未与 Magical Record 一起保存

Magical Record 检测到默认上下文没有变化

使用 Magical Record 迁移核心数据失败并显示“已删除不兼容的模型版本”