MagicalRecord (CoreData) + Today Extension (iOS8)... 他们会玩吗?

Posted

技术标签:

【中文标题】MagicalRecord (CoreData) + Today Extension (iOS8)... 他们会玩吗?【英文标题】:MagicalRecord (CoreData) + Today Extension (iOS8)... Will They Play? 【发布时间】:2014-09-26 17:55:09 【问题描述】:

希望您能提供帮助。我正在向我的应用添加 Today 支持,它使用 MagicalRecord https://github.com/magicalpanda/MagicalRecord 来管理我所有的 CoreData 内容。

我正在竭尽全力试图了解如何将我的数据呈现到 Today 扩展中。

我已启用此处列出的应用程序组http://blog.sam-oakley.co.uk/post/92323630293/sharing-core-data-between-app-and-extension-in-ios-8 但是我正在阅读的所有文档和 *** 帖子都与直接使用 CoreData 相关。 MagicalRecord 为您做了很多艰苦的工作,这就是我使用它的原因,因为我在这个项目开始时对它完全陌生。所以像:

在初始化核心数据堆栈的地方,您将添加一个存储到 你的 persistentStoreCoordinator 有点像这样:

[persistentStoreCoordinator
addPersistentStoreWithType:NSSQLiteStoreType configuration:nil
URL:storeURL options:options error:&error]

只需更改之前的 storeURL 值即可 (通常在 NSDocumentDirectory 中的某个位置)到包含在 您的共享应用程序组文件夹。您可以使用

containerURLForSecurityApplicationGroupIdentifier: NSURL *directory =
[[NSFileManager defaultManager]
containerURLForSecurityApplicationGroupIdentifier:@"group.YourGroupName"];
NSURL *storeURL = [directory 
URLByAppendingPathComponent:@"YourAppName.sqlite"];

...我不明白如何/在哪里实施。

我原以为我只需要在我的扩展程序中设置 MagicalRecord 堆栈,就像在我的 appDelegate 中一样,但它当然失败了。

真的希望有人可能处于类似的情况,并能够阐明如何推进这个问题。

您需要我发布的任何代码都可以告诉我。

提前致谢

【问题讨论】:

可能值得添加,MagicalRecord 包装了所有 CoreData 堆栈,所以我很犹豫要不要四处寻找并可能破坏已经工作的东西。 @Emilie,你解决了吗? 【参考方案1】:

不确定这是否适用于以前版本的 MagicalRecord,但从 2.2 开始,您可以将最终 url 作为商店名称传递:

NSFileManager *fileManager = [[NSFileManager alloc] init];

NSURL *directory = [fileManager containerURLForSecurityApplicationGroupIdentifier:@"group.yellow"];
NSURL *pathToStore = [directory URLByAppendingPathComponent:kMagicalRecordDefaultStoreFileName];

[MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:(id)pathToStore];

【讨论】:

【参考方案2】:

我遇到了同样的问题,我可以通过关注这个帖子来解决它。 https://github.com/magicalpanda/MagicalRecord/issues/858

我首先在 NSPersistentStore+MagicalRecord.m 中更新了如下方法

- (NSURL *) MR_urlForStoreName:(NSString *)storeFileName

  NSFileManager *fileManager = [[NSFileManager alloc] init];

  NSURL *directory = [fileManager containerURLForSecurityApplicationGroupIdentifier:@"group.yourIdentifier"];
  NSURL *pathToStore = [directory URLByAppendingPathComponent:storeFileName];

  return pathToStore;

// NSArray *paths = [NSArray arrayWithObjects:[self MR_applicationDocumentsDirectory], [self MR_applicationStorageDirectory], nil];
// NSFileManager *fm = [[NSFileManager alloc] init];
//

// for (NSString *path in paths) 
// 
// NSString *filepath = [path stringByAppendingPathComponent:storeFileName];
// if ([fm fileExistsAtPath:filepath])
// 
// return [NSURL fileURLWithPath:filepath];
// 
// 
//
// return [NSURL fileURLWithPath:[[self MR_applicationStorageDirectory] stringByAppendingPathComponent:storeFileName]];

然后在我的扩展中,我只是在其视图中添加了以下内容并加载方法。

- (void)viewDidLoad 
  [super viewDidLoad];
  [MagicalRecord setupCoreDataStackWithStoreNamed:<storeFileName>];

【讨论】:

最后一部分不是@"group.yourIdentifier",它应该是您用于 storeFileName 的任何内容。 如果您将其作为现有应用程序的更新发布,这实际上会导致核心数据为空。正在寻找另一种解决方案... @jwhat 您是否遇到过其他解决方案?似乎无法通过键盘扩展来实现这一点。 :\【参考方案3】:

改变

[MagicalRecord setupCoreDataStackWithStoreNamed:@"Database"];

 - (void)setupCoreDataStack

     if ([NSPersistentStoreCoordinator MR_defaultStoreCoordinator] != nil)
     
        return;
    

    NSManagedObjectModel *model = [NSManagedObjectModel MR_defaultManagedObjectModel];
    NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];

    NSURL *storeURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:@"group.yourgroup"];
    storeURL = [storeURL URLByAppendingPathComponent:@"Database.sqlite"];

    [psc MR_addSqliteStoreNamed:storeURL withOptions:nil];
    [NSPersistentStoreCoordinator MR_setDefaultStoreCoordinator:psc];
    [NSManagedObjectContext MR_initializeDefaultContextWithCoordinator:psc];

【讨论】:

我喜欢这个想法,基本上是手动设置,但要小心。您检查 defaultStoreCoordinator 的第一行默认设置为在不存在时自动创建协调器,因此它将始终为非零,并且以下代码都不会运行。如果你想这样做,你需要添加 [MagicalRecordHelpers setShouldAutoCreateDefaultPersistentStoreCoordinator:NO];到该方法的最顶端。

以上是关于MagicalRecord (CoreData) + Today Extension (iOS8)... 他们会玩吗?的主要内容,如果未能解决你的问题,请参考以下文章

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

在 TodayExtension 中使用 MagicalRecord (CoreData)

CoreData(MagicalRecord) 获取保存的对象

MagicalRecord (CoreData) + Today Extension (iOS8)... 他们会玩吗?

使用 MagicalRecord 3 的 CoreData 内存设置

使用 MagicalRecord 插入后 CoreData 关系未更新