Objective c 加载保存为NSString的NSArray到文件,因为我有NSNull值
所以我有一个NSMutableArray的对象需要保存到一个文件中。使用Objective c 加载保存为NSString的NSArray到文件,因为我有NSNull值,objective-c,nsarray,Objective C,Nsarray,所以我有一个NSMutableArray的对象需要保存到一个文件中。使用writeToFile方法保存它将不起作用,因为此方法生成的.plist格式中不允许使用NSNull值 因此,我通过将文件另存为NSString将其保存到磁盘: NSString *content = [NSString stringWithFormat:@"%@",orders]; [content writeToFile:ordersFilePath atomically:NO]; 这将生成如下文件: (
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;
}
)
这里我遗漏了什么?我看到的是,您的字符串实际上是对
CoreData的
NSManagedObject
(订单数组)的描述。因此,可以将字符串保存到文件中,但不能从此文件中重新创建同一对象。这只是您的NSManagedObject
上的-description
方法的结果。您必须实现保存对象数据的自定义逻辑(在其他位置,而不是CoreData的
持久存储,以及通过将数据插入NSManagedObjectContext
来加载该数据的逻辑),如果这是您试图实现的
NSArray *loadedOrders = [[NSArray alloc] initWithContentsOfFile:str];
initWithContentsOfFile将路径作为字符串。在您的情况下,它不是路径,而是内容本身。
[NSString stringWithFormat:@“%@”,orders]
只提供调用[orders description]的结果,该结果仅用于调试,而不是存档
您只需在orders
数组上调用writeToFile:atomically:,然后执行[[NSArray alloc]initWithContentsOfFile:filePath]
将其读回,需要注意一点:
如果数组的内容都是属性列表对象(NSString、NSData、NSArray或NSDictionary对象),则使用此方法编写的文件可以使用类方法arrayWithContentsOfFile:或实例方法initWithContentsOfFile:初始化新数组。此方法在写入文件之前递归验证所有包含的对象是否为属性列表对象,如果所有对象都不是属性列表对象,则返回否,因为生成的文件将不是有效的属性列表
因此,数组中的对象必须全部是NSString、NSData、NSArray或NSDictionary类,才能正常工作。使用NSKeyed(Un)Archiver。UTF8编码导致的损坏风险太高。您在这方面让我不知所措,可以解释一下吗?将其保存/还原为JSON。JSON可以很好地处理NSNull对象。如果将
loadedOrders
打印到控制台,输出是什么?通常不能将[NSNull null]
写入文件。是不是nil
?但问题仍然存在于[NSNull-null]
。
NSArray *loadedOrders = [[NSArray alloc] initWithContentsOfFile:str];