MagicalRecord(CoreData)+今日推广(iOS8)......他们会玩吗?

时间:2014-09-26 17:55:09

标签: ios objective-c core-data ios8 today-extension

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

我正在试图理解如何将我的数据显示在今天的扩展中。

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

  

在初始化核心数据堆栈的地方,您将添加商店   你的persistentStoreCoordinator有点像这样:

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

只需更改storeURL的先前值即可   (通常在NSDocumentDirectory中的某个地方)到包含在的位置   您的共享App Group文件夹。您可以使用

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

......我不了解如何/在何处实施。

我想我必须像在appDelegate中那样在我的扩展中设置MagicalRecord堆栈,但当然它失败了。

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

我需要发布的任何代码让我知道。

提前致谢

3 个答案:

答案 0 :(得分:5)

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

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

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

[MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:(id)pathToStore];

答案 1 :(得分:4)

我有同样的问题,我可以通过跟随这个线程来修复它。 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]];
}

然后在我的扩展程序中,我刚刚将以下内容添加到其视图中的load方法。

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

答案 2 :(得分: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];
}