无法将文件从NSBundle复制到文档目录

时间:2011-11-08 07:24:44

标签: iphone objective-c ios xcode ipad

我想将我的数据库从NSBundle复制到文档目录。

这是复制文件的代码:

- (NSString *) getDBPath 
{
  NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
  NSString *documentsDir = [paths objectAtIndex:0];
  return [documentsDir stringByAppendingString:@"Mydata.sqlite"];
}

- (void) copyDatabaseIfNeeded 
{
  NSFileManager *fileManager = [NSFileManager defaultManager];
  NSError *error;
  NSString *dbPath = [self getDBPath];
  BOOL success = [fileManager fileExistsAtPath:dbPath];

  if(!success) {

    NSString *defaultPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Mydata.sqlite"];
    success = [fileManager copyItemAtPath:defaultPath toPath:dbPath error:&error];

    if (!success)
        NSAssert1(0, @"Failed to create writable file with message '%@'.", [error localizedDescription]);
  }
}

但为什么当我在iPad上运行此应用程序时,它会崩溃?

2 个答案:

答案 0 :(得分:0)

检查此行

NSString *defaultPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Photo.png"];

我认为这是错误的道路

答案 1 :(得分:0)

如果您使用的是Core Data,我的建议是在启动时管理数据库“移动”。 只需使用Core Data Stack管理(您可以从内置的teplate免费获得)。

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (persistentStoreCoordinator_ != nil) {
        return persistentStoreCoordinator_;
    }

    NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent:@"MyData.sqlite"];
    NSFileManager *fileManager = [NSFileManager defaultManager];
    if (![fileManager fileExistsAtPath:storePath]) {
        NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@"MyData" ofType:@"sqlite"];
        if (defaultStorePath) {
            [fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
        }
    }

    NSURL *storeURL = [NSURL fileURLWithPath: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_;
}

- (NSString *)applicationDocumentsDirectory {
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}

我在管理数据时总是使用该代码。