2010-05-18 131 views
0

我想讀/寫cache.plist的plist雞/蛋的情況

如果我想讀取存儲在資源文件夾中現有的預製plist文件,我可以去:

path = [[NSBundle mainBundle] bundlePath]; 
NSString *finalPath = [path [email protected]"cache.plist"]; 
NSMutableDictionary *root = ... 

但隨後我希望從iPhone讀取它。

不能,資源文件夾只能讀取。

所以我需要使用:

NSDocumentDirectory, NSUserDomain,YES 

所以,我怎麼能有我的plist文件預裝到文檔目錄的位置?

因此,我不必在啓動時複製plist文件的不整齊代碼。 (除非這是唯一的方法)。

回答

1

最終產品

NSString *path = [[NSBundle mainBundle] bundlePath]; 
NSString *finalPath = [path stringByAppendingPathComponent:@"Cache.plist"]; 


NSFileManager *fileManager = [NSFileManager defaultManager]; 
NSError *error; 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *giveCachePath = [documentsDirectory stringByAppendingPathComponent:@"Cache.plist"]; 


BOOL fileExists = [fileManager fileExistsAtPath:giveCachePath]; 

if (fileExists) { 
    NSLog(@"file Exists"); 
} 
else { 
    NSLog(@"Copying the file over"); 
    fileExists = [fileManager copyItemAtPath:finalPath toPath:giveCachePath error:&error]; 
} 

NSLog(@"Confirming Copy:"); 

BOOL filecopied = [fileManager fileExistsAtPath:giveCachePath]; 

if (filecopied) { 
    NSLog(@"Give Cache Plist File ready."); 
} 
else { 
    NSLog(@"Cache plist not working."); 
} 
1

我知道這不是你真正想要的,但據我所知,將文檔放入Documents文件夾的唯一方法是將其實際複製到那裏......但僅限於第一次啓動。我要去一個類似的SQLite數據庫。代碼如下,它的工作原理,但請注意,這可能與清理一點點做:

// Creates a writable copy of the bundled default database in the application Documents directory. 
- (void)createEditableCopyOfDatabaseIfNeeded { 
    // First, test for existence. 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"WordsDatabase.sqlite3"]; 
    createdDatabaseOk = [fileManager fileExistsAtPath:writableDBPath]; 
    if (createdDatabaseOk) return; 
    // The writable database does not exist, so copy the default to the appropriate location. 
    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"WordsDatabase.sqlite3"]; 
    createdDatabaseOk = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error]; 
} 

在你的AppDelegate就叫 - 不是太亂真的嗎?

1

簡單。首先查看它是否在文檔目錄中。如果不是,請在應用程序的資源文件夾([[NSBundle mainBundle] pathForResource...])中找到它,然後使用[[NSFileManager defaultManager] copyItemAtPath:...]將其複製到文檔目錄中。然後在文檔目錄中使用新鮮副本而不受懲罰。

+0

普里莫,我覺得兩個答案都或多或少我想聽到的聲音,有種給我一個全面的檢查。 謝謝Dave deLong和alku83 – 2010-05-18 07:25:43