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

Posted

技术标签:

【中文标题】MagicalRecord 3.0 不保存。第二次构建没有对象【英文标题】:MagicalRecord 3.0 not saving. No objects for the second build 【发布时间】:2014-11-24 19:09:01 【问题描述】:

我是第一次试用 MagicalRecord 3.0,但无法使用。

这就是我正在做的。

1- 设置堆栈:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

[MagicalRecord setupClassicStackWithSQLiteStoreNamed:@"Model"];

我的模型名称是“Model.xcdatamodeld”。

2- 创建实体并保存:

Preferences *p = [Preferences createEntity];
p.visibilityWindow = @"08:00-23:30";

[[NSManagedObjectContext MR_context] saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error) 
    if (success) 
        NSLog(@"You successfully saved your context.");
     else if (error) 
        NSLog(@"Error saving context: %@", error.description);
    
];

3- 加载数据:

NSArray *matches;

NSError * error = nil;
matches = [Preferences MR_findAll];

Preferences *p = nil;

NSLog(@"Fetch request data %@",matches);
if(!matches || error || ([matches count] >1))
    //handle error;
    NSLog(@"Error %@ matches count %lu", error, (unsigned long)[matches count]);
else if ([matches count])
    p = [matches firstObject];
    NSLog(@"Preferences found in coredata %@", p);
else
    NSLog(@"No matches %i", [matches count]);

正如文档所示,我也在“清理”:

- (void)applicationWillTerminate:(UIApplication *)application 
[MagicalRecord cleanUp];

当我使用传统的核心数据框架时,它工作得很好。

它说我保存成功。但是当我退出应用程序并尝试再次运行它时,它不再工作了。 我做错了什么

此外,从我阅读的帖子中,每个人都在谈论“MR_defaultContext”。它被弃用了吗?

【问题讨论】:

【参考方案1】:

几个想法: 查看 MagicalRecord 3.0 的代码,MR_context 返回NSPrivateQueueConcurrencyType。使用 MR_createEntity 似乎使用了不同的主队列上下文。尝试使用MR_createEntityInContext: 创建您的实体并传入MR_context

另外,在不知道何时调用这三个方法的情况下,尝试使用MR_saveToPersistentStoreAndWaitWithError:

编辑: 最快的测试方法可能是更改第 2 步:

Preferences *p = [Preferences createEntity];
p.visibilityWindow = @"08:00-23:30";

NSError *error; // add this
BOOL success = [p.managedObjectContext MR_saveToPersistentStoreWithError:error] // change this
if (success) 
    NSLog(@"You successfully saved your context.");
 else if (error) 
    NSLog(@"Error saving context: %@", error.description);

【讨论】:

似乎不起作用。不会从创建实体返回。甚至没有达到保存方法。将尝试保存在主队列上下文中。 我还应该指出MR_findAll ALSO 使用不同的主队列上下文,因此如果您仍在使用MR_context,则需要调用MR_findAllInContext:[NSManagedObjectContext MR_context]] 我认为在 3.0 中你想使用[[MagicalRecordStack defaultStack] context]。这似乎等同于旧的MR_defaultContext 最后一条评论有效。非常感谢@Aaron !!您可以编辑实际答案,以便我接受。【参考方案2】:

我遇到了同样的问题...我使用了(与你的东西一起)我还添加了使用UIBackgroundTaskIdentifier 存储的选项(可选)

--

Preferences *p = [Preferences createEntity];
p.visibilityWindow = @"08:00-23:30";

[SomethingManagerObject saveIntoContext]

--

SomethingManagerObject

+ (void) saveWithContext

//  THIS IS opcional!!! -> Prepar for BackgroundTask
UIApplication * application = [UIApplication sharedApplication];

__block UIBackgroundTaskIdentifier bgTask = [application beginBackgroundTaskWithExpirationHandler:^
    [application endBackgroundTask:bgTask];
    bgTask = UIBackgroundTaskInvalid;
];

//  Get the context
NSManagedObjectContext *localContext = [[MagicalRecordStack defaultStack] context];

// Save the modification in the context
[localContext MR_saveToPersistentStoreWithCompletion:^(BOOL success, NSError *error) 

    [application endBackgroundTask:bgTask];
    bgTask = UIBackgroundTaskInvalid;

];

或者您可以使用实体的 managedObjectContext 保存。在saveWithContext 方法中只需添加参数并发送p.managedObjectContext。内改[[MagicalRecordStack defaultStack] context]

SomethingManagerObject 是一个 NSObject,您可以使用它来拥有类似的类方法...保存...创建...

【讨论】:

以上是关于MagicalRecord 3.0 不保存。第二次构建没有对象的主要内容,如果未能解决你的问题,请参考以下文章

MagicalRecord 2.3.0/3.0 在对象内保存对象

如何确保在使用 MagicalRecord 3.0 保存后台线程后通知 NSFetchedResultsController

MagicalRecord release/3.0 - 日志记录不起作用

CoreData MagicalRecord 保存方法在 iPhone5 上崩溃

MagicalRecord 3.0 设置

MagicalRecord 不保存数据