0

練習用に非常にシンプルなアプリを作成していますが、アプリの起動時にplistファイルをロードできないようです。私はユーティリティ アプリ テンプレートを使用しています。以下は私のコードの一部です。

これは私がデータをロードしようとしている場所であり、plist へのパスがない場合は作成します。

-(void) loadData
{
// load data here
NSString *dataPath = [self getFilePath];
BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:dataPath];

NSLog(@"Does the file exist? %i", fileExists);
// if there is data saved load it into the person array, if not let's create the array to use
if (fileExists) {
    NSLog(@"There is already and array so lets use that one");
    personArray= [[NSMutableArray alloc] initWithContentsOfFile:dataPath];
    NSLog(@"The number of items in the personArray %i", personArray.count);
    arrayNumber.text = [NSString stringWithFormat:@"%i",personArray.count];
}
else
{
    NSLog(@"There is no array so lets create one");
    personArray = [[NSMutableArray alloc]init];
    arrayNumber.text = [NSString stringWithFormat:@"%i",personArray.count];
}
}

ここに可変配列があり、それを plist に追加しようとしています。// person オブジェクトを配列に追加 [personArray addObject:personObject];

    for (Person *obj in personArray)
    {
        NSLog(@"obj: %@", obj);
        NSLog(@"obj.firstName: %@", obj.firstName);
        NSLog(@"obj.lastName: %@", obj.lastName);
        NSLog(@"obj.email: %@", obj.email);
    }


    // check the count of the array to make sure it was added
    NSLog(@"Count of the personArray is %i", personArray.count);
    arrayNumber.text = [NSString stringWithFormat:@"%i",personArray.count];

    // check to see if the object was added
    NSLog(@"The number of items in the personArray %i", personArray.count);
    [personArray writeToFile:[self getFilePath] atomically:YES];

すべてが機能しているように見えます。配列にデータを記録して、そこにあることを確認できますが、アプリを再起動すると、plist データが取り込まれません。私はしばらくこれに取り組んできましたが、進歩していないようです。

ありがとう!

4

1 に答える 1

0

あなたの問題はinitWithContentsOfFile:方法です。

これは、ファイルに出力された配列表現を読み取ります。[1,2,3]これはおそらく、xml plist 形式よりもjson に近いものです。あなたがする必要があるのは、データを nsdata オブジェクトに読み込み、それをデシリアライズすることです。後で読み取ることができる形式でデータをファイルに保存するプロセスは、シリアライゼーションと呼ばれます。ファイルからシリアル化されたデータを読み取るプロセスは、逆シリアル化と呼ばれます。

答えに戻ります。まず、ファイルからデータを読み取ります

NSData * fileData = [[NSData alloc] initWithContentsOfFile:dataPath];

次に、デシリアライズする必要があります

NSError * __autoreleasing error = nil; //drop the autoreleasing if non-ARC
NSPropertyListFormat format = NSPropertyListXMLFormat_v1_0;
id array = [NSPropertyListSerialization propertyListWithData: fileData 
                                                     options:kCFPropertyListImmutable
                                                      format:&format 
                                                       error:&error];
if(error) {
       //don't ignore errors
}

実際には辞書ではなく配列であることを確認することもできます。

于 2013-10-13T16:08:34.360 に答える