2014-09-26 16 views
8

Sperando che tu possa aiutare. Sto aggiungendo il supporto di oggi alla mia app, che usa MagicalRecord https://github.com/magicalpanda/MagicalRecord per gestire tutti i miei file CoreData.MagicalRecord (CoreData) + Today Extension (iOS8) ... giocheranno?

che sto strappando i capelli cercando di capire come alla superficie i miei dati nell'estensione oggi.

Ho abilitato i gruppi di app come descritto qui http://blog.sam-oakley.co.uk/post/92323630293/sharing-core-data-between-app-and-extension-in-ios-8 tuttavia tutta la documentazione e i post StackOverflow che sto leggendo si riferiscono all'utilizzo diretto di CoreData. MagicalRecord fa un sacco di duro lavoro per te, ed è per questo che l'ho usato poiché ero totalmente nuovo all'inizio di questo progetto. Quindi le cose come:

Dove si inizializza il vostro stack Core Data, si aggiungeremo un negozio per vostro persistentStoreCoordinator un po 'qualcosa di simile a questo:

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

E' semplicemente una questione di modificare il valore precedente per storeURL (di solito da qualche parte in NSDocumentDirectory) in una posizione contenuta in la cartella del gruppo di app condivisa. A tale scopo, utilizza

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

... non ci sto capendo come/dove implementare.

Avevo immaginato che avrei dovuto semplicemente impostare lo stack MagicalRecord nella mia estensione come faccio nel mio appDelegate, ma ovviamente non funziona.

Davvero sperando che qualcuno potrebbe essere in una situazione simile ed essere in grado di far luce su come andare avanti con questo.

Tutto il codice è necessario per me per pubblicare fino fammelo sapere.

Grazie in anticipo

+0

Probabilmente la pena di aggiungere, MagicalRecord w interrompe tutto lo stack CoreData, quindi sono riluttante ad andare in giro e spezzare potentemente ciò che sta già funzionando. –

+0

@Emilie, sei riuscito a risolverlo? – marcelosalloum

risposta

4

Ho avuto lo stesso problema sono stato in grado di risolvere il problema seguendo questo thread. https://github.com/magicalpanda/MagicalRecord/issues/858

ho aggiornato il seguente metodo in 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]]; 
} 

Poi nel mio estensione Ho appena aggiunto il testo seguente la sua vista ha metodo di caricamento.

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

L'ultima parte non è @ "gruppo.yourIdentifier ", dovrebbe essere quello che hai usato per storeFileName. – jwhat

+0

Questo è corretto, ho aggiornato la mia risposta –

+0

Questo effettivamente causa la svuotamento dei dati di base se li si rilascia come aggiornamento di un'app esistente. – jwhat

5

Non sono sicuro se questo funziona su versioni precedenti di MagicalRecord, ma come di 2.2 si può solo passare l'URL finale come il nome del negozio:

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

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

[MagicalRecord setupCoreDataStackWithAutoMigratingSqliteStoreNamed:(id)pathToStore]; 
3

Change

[MagicalRecord setupCoreDataStackWithStoreNamed:@"Database"]; 

a

- (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

Mi piace questa idea, fondamentalmente impostando le cose manualmente, ma fai attenzione. La prima riga per controllare il defaultStoreCoordinator è impostata per impostazione predefinita crea automaticamente un coordinatore se non ne esiste uno, in modo che sia sempre non nullo e non venga eseguito nessuno dei seguenti codici. Se si desidera eseguire questa operazione, è necessario aggiungere [MagicalRecordHelpers setShouldAutoCreateDefaultPersistentStoreCoordinator: NO] in cima a quel metodo. –

Problemi correlati