MagicalRecord 不保存数据

Posted

技术标签:

【中文标题】MagicalRecord 不保存数据【英文标题】:MagicalRecord does not save data 【发布时间】:2013-11-26 12:32:35 【问题描述】:

我正在尝试一些非常基本的 MagicalRecord 实现来掌握它并遇到以下问题。

当我保存一个条目然后获取该类型的条目时,它会找到我刚刚保存的条目。但是,当我保存条目,关闭应用程序,重新启动它,然后获取时,它出现空。

保存代码:

- (void)createTestTask
    NSManagedObjectContext *localContext = [NSManagedObjectContext contextForCurrentThread];

    Task *task = [Task createInContext:localContext];
    task.tName = @"First Task";
    task.tDescription = @"First Task created with MagicalRecord. Huzzah!";


    NSError *error;
    [localContext save:&error];
    if (error != Nil) 
        NSLog(@"%@", error.description);
    

获取代码:(如果实际保存了任何内容,我只想知道这里)

- (void) fetchTasks
    NSArray *tasks = [Task findAll];
    NSLog(@"Found %d tasks", [tasks count]);

我确定我在这里遗漏了一些东西,但我似乎在 *** 或我查看的教程中找不到任何东西。

欢迎任何帮助。

【问题讨论】:

【参考方案1】:

我必须问一个明显的“是否已插入”问题:您是否使用 +[MagicalRecord setupCoreDataStack] 方法之一初始化了核心数据堆栈?

您的堆栈是否正确初始化?也就是说,您的商店和型号是否兼容?如果它们不是,MagicalRecord(更恰当地说,Core Data)将设置整个堆栈而没有持久存储。这很烦人,因为看起来一切都很好,直到它无法保存到商店……因为没有商店。 MagicalRecord 有一个+[MagicalRecord currentStack] 方法,可用于检查堆栈的当前状态。设置堆栈后在调试器中尝试。

假设你这样做了,另一件要检查的是错误日志。如果你使用

[localContext MR_saveToPersistentStoreAndWait];

应将任何错误记录到控制台。通常,当您在应用程序的后续运行中看不到数据时,这是因为您认为调用 save 时没有保存数据。反过来,保存不会发生,因为您的数据没有正确验证。一个常见的例子是,如果你有一个必需的属性,并且在你调用 save 时它仍然是 nil。 “正常”核心数据根本不会记录这些问题,因此您可能认为它有效,但实际上保存操作失败了。另一方面,MagicalRecord 会捕获所有这些错误并将它们记录到控制台,至少可以告诉您数据发生了什么。

【讨论】:

saveToPersistentStoreAndWait 成功了。 currentStack 表明它至少可以正常工作。不知道为什么保存没有正确执行,但 saveToPersistentStoreAndWait 做到了。有什么想法吗?【参考方案2】:

当我开始使用魔法记录时,我也遇到了这个问题,问题是您用来保存数据的上下文。这是我的代码,可能会对您有所帮助

[MagicalRecord saveWithBlock:^(NSManagedObjectContext *localContext) 

                NSArray *userInfoArray = [UserBasicInfo findByAttribute:@"userId" withValue:[NSNumber numberWithInt:loggedInUserId] inContext:localContext];

                UserBasicInfo* userInfo;

                if ([userInfoArray count]) 
                    userInfo = [userInfoArray objectAtIndex:0];
                 else 
                    userInfo = [UserBasicInfo createInContext:localContext];
                

                userInfo.activeUser = [NSNumber numberWithBool:YES];
                userInfo.firstName = self.graphUser[@"first_name"];
                userInfo.lastName = self.graphUser[@"last_name"];
                userInfo.userId = @([jsonObject[@"UserId"] intValue]);
                userInfo.networkUserId = @([jsonObject[@"NetworkUserId"] longLongValue]);
                userInfo.userPoint = @([jsonObject[@"PointsEarned"] floatValue]);
                userInfo.imageUrl = jsonObject[@"Picturelist"][0][@"PictureUrL"];
                userInfo.imageUrlArray = [NSKeyedArchiver archivedDataWithRootObject:jsonObject[@"Picturelist"]];
             completion:^(BOOL success, NSError *error) 

            ];

【讨论】:

【参考方案3】:

完成后使用它

[[NSManagedObjectContext MR_defaultContext]saveToPersistentStoreAndWait];

【讨论】:

这个问题已经回答了......你提到的是原始答案的一部分......

以上是关于MagicalRecord 不保存数据的主要内容,如果未能解决你的问题,请参考以下文章

MagicalRecord 并不总是保存更改

MagicalRecord 不保存对多关系实体

MagicalRecord 调用多个保存方法

MagicalRecord:后台保存

MagicalRecord 3.0 不保存。第二次构建没有对象

(CoreData) MagicalRecord 突然停止持久保存