删除sqlite数据库并从bundle中替换为default

时间:2012-07-06 07:52:56

标签: ios database xcode sqlite replace

我在Xcode 4.3.3中使用了Master-Detail-Application示例来开发数据查看器。该应用程序正在下载多个文件,并将每个文件附加到tableview上的单元格。一切正常。但如果用户再次开始下载,我需要从数据库和tableview中删除所有以前的数据。 我最终得到了以下步骤:

  1. 从协调员
  2. 中删除旧商店
  3. 删除旧的sqlite数据库文件
  4. 将bundle dir中的默认(空)sqlite db文件复制到doc dir
  5. 更新商店协调员
  6. 更新tableview。
  7. 但现在问题是,如果我这样做,新数据不会写入sqlite文件。 请有人检查我的代码。以下代码位于MasterViewController.m!我工作了几天,我完全陷入困境!!!

    谢谢!

    NSLog(@"Delete existing database file and copy default from bundle dir!");
    
    NSFileManager* fileManager = [[NSFileManager alloc] init];
    fileManager = [[NSFileManager alloc] init];
    
    NSError *error = nil;
    
    //get the documents directory:    
    
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    
    // create database path documents dir
    
    NSString *databasepath = [documentsDirectory stringByAppendingPathComponent:@"MyDatabase.sqlite"];
    NSLog(@"Destination Database Path = %@", databasepath);
    
    // create database path bundle dir
    
    NSString *resourceDBFolderPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"MyDatabase.sqlite"];
    NSLog(@"Recource Database Path = %@", resourceDBFolderPath);
    
    // remove old store from coordinator
    error = nil;
    
    NSManagedObjectModel *managedObjectModel;
    
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"MyDatabase" withExtension:@"momd"];
    managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    
    // Returns the persistent store coordinator for the application.
    // If the coordinator doesn't already exist, it is created and the application's store added to it.
    NSPersistentStoreCoordinator *persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL]];
    
    NSURL *applicationDocumentsDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
    
    NSURL *storeURL = [applicationDocumentsDirectory URLByAppendingPathComponent:@"MyDatabase.sqlite"];    
    
    if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) 
        if (error != nil){
    
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        }    
    
    
    NSPersistentStore *persistentStore = [[persistentStoreCoordinator persistentStores] objectAtIndex:0];
    [persistentStoreCoordinator removePersistentStore:persistentStore error:&error];
    if (error) 
        if (error != nil){
            NSLog(@"error removing persistent store %@ %@", error, [error userInfo]);
        }
    
    // Remove old database file
    
    [[NSFileManager defaultManager] removeItemAtPath: [documentsDirectory stringByAppendingPathComponent: @"MyDatabase.sqlite"] error: &error];
    if (error != nil){
        NSLog(@"delete Database status: %@", [error localizedDescription]);
    }
    
    // copy default empty database file into documents dir
    
    [fileManager copyItemAtPath: resourceDBFolderPath toPath: databasepath           
                          error: &error];
    if (error != nil){
        NSLog(@"copy default Database status: %@", [error localizedDescription]);
    } 
    
    
    // then update storecoordinator
    
    // add clean store file back by adding a new persistent store with the same store URL
    if (![persistentStoreCoordinator addPersistentStoreWithType: NSSQLiteStoreType 
                                                  configuration: nil 
                                                            URL: storeURL 
                                                        options: nil 
                                                          error: &error]) {
        NSLog(@"failed to add db file, error %@, %@", error, [error userInfo]);
    }
    
    
    NSLog(@"Database replacement end!");        
    

0 个答案:

没有答案