iphonesqlitecore-dataimport

Importing SQLite to CoreData


I have imported SQLite prepopulated dbs to my coredata projects before, but now I have created a project in the 3.2.5. xcode, which changes nsurl for nstring in the AppDelegate, so I went with that. But now my SQLite doesn't import to the project.

If I leave my PersistentStoreCoordinator to create the new db blank, it works fine,

 NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"ChildCare_v02.sqlite"];

but when I change the code to import the prepopulated db (called the same just to clarify), it gives me a warning and crashes,

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator_ != nil) {
return persistentStoreCoordinator_;
}
NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"ChildCare_v02.sqlite"]; //WARNING !! here
NSURL *storeUrl = [NSURL fileURLWithPath:storePath]; 
//NSURL *storeURL = [[self applicationDocumentsDirectory]    URLByAppendingPathComponent:@"ChildCare_v02.sqlite"]; //actual SDK style for blank db

// Put down default db if it doesn't already exist
    NSFileManager *fileManager = [NSFileManager defaultManager];
   if (![fileManager fileExistsAtPath:storePath]) {
    NSString *defaultStorePath = [[NSBundle mainBundle]  pathForResource:@"ChildCare_v02" ofType:@"sqlite"];
    if (defaultStorePath) {
        [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
    }
    }
NSError *error = nil;
persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc]  initWithManagedObjectModel:[self managedObjectModel]];
if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:nil error:&error]) {
   
  
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
    }    
    return persistentStoreCoordinator_;
    }

THIS is the crash log in console:

-[NSURL stringByAppendingPathComponent:]: unrecognized selector sent to instance  0x5b40e50
 2011-02-15 21:06:59.245 Staff_02c[469:207] *** Terminating app due to uncaught  exception 'NSInvalidArgumentException', reason: '-[NSURL stringByAppendingPathComponent:]:     unrecognized selector sent to instance 0x5b40e50'

How do I fix this?

Just when I thought I was getting Core data !! dough!!


Solution

  • Based on Ishu pointing to the NSArray way, this was the solution I ended up with:

    - (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
    
    if (persistentStoreCoordinator_ != nil) {
        return persistentStoreCoordinator_;
    }
    
     
    
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"ChildCare_v02.sqlite"];
    
    NSString *storePath = [[NSBundle mainBundle] pathForResource:@"ChildCare_v02" ofType:@"sqlite"];
    
         
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"ChildCare_v02.sqlite"]; //este es el que sirve!!! CREE ESTE
    
    NSLog(@"store URL %@", storeURL);
    
        // Put down default db if it doesn't already exist
    NSFileManager *fileManager = [NSFileManager defaultManager];
    if (![fileManager fileExistsAtPath:writableDBPath]) {
        NSLog(@"proceda aqui");
        NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"ChildCare_v02" ofType:@"sqlite"];
        NSLog(@"no existe todavia");
        NSLog(@"defalultStorePath %@", defaultStorePath);
        
                
        if (defaultStorePath) {
          [fileManager copyItemAtPath:defaultStorePath toPath:writableDBPath error:NULL];
            NSLog(@"storePath= %@", storePath);
        }
    }    
    
    NSError *error = nil;
    persistentStoreCoordinator_ = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    if (![persistentStoreCoordinator_ addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
    
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
    abort();
        }    
    
       return persistentStoreCoordinator_;
        }
    

    Note that first need to create blank db, to keep the structure and then populated (I used SQLite database browser to import CSV columns to my SQLite).

    ss9