4

ここからの回答を使用して一日中苦労しましたが、自分に合った解決策が見つからないので、助けを求めると思いました:

エンティティから抽出したオブジェクトの配列があります。

私がしたいのは、オブジェクトをファイルに書き込むことだけです。

これまでに思いついたのは次のとおりです。

    NSLog(@" Exported Records: %i", [exportArray count]); 
    // the count here is 4 records.
    //Each record has about 8 elements. 
//I'm just trying to get this working with the first two elements right now

        NSString *writeString = nil;
        NSError *error = nil;
        int i = 0;
        NSString *key = nil;
        NSString *tempString = nil;
        for (i=0; i<[exportArray count]; i++)
        {
            tempString = [tempString stringByAppendingString: @" \n "];

            for (int j=0; j<3; j++)
            {
                if (j == 0)
                {
                    key = [[exportArray objectAtIndex:i]  valueForKey:@"title"];
                    //[NSString stringWithFormat:tempString2, [[exportArray objectAtIndex:i]  valueForKey:@"title"]];
                }
                if (j == 1)
                {
                    key = [[exportArray objectAtIndex:i]  valueForKey:@"username"];
                    //[NSString stringWithFormat:tempString2, [[exportArray objectAtIndex:i]  valueForKey:@"username"]];
                }
                writeString = [NSString stringWithFormat:tempString, key];
            }
        }

        // Write to the file
        [writeString writeToFile:dataFile atomically:YES
                    encoding:NSUTF8StringEncoding error:&error];
        if (error)
        {
            NSLog(@"%@", error);
        }

現在、最後のアイテムを取得しているので、文字列を上書きしています。しかし、これを達成するためのより良い方法が必要です。ここに私の質問に一致する別の回答があるかどうかをお知らせください。または、いくつかのアイデアを投稿してください。

アップデート

exportArray をログに記録すると、次のようになります。

"<ItemEntity: 0x1ddf6560> (entity: ItemEntity; id: 0x1ddf46d0 <x-coredata://78FBC4A5-AE1A-4344-98AB-978126457D96/ItemEntity/p2> ; data: <fault>)",
    "<ItemEntity: 0x1ddf6800> (entity: ItemEntity; id: 0x1ddf46e0 <x-coredata://78FBC4A5-AE1A-4344-98AB-978126457D96/ItemEntity/p2051> ; data: <fault>)",
    "<ItemEntity: 0x1ddf6860> (entity: ItemEntity; id: 0x1ddf45d0 <x-coredata://78FBC4A5-AE1A-4344-98AB-978126457D96/ItemEntity/p3075> ; data: <fault>)",
    "<ItemEntity: 0x1ddf68c0> (entity: ItemEntity; id: 0x1ddf45e0 <x-coredata://78FBC4A5-AE1A-4344-98AB-978126457D96/ItemEntity/p5124> ; data: <fault>)"
)

実際の値をログに記録すると:

NSLog(@" Exported titles: %@", [exportArray valueForKey:@"title"]);
NSLog(@" Exported usernames: %@", [exportArray valueForKey:@"username"]);

正しい結果が得られます。これらと他の属性を結び付ける方法がわかりません..

  Exported titles: (
    1,
    2,
    4,
    6
)
  Exported usernames: (
    ellis,
    david,
    bea,
    ian
)
4

5 に答える 5

8

NSDictionaries配列にあるだけの場合は、writeToFile:atomically:これを使用してファイルを形式で保存でき.plistます (CSV よりもはるかに読みやすい)。

NSArray の Apple Docsと、 plistsに関する適切な記事を確認してください。

したがって、次のようになります。

[exportArray writeToFile:fileName atomically:YES];

編集:コア データ オブジェクトをファイルに保存することはできません。したがって、必要なデータだけを含む暫定的な配列を作成し、それをファイルに書き込む必要があります。

NSMutableArray* arrayToSave = [NSMutableArray arrayWithCapacity:exportArray.count];
[exportArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
    NSDictionary* exportDict = [NSDictionary dictionaryWithObjectsAndKeys:
                                [obj objectForKey:@"username"], @"username",
                                [obj objectForKey:@"title"], @"title", nil];
    [arrayToSave addObject:exportDict];
}];

[arrayToSave writeToFile:fileName atomically:YES];
于 2013-01-15T00:04:26.230 に答える
7

これを使って、

[exportArray writeToFile:dataFile atomically:YES];

NSArrayこれを行う方法writeToFile:があります。ここでドキュメントを確認してください。配列内にカスタム オブジェクトがない場合、これは正常に機能します。

タイトルまたはユーザー名のみを保存したい場合 (配列にカスタム オブジェクトがある場合でも)、次のように実行できます。

NSArray *array1 = [exportArray valueForKey:@"title"];
[array1 writeToFile:dataFile atomically:YES];

また

NSArray *array2 = [exportArray valueForKey:@"username"];
[array2 writeToFile:dataFile atomically:YES];
于 2013-01-14T23:59:06.847 に答える
4
[exportArray writeToFile: dataFile atomically:YES];

.plistファイル形式を作成して書き込みます。

配列内に plist でサポートされていないオブジェクトがある場合を除きます。

サポートされているオブジェクトは、プロパティ リスト オブジェクト`NSStringNSNumberNSDateNSDataNSArrayおよびNSDictionaryです。

UItextFieldplist 形式でUItextViewはサポートされていないため、これは機能しません。保存したいものがそれらからのテキストだけである場合は、テキストを配列に入れます。

于 2013-01-15T00:05:12.733 に答える
2

これを試して:


    NSMutableString *string = [NSMutableString string];
    for (NSDictionary* dict in exportArray) {
        for (NSString* key in [dict allKeys]) {
            NSObject* value = [dict objectForKey:key];
            [string appendFormat:@"%@ = %@\n", key, value];
        }
    }

    // Write to the file
    NSError* error = nil;
    [string writeToFile:dataFile atomically:YES encoding:NSUTF8StringEncoding error:&error];
    if (error)
        NSLog(@"%@", error);
于 2013-01-15T00:06:44.253 に答える
2

最初にそれを NSData に変換してから、人間が読める plist ではなく、バイナリ plist として保存することを検討します。バイナリ plist は読み取りがはるかに高速だからです (2-3x だと思いますが、どの WWDC ビデオで説明されたか思い出せません)。 )。これを行うには、まず NSArray を NSData オブジェクトに変換する必要があります。

(出典:この SO の質問に対する Rob Napier の回答)

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:array];
// "Note that all the objects in array must conform to the NSCoding protocol."

NSString *error;
NSData *data = [NSPropertyListSerialization dataWithPropertyList:array
format:NSPropertyListBinaryFormat_v1_0 options:NULL error:&error];

次に、次を使用して NSData をファイルに書き込むことができます。

[data writeToFile:path atomically:YorN];

それを読み返すには、次を使用します。

NSData *rawdata = [[NSData alloc] initWithContentsOfFile:/*file*/];
NSData *arrayData = [NSPropertyListSerialization propertyListWithData:rawdata
options:NULL format:NULL error:&error];
NSArray *array = [NSKeyedUnarchiver unarchiveObjectWithData:data];

非常に大きな .plist ファイルに対してバイナリ プロセスを使用する必要があるだけですが、知っておくと便利です。

于 2013-01-15T00:31:18.840 に答える