Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Core Data addPersistentStoreWithType return nil, but error is nil too

I'm creating a NSPersistentStore with the code below.

NSPersistentStore * pc = [persistentCoordinator 
                             addPersistentStoreWithType:EncryptedStoreType
                                          configuration:nil 
                                                    URL:databaseURL
                                                options:options 
                                                  error:error];

if (*error)
{
    NSLog(@"Unable to add persistent store.");
    NSLog(@"Error: %@\n%@\n%@", *error, [*error userInfo], [*error localizedDescription]);
}

The value of options is

{
    EncryptedStore = SQLite;
    EncryptedStoreDatabaseLocation = 
 "file:///var/mobile/Containers/Data/Application/0C27F628-3FF0-467F-8EF1-5974EBBD3620/Documents/DBEncrypted.sqlite";
    EncryptedStorePassphrase = "xxxxxxxxredactedxxxxxxx";
    NSInferMappingModelAutomaticallyOption = 1;
    NSMigratePersistentStoresAutomaticallyOption = 1;
    NSSQLitePragmasOption =     {
        synchronous = OFF;
    };
}

At this point *error is nil and pc is nil too.

According to Apple's documentation if the function returns nil should be an error. Does anyone saw it before?

The EncryptedStoreType is from https://github.com/project-imas/encrypted-core-data

The error only happens if we are migrating the Data Store

EDIT: Full code of method:

+ (NSPersistentStoreCoordinator *)makeStoreWithOptions:(NSDictionary *)options managedObjectModel:(NSManagedObjectModel *)objModel error:(NSError *__autoreleasing *)error
{
    NSPersistentStoreCoordinator * persistentCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:objModel];

    //  NSString* appSupportDir = [NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES) objectAtIndex:0];

    BOOL backup = YES;
    NSURL *databaseURL;
    id dburl = [options objectForKey:EncryptedStoreDatabaseLocation];
    if(dburl != nil) {
        if ([dburl isKindOfClass:[NSString class]]){
            databaseURL = [NSURL URLWithString:[options objectForKey:EncryptedStoreDatabaseLocation]];
            backup = NO;
        }
        else if ([dburl isKindOfClass:[NSURL class]]){
            databaseURL = dburl;
            backup = NO;
        }
    }

    if (backup){
        NSString *dbNameKey = (__bridge NSString *)kCFBundleNameKey;
        NSString *dbName = NSBundle.mainBundle.infoDictionary[dbNameKey];
        NSFileManager *fileManager = [NSFileManager defaultManager];
        NSURL *applicationSupportURL = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
        [fileManager createDirectoryAtURL:applicationSupportURL withIntermediateDirectories:NO attributes:nil error:nil];
        databaseURL = [applicationSupportURL URLByAppendingPathComponent:[dbName stringByAppendingString:@".sqlite"]];

    }

    [persistentCoordinator addPersistentStoreWithType:EncryptedStoreType configuration:nil URL:databaseURL
        options:options error:error];

    if (*error)
    {
        NSLog(@"Unable to add persistent store.");
        NSLog(@"Error: %@\n%@\n%@", *error, [*error userInfo], [*error localizedDescription]);
    }

    return persistentCoordinator;
}

I call it in

- (void) initCoreDataProperties
{
    NSError *error;

    // Creating the Managed Object Model from momd
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:TBCoreDataModelFileName withExtension:@"momd"];
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];

    // Creating the Encrypted Store Persistent Coordinator
    _persistentStoreCoordinator = [EncryptedStore makeStoreWithOptions: [self persistentStoreOptions]
                                                    managedObjectModel: self.managedObjectModel
                                                                 error: &error];
like image 336
ppaulojr Avatar asked Sep 30 '15 15:09

ppaulojr


1 Answers

First, do not check the error for an error state. Only check the return of the call to -addPersistentStoreWithType.... The error can be populated even in a non-error condition.

Your code looks fine so I suspect if you turned off the encrypted store and used an Apple provided SQLite store then it would work fine. Which means the issue is with that third party code.

Since the third party code is not providing you with an error or a NSPersistentStore then it is failing poorly and you need to open a bug against the code base so that the author can address it.

Or you can walk through that third part code and see where it is failing and why.

like image 111
Marcus S. Zarra Avatar answered Oct 18 '22 16:10

Marcus S. Zarra