2011-12-20 7 views
1

私はpl35との間でNSArrayを読み書きすることに基づいていくつかの問題を抱えています。NSArrayを読み書きする方法は?

最初の読み込み時にアプリケーションデータを初期化するために使用するplistファイルを 'Supporting Files'フォルダに作成しました。私は、その後からデータをロードしようと

NSError *error; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    filePath = [documentsDirectory stringByAppendingPathComponent:kDataFile]; 

    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    if (![fileManager fileExistsAtPath:filePath]) 
    { 
     NSString *bundle = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"]; 
     [fileManager copyItemAtPath:bundle toPath:filePath error:&error]; 
    } 

enter image description here

私はその後、アプリにplistのをロードしようとするために、このコードを使用します。ここでは

は私のplistは、次のようになりますplistファイルはそうですが、何も表示されないようです。

NSMutableDictionary *savedData = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath]; 
NSMutableArray *myNSArray = [[savedData objectForKey:@"KEY_Level_1"] mutableCopy]; 
savedData = nil; 

申し訳ありませんが、これは単純な作業であれば、しかし私は、チュートリアルの多くを見ていない運でこれを行う方法を動作するようにしようとしてきました。私は今、本当にイライラしています - 私はそれが簡単なことでなければならないと思っていたでしょう。

注:私のNSArrayには、NSDictionariesがたくさん含まれています。

あなたが copyItemAtPath:toPath:error:の戻り値をチェックして、メソッドがfalseを返した場合、少なくとも、エラーをログに記録する必要がある
+0

ログステートメントを配置するか、デバッガを各ステージに配置して、どこで失敗しているかを確認する必要があります。すべてのパスが期待どおりに設定されていることを確認し、ファイルがコピーされているかどうかなどを確認します。あなたのコードで明らかに間違っているように見えるものはありません。ファイルはコードと同じですか? plistはターゲットに含まれていますか? – jrturton

答えて

0
  1. if (![fileManager copyItemAtPath:bundle toPath:filePath error:&error]) { 
        NSLog(@"error: copyItemAtPath:%@ toPath:%@ error:%@", bundle, filePath, error); 
        return; 
    } 
    
  2. -[NSDictionary initWithContentsOfFile:]はエラーを報告する方法がありませんので、それは失敗だ場合、あなたは理由を簡単に理解できません。 NSDataにファイルを読み込み、それを解析する-[NSPropertyListSerialization propertyListWithData:options:format:error:]を使用してみてください:

    NSData *data = [NSData dataWithContentsOfFile:filePath options:0 error:&error]; 
    if (!data) { 
        NSLog(@"error: could not read %@: %@", filePath, error); 
        return; 
    } 
    NSMutableDictionary *savedData = [NSPropertyListSerialization propertyListWithData:data options:NSPropertyListMutableContainers format:NULL error:&error]; 
    if (!savedData) { 
        NSLog(@"error: could not parse %@: %@", filePath, error); 
        return; 
    } 
    NSMutableArray *myNSArray = [savedData objectForKey:@"KEY_Level_1"]; 
    savedData = nil; 
    if (!myNSArray) { 
        NSLog(@"error: %@: object for KEY_Level_1 missing", filePath); 
        return; 
    } 
    

あなたがこれを行う場合は、あなたのデータがロードされていない理由をより簡単に確認することができます。さらに検査で

UPDATE

あなたのplistのトップレベルの辞書がキー「ルート」が含まれているように、それが見えます。 "Root"の値はキー "KEY_Level_1"を含む辞書です。これを行う必要があります:

NSMutableArray *myNSArray = [[savedData objectForKey:@"Root"] objectForKey:@"KEY_Level_1"]; 
+0

...または '[savedData valueForKeyPath:@" Root.KEY_Level_1 "]'。 – jlehr

関連する問題