2011年11月29日 星期二

iOS - Training (8) - Data Access

iOS App目錄結構 -----
<APP_HOME>:iOS為了保護APP而在每次開啓APP時會給予流水號。
<APP_HOME>/AppName.app:主程式碼,亦稱bundle,不被iTunes備份。
<APP_HOME>/Documents:資料永久存放地,會備份。
<APP_HOME>/Library:非使用者資料相關,會備份。
<APP_HOME>/Library/Preferences:透過NSUserDefaults存放的程式相關設定檔(同Android的SharedPreference),會備份。
<APP_HOME>/Library/Caches:更新時暫存資料區,不備份。
<APP_HOME>/tmp:暫時性資料,不備份。
-----


在Xcode中,黃色的資料夾代表group,表示非實際存在的資料夾。而藍色的資料夾才代表實際存在檔案系統中的資料夾。


取得檔案路徑 -----
取出指定檔案的路徑:
// pathForResouce為檔名,ofType為檔案型態
[[NSBundle mainBundle] pathForResource:@"icon" ofType:@"png"];
加上指定資料夾取出路徑:
[[[NSBundle mainBundle] bundlePath] stringByAppendingString:@"/test/icon.png];
或:
// inDirectory為資料夾名稱
[[NSBundle mainBundle] pathForResource:@"icon" ofType:@"png" inDirectory:@"test"];

取<APP_HOME>/Documents 內的檔案路徑(simulator與實機取出的路徑不相同):
NSArray* path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* documentsDirectory = [paths objectAtIndex:0];

取<APP_HOME>/tmp:
NSTemporaryDirectory();
-----
<APP_HOME>/Library/Preferences 內資料存取 -----
    在New File中,開啓Setting Bundle,會出現相關的.plist,裡頭可以增減設定的參數。在程式中呼叫的話是以identifier為key來取得其中的參數,所以identifier不能重覆。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    [[NSUserDefaults standardUserDefaults] setValue:@"Michael" forKey:@"name_preference"]; //將Michael這個值放入key為name_preference的item中
    [[NSUserDefaults standardUserDefaults] synchronize]; //確定放入,同Android中的SharedPreference的commit方法
    NSLog(@"%@", [[NSUserDefaults standardUserDefaults] stringForKey:@"name_preference"]);
    
    return YES;
}
-----
Property List存取 -----
    若要存的文字檔並不是很大(不超過1MB,通常用來存取遊戲中的點數)時,將內容存在Property List中。
開啟繼承UIViewController的類別
- (void)viewDidLoad
{
    [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
    // 將內容存入Array中,記得最後需加上nil表示array結束
    NSArray* myData = [NSArray arrayWithObjects:@"first", @"second", @"third", nil];

    // 將Document的路徑取出
    NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString* documentsDirectory = [paths objectAtIndex:0];

    // 加上檔案名稱。stringByAppendingPathComponent方法是將後面的參數加上"/",好處是如果今天是window系統時,會自動換成"\"
    NSString* filePath = [documentsDirectory stringByAppendingPathComponent:@"data.plist"];

    // 寫入檔案
    [myData writeToFile:filePath atomically:YES];
}
加入一個button並寫入動作
- (IBAction)readProperty:(id)sender {
    // 將Document的路徑取出
    NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString* docDirectory = [paths objectAtIndex:0];

    // 讀出檔案內資料
    NSString* filePath = [docDirectory stringByAppendingPathComponent:@"data.plist"];
    NSArray* dataArray = [NSArray arrayWithContentsOfFile:filePath];
    
    NSLog(@"%@", dataArray);
}
-----

資料出處《Object-C與iOS開發入門》

沒有留言:

張貼留言