开发者

populated sql lite db is blank when transferred to ipad

I have a core data app that I am using with a sql lite db. I've populated it in my simulator and now I'd like to send it with the app, but whenever I install it on the ipad, the db is blank!

I've added the populated db to the project (from the simulator folder) and I have the following in the delegate:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
[window addSubview:splitViewController.view];
[window makeKeyAndVisible];

NSString *Path = [[NSBundle mainBundle] bundlePath];
NSString *DataPath = [Path stringByAppendingPathComponent:@"data.plist"];

NSDictionary *tempDict = [[NSDictionary alloc] initWithContentsOfFile:DataPath];
self.data = tempDict;
[tempDict release];

// Override point for customization after application launch.
// Add the split view controller's view to the window and display.
[self createEditableCopyOfDatabaseIfNeeded];


NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSMutableDictionary *appDefaults = [NSMutableDictionary dictionaryWithObject:@"NO" forKey:@"enableRotation"];
[appDefaults setObject:@"0" forKey:@"orientation"];
[appDefaults setObject:@"100" forKey:@"repID"];
[appDefaults setObject:@"Atlanta Dental" forKey:@"RepName"];
[defaults registerDefaults:appDefaults];

//self.window.rootViewController = self.splitViewController;
return YES;
}

-(void)createEditableCopyOfDatabaseIfNeeded
{
// Testing for existence
BOOL success;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
                                                     NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:DATABASE_NAME];

success = [fileManager fileExistsAtPath:writableDBPath];
if (success)
    return;

// The writable database does not exist, so copy the default to
// the appropriate location.
NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath]
                           stringByAppendingPathComponent:DATABASE_NAME];
success = [fileManager copyItemAtPath:defaultDBPath
                               toPath:writableDBPath
                                error:&error];
if(!success)
{
    NSFileManager *fileManager = [NSFileManager defaultManager];
    // If the expected store doesn't exist, copy the default store.
    //if ( ! [fileManager fileExistsAtPath:storePath])
    //{
        NSString *defaultStorePath = [[NSBundle mainBundle] 开发者_JAVA技巧pathForResource:@"D4" ofType:@"sqlite"];
        if ( defaultStorePath )
        {
            [fileManager copyItemAtPath:defaultStorePath toPath:writableDBPath error:NULL];
        }
    //}
    //NSAssert1(0,@"Failed to create writable database file with Message : '%@'.",
    //        [error localizedDescription]);
}
}


 - (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (persistentStoreCoordinator != nil)
{
    return persistentStoreCoordinator;
}

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:DATABASE_NAME];

NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                         [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
                         [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

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

return persistentStoreCoordinator;
}

Any ideas?

EDITED TO ADD:

When I explore the iPad with iphone explorer, I can see the original populated DB in the app path, so it is getting copied. That means I must have the above wrong. . .

right?


Since the store is always blank, that means the persistent store coordinator does not find an existing store at the URL you provide so it creates a new empty store. The most likely explanation for the missing store is that it is not being copied to where you think it is being copied.

You never use the same method twice to get the path to either the default file in the app bundle or the path to the readwrite file in the documents. Each time you create a path, you use different code. This makes it possible that you are generating different paths at different points in the code. Pick one method for generating each path and reuse as necessary.

I would suggest logging all the paths and URLs to confirm they all point where you think they do. I would also recommend trapping errors for file manage operations. You can get errors even if the bool return is YES.


Here is a solution. Copy populated db to your project by copying it from simulator. Then remove the app from device and do a fresh install then the app will copy the populated db other wise if blank db is already there then it will not copy the database again. See in your code

NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:DATABASE_NAME];

success = [fileManager fileExistsAtPath:writableDBPath];
if (success)//database already copied
    return;
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜