希望您能提供帮助。我正在为我的应用程序添加"今日"支持,该应用程序使用MagicalRecordhttps://github.com/magicalpanda/MagicalRecord管理我所有的CoreData。
我拼命想知道如何将我的数据显示到Today扩展中。
我已启用此处列出的应用程序组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中的某个位置)您的共享应用程序组文件夹。你可以使用
containerURLForSecurityApplicationGroupIdentifier: NSURL *directory =
[[NSFileManager defaultManager]
containerURLForSecurityApplicationGroupIdentifier:@"group.YourGroupName"];
NSURL *storeURL = [directory
URLByAppendingPathComponent:@"YourAppName.sqlite"];
我不知道如何/在哪里实施。
我原以为我只需要像在appDelegate中那样在扩展中设置MagicalRecord堆栈,但它当然失败了。
真的希望有人可能处于类似的情况,并能够阐明如何推进这一进程。
你需要我发布的任何代码都请告诉我。
提前感谢
不确定这是否适用于以前版本的MagicalRecord,但从2.2开始,您可以将最终url作为商店名称传递:
NSFileManager *fileManager = [[NSFileManager alloc] init];
NSURL *directory = [fileManager containerURLForSecurityApplicationGroupIdentifier:@"group.yellow"];
NSURL *pathToStore = [directory URLByAppendingPathComponent:kMagicalRecordDefaultStoreFileName];
[MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:(id)pathToStore];
我遇到了同样的问题,我可以通过遵循这个线程来解决它。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]];
}
然后在我的扩展中,我只是将以下内容添加到它的视图dod-load方法中。
- (void)viewDidLoad {
[super viewDidLoad];
[MagicalRecord setupCoreDataStackWithStoreNamed:<storeFileName>];
}
更改
[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];
}