2016-01-30 3 views
2

Я разрабатываю TodayExtension для приложения производительности для списков задач, и мне нужно показать список некоторых задач в таблице внутри TodayExtension.Использование MagicalRecord (CoreData) внутри TodayExtension

У меня нет проблем с настройкой представления таблицы, но у меня есть сбой, когда я пытаюсь настроить MagicalRecord и CoreData.

Мой исходный код метода, который Крэш:

- (void)setupCoreDataStackWithStoreNamed:(NSString *)storeNamed 
{ 
    if ([NSPersistentStoreCoordinator MR_defaultStoreCoordinator] != nil) 
    { 
     return; 
    } 

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

    NSString *containerPath = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:APP_GROUP].path; 
    NSString *sqlitePath = [NSString stringWithFormat:@"%@/%@", containerPath, storeNamed]; 
    NSURL *storeURL = [NSURL URLWithString:sqlitePath]; 

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

И линия с грохотом является:

[psc MR_addSqliteStoreNamed:storeURL withOptions:nil]; 

Сообщение об ошибке:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'CoreData SQL stores only support file URLs (got /private/var/mobile/Containers/Shared/AppGroup/66A40F3A-9E25-42BD-9BD0-D86BC5A93FBD/myappname_560967e1665e88ab37000000.sqlite).' 

Я получил вдохновение от этого поста How to access CoreData model in today extension (iOS)

ответ

1

Вы передаете NSString URL (/ ../...) в MR_addSqliteStoreNAamed, но аварии сказать вам, что вам нужно передать файл URL (файл: // ...)

Так у вас есть изменить этот исходный код:

NSString *containerPath = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:APP_GROUP].path; 
NSString *sqlitePath = [NSString stringWithFormat:@"%@/%@", containerPath, storeNamed]; 
NSURL *storeURL = [NSURL URLWithString:sqlitePath]; 

к этому:

NSURL *storeURL = [[NSFileManager defaultManager] containerURLForSecurityApplicationGroupIdentifier:APP_GROUP]; 
storeURL = [storeURL URLByAppendingPathComponent:storeNamed]; 

Другим решением может быть сделать это:

NSString *pathToYourSqliteFile = @"/your/path/here"; 
NSURL *storeURL = [NSURL fileURLWithPath: isDirectory:NO]; 
Смежные вопросы