2014-09-26 2 views
8

Надеюсь, вы сможете помочь. Я добавляю поддержку Today для моего приложения, которое использует MagicalRecord https://github.com/magicalpanda/MagicalRecord для управления всем моим материалом CoreData.MagicalRecord (CoreData) + Today Extension (iOS8) ... Они будут играть?

Я разрываю волосы, пытаясь понять, как нарисовать мои данные в расширении 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"]; 

... Я не понимая, как/где реализовать.

Я бы предположил, что мне просто нужно создать стек MagicalRecord в моем расширении, как и в моем приложении appDelegate, но, конечно же, он терпит неудачу.

Действительно надеясь, что кто-то может быть в подобной ситуации и сможет пролить свет на то, как двигаться вперед с этим.

Любой код, который вам нужен для отправки, просто сообщите мне.

Заранее спасибо

+0

Возможно, стоит добавить, MagicalRecord w перехватывает весь стек CoreData, поэтому я колеблюсь, чтобы заглянуть и сломать то, что уже работает. –

+0

@ Эмили, вам удалось ее решить? – marcelosalloum

ответ

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]]; 
} 

Тогда в моем расширения я просто добавил следующее к его мнению, сделал метод загрузки.

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

Эта последняя часть не является группой @.yourIdentifier ", это должно быть все, что вы использовали для storeFileName. – jwhat

+0

Это правильно, я обновил свой ответ. –

+0

Это фактически приводит к тому, что данные ядра будут пустыми, если вы отпустите это как обновление существующего приложения. Ищете другое решение ... – jwhat

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]; 
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]; 
} 
+1

Мне нравится эта идея, в основном настраивая вещи вручную, но будьте осторожны. Ваша первая строка для проверки установленного по умолчаниюStoreCoordinator установлена по умолчанию автоматически создавать координатор, если он не существует, поэтому он всегда будет не равным нулю, и ни один из приведенных ниже кодов не будет запущен. Если вы хотите сделать это, вам нужно будет добавить [MagicalRecordHelpers setShouldAutoCreateDefaultPersistentStoreCoordinator: NO] , до самого верха этого метода. –

Смежные вопросы