2013-07-27 77 views
0

我試圖讓我的應用程序一個小字典,通過使用核心數據。當你使用一個主從應用,xxx.sqlite文件獲取用戶的文檔文件夾中創建。現在我纔開始首次應用,我改變了代碼如下,因爲我想在應用中xxx.sqlite文件:核心數據sqlite文件嵌入在我的應用程序?

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

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

    NSString* path= [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"CoreDataTest.sqlite"]; 

NSURL* storeURL = [[NSURL alloc] initFileURLWithPath:path]; 

我覺得最後兩個行會作出xxx.sqlite文件我的應用項目文件夾。其實它沒有。但該應用程序工作正常。這意味着xxx.sqlite文件嵌入在應用程序本身中?感謝您的時間。

+0

從模擬器移除應用程式,並再次運行應用程序。 –

+0

@Bhargavi感謝您的建議。我從模擬器中移除了我的應用程序並運行它,但我仍然無法在我的應用程序文件夾中找到xxx.sqlite文件,該應用程序仍然可以正常工作!我注意到的一件事是,在' Cache'文件夾中,我找到了這3個文件:Cache.db,Cache.db-shm和Cache.db-wal。他們與這種奇怪的行爲有關嗎? – boochan224

+0

當我運行查找。 -name「MyModel.sqlite」-print命令在終端上,我找到'xxx-xxx-xxx .../ /xxx.sqlite。我不明白嗎? – boochan224

回答

1

如果,我明白你的問題,你想包括與您的應用程序默認數據庫(即.sqlite文件將作爲項目的資產,那麼你需要將其從應用程序包複製到啓動時您的文檔目錄)。

然後調用您的didFinishLaunchingWithOptions方法此功能在您的應用程序委託。

- (void) copyDefaultDB 
{ 
    // If we are running the app for the first time, then copy our default database across from our app directory 
    // into our user directory 
    NSString *filePath; 

    // Get the path to the documents directory and append the databaseName 
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDir = [documentPaths objectAtIndex: 0]; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 

    filePath = [documentsDir stringByAppendingPathComponent: @"CoreDataFileTest.sqlite"]; 

    // If the database already exists then return without doing anything 
    if (![fileManager fileExistsAtPath: filePath]) 
    { 
     // Now copy the new shiny one in 

     NSString *filePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent: @"CoreDataFileTest.sqlite"]; 

     // Copy the database from the package to the users filesystem 
     [fileManager copyItemAtPath: filePathFromApp 
          toPath: filePath 
           error: nil]; 
    } 
} 
+0

感謝您的一段優秀代碼。我明白這是如何將文檔中的sqlite文件複製到我的項目文件夾。但我仍然不明白爲什麼我的應用程序在刪除Documents文件夾中的sqlite文件並將路徑切換到項目目錄後仍然有效。我的sqlite嵌入在應用程序中?這就是爲什麼我不能在項目文件夾中看到它? – boochan224

+0

嗨。我會在整理我的應用程序後執行此操作。再次感謝。 – boochan224

0

試試用此代碼。寫這裏面AppDelegate.m

- (NSManagedObjectContext *) managedObjectContext { 
    if (managedObjectContext != nil) { 
     return managedObjectContext; 
    } 

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; 
    if (coordinator != nil) { 
     managedObjectContext = [[NSManagedObjectContext alloc] init]; 
     [managedObjectContext setPersistentStoreCoordinator: coordinator]; 
    } 

    return managedObjectContext; 
} 

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator { 
    if (persistentStoreCoordinator != nil) { 
     return persistentStoreCoordinator; 
    } 
    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] 
               stringByAppendingPathComponent: @"ProjectManagement.sqlite"]]; 
    NSError *error = nil; 
    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] 
            initWithManagedObjectModel:[self managedObjectModel]]; 
    if(![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType 
               configuration:nil 
                  URL:storeUrl 
                 options:nil error:&error]){ 
     /*Error for store creation should be handled in here*/ 
    } 

    return persistentStoreCoordinator; 
} 

- (NSManagedObjectModel *)managedObjectModel { 
    if (managedObjectModel != nil) { 
     return managedObjectModel; 
    } 
    managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil]; 

    return managedObjectModel; 
} 

- (NSString*)applicationDocumentsDirectory{ 
    return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) objectAtIndex:0]; 
} 
相關問題