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

标签 ios objective-c core-data magicalrecord

所以我在我的项目中使用了 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 中有以下每个对象的属性:

@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。

最佳答案

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

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];

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

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

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 对象从一个 View Controller 到下一个,而不是在每个 View Controller 中重新获取它。

关于ios - 使用 Magical Record 添加到创建的实体属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19533827/

相关文章:

ios - UIPageViewControllerDatasource 调用向左滑动和向右滑动方法

ios - 在 iOS swift 中处理表格中的选定行时出错

iphone - 管理多个 UIActivityIndi​​catorView

objective-c - 双击 NSTableView 中的行不显示新 View

swift 2 : Table view cellForRowAtIndexPath - BAD_EXEC

ios - 如何在ios应用程序中实现书签或收藏夹功能

objective-c - Core Data NSDocument 应用程序 - 打开 PDF,另存为 bundle

mysql - 从 MySQL 获取数据库到 SQLite

ios - 逆脉冲效应

ios - 将代码移动到 willDisplayCell 以改进 UITableview 滚动