заполненный sql lite db пуст при переносе на ipad - PullRequest
1 голос
/ 01 августа 2011

У меня есть приложение с основными данными, которое я использую с базой данных sql lite.Я заполнил его в моем симуляторе, и теперь я хотел бы отправить его с приложением, , но всякий раз, когда я устанавливаю его на ipad, БД пуста!

У меня естьдобавил заполненную базу данных в проект (из папки симулятора), и у меня в делегате есть следующее:

- (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] 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;
}

Любые идеи?

РЕДАКТИРОВАНИЕ ДОБАВИТЬ:

Когда я исследую iPad с помощью iphone explorer, я вижу исходную заполненную БД в пути приложения, поэтому она копируется.Это значит, что я должен ошибаться.,,

верно?

Ответы [ 2 ]

1 голос
/ 01 августа 2011

Поскольку хранилище всегда пустое, это означает, что постоянный координатор хранилища не находит существующее хранилище по указанному вами URL-адресу, поэтому он создает новое пустое хранилище. Наиболее вероятное объяснение отсутствующего хранилища состоит в том, что оно не копируется туда, куда, по вашему мнению, оно копируется.

Никогда не используйте один и тот же метод дважды, чтобы получить путь к файлу по умолчанию в комплекте приложений или к файлу readwrite в документах. Каждый раз, когда вы создаете путь, вы используете другой код. Это позволяет генерировать разные пути в разных точках кода. Выберите один метод для создания каждого пути и при необходимости используйте повторно.

Я бы предложил зарегистрировать все пути и URL-адреса, чтобы подтвердить, что все они указывают, где вы думаете, что они делают. Я также рекомендовал бы ошибки перехвата для операций управления файлами. Вы можете получить ошибки, даже если возвращаемое значение bool равно YES.

0 голосов
/ 01 августа 2011

Вот решение. Скопируйте заполненную базу данных в свой проект, скопировав ее из симулятора. Затем удалите приложение с устройства и выполните новую установку, после чего приложение скопирует заполненную базу данных, в противном случае, если пустая база данных уже существует, оно больше не будет копировать базу данных. Смотри в своем коде

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

success = [fileManager fileExistsAtPath:writableDBPath];
if (success)//database already copied
    return;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...