我对目标c功能有点困惑,正在寻求帮助!
这是一个OSX应用程序,它将数据从twitter作为数组提取,然后将它们插入到Core Data中。
我在Core Data中有一堆对象,我想把它作为一些XML写入文件,我有一个获取请求,它过滤并返回一个库对象数组,我想把它作为XML写入磁盘。
我一直在网上看各种图书馆和教程,他们似乎都围绕着阅读而不是写作,而事实上它是一系列图书馆也似乎使问题复杂化。
到目前为止,我已经尝试过这个,但它似乎永远不会创建该文件,但是烦人地也没有给我任何错误:
-(void)writeTweetsToXML{
//Create new fetch request
NSFetchRequest *request = [[NSFetchRequest alloc] init];
//Set new predicate to only fetch tweets that have been favourited
NSPredicate *filterFavourite = [NSPredicate predicateWithFormat:@"approved == YES"];
//Setup the Request
[request setEntity:[NSEntityDescription entityForName:@"Tweet" inManagedObjectContext:_managedObjectContext]];
//Assign the predicate to the fetch request
[request setPredicate:filterFavourite];
NSError *error = nil;
//Create an array from the returned objects
NSArray *tweetsToExport = [_managedObjectContext executeFetchRequest:request error:&error];
NSAssert2(tweetsToExport != nil && error == nil, @"Error fetching events: %@\n%@", [error localizedDescription], [error userInfo]);
//for (id obj in tweetsToExport)
//NSLog(@"obj: %@", obj);
NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *path = [NSString stringWithFormat:@"%@/tweets.xml", documents];
NSString *writeerror;
if(tweetsToExport) {
[tweetsToExport writeToFile:path atomically:YES];
NSLog(@"%@ written to %@", tweetsToExport, path);
}
else {
NSLog(@"%@",writeerror);
}
}
这是托管对象的结构:
@property (nonatomic, retain) NSString * text;
@property (nonatomic, retain) NSString * userName;
@property (nonatomic, retain) NSString * realName;
@property (nonatomic, retain) NSString * avatarUrl;
@property (nonatomic, retain) NSString * tweetID;
@property (nonatomic, retain) NSNumber * approved;
@property (nonatomic, retain) NSDate * postDate;
@property (nonatomic, retain) NSDecimalNumber * longitude;
@property (nonatomic, retain) NSDecimalNumber * latitude;
@property (nonatomic, retain) NSNumber * profanity;
@property (nonatomic, retain) NSString * otherUserTweet;
@property (nonatomic, retain) NSString * favouriteTweet;
任何有用信息或图书馆的指针都会非常有用!
由于
加雷
修改1 好吧,尝试将数组重新编码为数据,并稍微修改了代码以报告写入成功/失败,没有编码我写入失败,但输出现在基本上是垃圾。
现在代码如下:
NSDictionary* environ = [[NSProcessInfo processInfo] environment];
BOOL inSandbox = (nil != [environ objectForKey:@"APP_SANDBOX_CONTAINER_ID"]);
NSLog(@"App Sandbox Status = %d", inSandbox);
NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *path = [NSString stringWithFormat:@"%@/tweets.xml", documents];
NSString *writeerror;
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:tweetsToExport];
if(tweetsToExport) {
BOOL successful = [data writeToFile:path atomically:YES];
NSLog(@"Success = %d", successful);
}
else {
NSLog(@"%@",writeerror);
}
然而,这会产生垃圾输出:
bplist00‘úùX$versionX$objectsY$archiverT$top܆Ø$*+,-./04:FMDRSXfghijknsxÜáàâäãéìòU$null“
ZNS.objectsV$class£
ÄÄÄÄ#›
!"#$%&'(^otherUserTweetWtweetIDXrealNameXapprovedYlongitudeXpostDateXlatitudeYavatarUrlYprofan ityXuserNameTtext^favouriteTweetÄÄÄÄÄÄ Ä
ÄÄÄÄÄÄ_wPS Myself alongside the mighty @CJbeatz will be co-hosting and DJ for a huge gig for schools at Wembley Arena this Wed.\TherealNihalWNihal A_Qhttp://a0.twimg.com/profile_images/1021089851/BB213320_RADIO_1_- _NIHAL_normal.jpg_353964930917085186“1
23WNS.time#A∑ⲶÄ
“5678Z$classnameX$classesVNSDate¢79XNSObject◊
;<=>? @ABCD/DC[NS.mantissa[NS.negative[NS.exponent^NS.mantissa.boYNS.lengthZNS.compactÄO“56GH_NSDeci malNumberPlaceholder•IJKL9_NSDecimalNumberPlaceholder_NSDecimalNumberXNSNumberWNSValue◊
;<=>?@AOCD/DCÄORNO“56TUUTweet£VW9UTweet_NSManagedObject›
Z[ ]^_`%b'dÄÄÄÄÄÄÄÄÄÄÄÄÄ_"Bird. Bath. http://t.co/1PLF2gKI4T[DerrenBrown\Derren Brown_Zhttp://a0.twimg.com/profile_images/3682019430/d4636e8301b238c6a10c55efacd2442c_normal.j peg_353965570888192000“1
l3#A∑âˇ@Ä
◊
;<=>?@ApCD/DCÄO◊
;<=>?@AuCD/DCÄO›
z{ }~Ä%Ç'ÑÄÄÄÄÄ!Ä Ä"ÄÄÄÄÄÄ_âThe Surgery with myself and new resident Doctor @DrRadhaModgil starts at 9pm on @BBCR1 It's a Summer Special - 03700100100, Text on 81199Sahj_Aled Haydn Jones_Mhttp://a0.twimg.com/profile_images/2254837339/Aled-012_- _Version_3_normal.jpg_353965267564507138“1
å3#A∑â˛ˆÄ
◊
;<=>?@AêCD/DCÄO◊
;<=>?@AïCD/DCÄO“56ôö^NSMutableArray£ôõ9WNSArray_NSKeyedArchiver—ûüTrootÄ#-27^dit{ÅÉÖᢠ±π¬À’fiÁÒ˚ "$&(*,.02¨π¡*,19BDIT]dgpãó£≤º«…‹›fl‡Â%7@HWYlmnqv|ÄÜò≥µ∑πªΩø¡√≈«…ÀÕÚ˛h}Çãçúû ±≤≥¬ƒ◊ÿŸÙˆ¯˙¸˛
öû±$&57JKL[]pqrwÜäí§ß¨†Æ
修改2
好的,所以,如果我在合适的查看器(BBEdit)中打开此文件,它的格式正常,但它并不是非常有用,我希望能够做的就是将带有值的对象编码为XML,任何非常感谢。
答案 0 :(得分:0)
您的第一次尝试失败,因为writeToFile:atomically:
仅适用于属性列表类型 - NSString
,NSNumber
,NSData
,NSDate
,NSArray
和NSDictionary
。 NSManagedObject
不在列表中,也不是您可能创建的任何子类。你没有尝试编写一个字典数组 - 你正在尝试编写一个托管对象数组。
转换为NSData
并编写工作,但您获得的是二进制属性列表。它不是垃圾,它是该代码的预期格式,但它不是人类可读的。
如果您使用了原始代码,但在执行fetch之前添加了此代码:
[request setResultType:NSDictionaryResultType];
...你会得到一些你可以writeToFile:atomically:
的东西。