2014-12-05 11 views
13

Ho un problema con SQLCipher crittografia db e CoreData: Quando utilizzo il coordinatore di archivio persistente con SQLCipher, si blocca sempre con una relazione di errore uno-a-molti dopo la prima app rilancio. Così quando lancio la prima volta l'app, creo NSManagedObjects con le relazioni, quindi, quando salvi db e riapri l'app, si blocca quando provo ad accedere a queste relazioni. Senza SQLCipher tutto funziona correttamente.Problema SQLCipher e CoreData: CoreData non è riuscito a risolvere un errore per

Qui è il codice per SQLCipher persistente negozio di inizializzazione:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator 
{ 
    if (!_persistentStoreCoordinator) { 
     NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"MyApp.sqlite"]; 
     NSDictionary *options = @{EncryptedStorePassphraseKey: @"MyApp", 
                  EncryptedStoreDatabaseLocation: storeURL}; 
     NSError *error; 
     _persistentStoreCoordinator = [EncryptedStore makeStoreWithOptions:options managedObjectModel:[self managedObjectModel] error:&error]; 
     if (error) { 
      NSLog(@"%@", error); 
     } 
    } 

    return _persistentStoreCoordinator; 
} 

codice in cui creo NSManagedObject:

- (id)createObjectWithClassName:(NSString *)name 
{ 
    NSManagedObject *object = [[NSClassFromString(name) alloc] initWithEntity:[NSEntityDescription entityForName:name inManagedObjectContext:self.context] insertIntoManagedObjectContext:self.context]; 
    return object; 
} 
+0

Che aspetto ha il codice che crea gli oggetti gestiti? –

+0

@TomHarrington Ho aggiornato il post con NSManagedObject codice di creazione –

+0

link utile: https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/Articles/cdTroubleshooting.html – Bhushan

risposta

1

Finalmente trovo la risposta da solo.

Esaminare diversi casi e ho calcolato che il problema si verifica solo nel mio modello di dati.

Il problema era che ho una proprietà nella classe NSManagedObject con il nome "index".

Sembra che SQLCipher utilizzi internamente tali proprietà e che esistano conflitti con esso. Dopo averlo rinominato con un altro nome, tutto funziona!

1

Con SQLCipher assicuratevi di avere un nuovo database SQLite. Cercando di eseguire il pragma del database con una chiave mentre ha già dati per qualche ragione, prova solo a decodificarlo.

ATTACH DATABASE 'encrypted.db' AS encrypted KEY 'secret'; -- create a new encrypted database 
CREATE TABLE encrypted.t1(a,b); -- recreate the schema in the new database (you can inspect all objects using SELECT * FROM sqlite_master) 
INSERT INTO encrypted.t1 SELECT * FROM t1; -- copy data from the existing tables to the new tables in the encrypted database 
DETACH DATABASE encrypted; 

-

//For persistentStoreCoordinator: 
// Give modelName = @"MyApp.sqlite"; 
-(NSPersistentStoreCoordinator *)persistentStoreCoordinator:(NSString*)modelName 
{ 
    if (persistentStoreCoordinator != nil) { 
     return persistentStoreCoordinator; 
    } 


    NSString *docs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 
    @"PushNoticationModal.sqlite" 
    NSURL *storeUrl = [NSURL fileURLWithPath:[docs stringByAppendingPathComponent:modelName]]; 
    NSError *error = nil; 
    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
          [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
          [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]; 

    NSError *error; 
    persistentStoreCoordinator = [EncryptedStore makeStoreWithOptions:options managedObjectModel:[self managedObjectModel] error:&error]; 
    if (error) { 
    NSLog(@"%@", error); 
    } 

    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) { 
     NSLog(@"persistentStoreCoordinator Error: %@,%@",error,[error userInfo]); 
    } 



    return persistentStoreCoordinator; 
} 
+0

Il tuo codice non mi aiuta. E ha anche un problema logico: tu crei 'persistentStoreCoordinator' due volte (normale ed ecnriptato), che non ha senso ... –

+0

l'ultima volta c'è qualche errore, che ho corretto ma bot testato, a causa della mancanza di tempo. –