1

したがって、ファイルに保存する必要があるオブジェクトの NSMutableArray があります。writeToFileこのメソッドが生成する .plist 形式では許可されていない NSNull 値があるため、メソッドで保存することはできません。

したがって、ファイルを NSString として保存することで、ファイルをディスクに保存しています。

NSString *content = [NSString stringWithFormat:@"%@",orders];
[content writeToFile:ordersFilePath atomically:NO];

次のようなファイルが生成されます。

(
        {
        ZBILLINGADDRESS1 = "";
        ZBILLINGADDRESS2 = "";
        ZBILLINGCITY = "";
        ZBILLINGCOUNTRY = "";
        ZBILLINGSTATE = "";
        ZBILLINGZIP = "";
        ZCANCELDATE = "<null>";
        ZCATALOGCODE = "";
        ZCATALOGNAME = "";
        ZCONTACTEMAIL = "";
        ZCONTACTFAX = "";
        ZCONTACTNAME = " ";
        ZCONTACTPHONE = "";
        ZCONTAINERCUBES = 0;
        ZCONTAINERNAME = "";
        ZCURRENCYCODE = "<null>";
        ZCUSTOMERID = 0;
        ZCUSTOMERNAME = "Dupe offline Test";
        ZCUSTOMERNUMBER = 1297145;
        ZDISCOUNT = 0;
        ZDONOTSHIPBEFORE = "<null>";
        ZEXPORTDATE = "-63113886238";
        ZEXPORTED = 1;
        ZFOB = "";
        ZFREIGHTTERM = "";
        ZISCONTAINER = 0;
        ZISDEFAULT = 0;
        ZISDELETED = 0;
        ZISPLACED = 0;
        ZMANUFACTURERID = 18;
        ZMARKETNAME = "";
        ZNOTES = "last second note";
        ZORDERDATE = 372571200;
        ZORDERGUID = "5650d30a-9316-436a-87e9-1e0ead3af8d7";
        ZORDERID = 84340;
        ZORDERSTATUS = Accept;
        ZORDERTOTAL = 200;
        ZORDERTYPE = "";
        ZORIGIN = "";
        ZPONUMBER = 3;
        ZPRICELEVEL = 2;
        ZREPNUMBER = 1;
        ZSALESREPID = 235;
        ZSHIPDATE = 373176000;
        ZSHIPPINGTOTAL = 0;
        ZSHIPTOADDRESS1 = "";
        ZSHIPTOADDRESS2 = "";
        ZSHIPTOCITY = "";
        ZSHIPTOCOMPANYNAME = "";
        ZSHIPTOCONTACTEMAIL = "";
        ZSHIPTOCONTACTNAME = "";
        ZSHIPTOCONTACTPHONE = "";
        ZSHIPTOCOUNTRY = "";
        ZSHIPTOFAX = "";
        ZSHIPTOSTATE = "";
        ZSHIPTOZIP = "";
        ZSHIPVIA = "";
        ZSOURCE = ipad;
        ZSUBTOTAL = 200;
        ZTAXRATE = 0;
        ZTAXTOTAL = 0;
        ZTERMS = "";
        ZWRITTENBYNAME = "";
        ZWRITTENFORNAME = "";
        ZWRITTENFORREPNUMBER = "";
        ZWRITTENFORREPNUMBER1 = "<null>";
        "Z_ENT" = 17;
        "Z_OPT" = 5;
        "Z_PK" = 450;
    }
)

問題は、これを NSArray としてリロードしようとすると、null 値が返されることです。

NSString *str = [NSString stringWithContentsOfFile:ordersFilePath encoding:NSUTF8StringEncoding error:NULL];
    NSArray *loadedOrders = [[NSArray alloc] initWithContentsOfFile:str];

ここで何が欠けていますか?

4

3 に答える 3

2
NSArray *loadedOrders = [[NSArray alloc] initWithContentsOfFile:str];

initWithContentsOfFile はパスを文字列として受け取ります。あなたの場合、それはパスではなくコンテンツそのものです。

于 2013-02-22T16:54:57.547 に答える
1

私が見ているのは、あなたの文字列が実際にはCoreData's NSManagedObject(orders 配列) の記述であるということです。したがって、文字列をファイルに保存できますが、このファイルから同じオブジェクトを再作成することはできません。-descriptionこれは、 でのメソッドの結果にすぎませんNSManagedObject。オブジェクトのデータを保存するカスタム ロジックを実装する必要があります (そうでない場合は、CoreData's永続ストアではなく、そのデータを に挿入してロードするロジック) を実装する必要がありNSManagedObjectContextます。

于 2013-02-22T16:20:38.417 に答える
0

[NSString stringWithFormat:@"%@",orders][orders description] を呼び出した結果が得られますが、これはデバッグ用であり、アーカイブ用ではありません。

配列でwriteToFile:atomically: を呼び出すだけで、orders配列[[NSArray alloc] initWithContentsOfFile:filePath]を読み戻すことができます。注意点が 1 つあります。

配列の内容がすべてプロパティ リスト オブジェクト (NSString、NSData、NSArray、または NSDictionary オブジェクト) である場合、このメソッドによって書き込まれたファイルを使用して、クラス メソッド arrayWithContentsOfFile: またはインスタンス メソッド initWithContentsOfFile: で新しい配列を初期化できます。このメソッドは、ファイルを書き出す前に、含まれているすべてのオブジェクトがプロパティ リスト オブジェクトであることを再帰的に検証し、結果のファイルが有効なプロパティ リストではないため、すべてのオブジェクトがプロパティ リスト オブジェクトでない場合は NO を返します。

したがって、これが機能するには、配列内のオブジェクトがすべて NSString、NSData、NSArray、または NSDictionary クラスである必要があります。

于 2013-02-22T17:06:48.987 に答える