objects conforming to nscoding will not writetofile
I want to write an array of Question objects to file, but somehow writeToFile isn't doing anything. A Question has an Owner and and an array of Answer objects. An Answer has an Owner as well. All three of them conform to the NSCoding protocol (as far as I know).
From the code below, result returns NO. No clue what I'm doing wrong, since I am implementing NSCoding for everything, right?
Question.h
#import <Foundation/Foundation.h>
#import "Owner.h"
@interface Question : NSObject <NSCoding> {
NSString *questionId;
NSString *questionRevision;
NSString *text;
NSDate *date;
NSMutableArray *answers;
NSString *page;
NSNumber *questionLocation;
Owner *owner;
}
@property (nonatomic, retain) NSString *questionId;
@property (nonatomic, retain) NSString *questionRevision;
@property (nonatomic, retain) NSString *text;
@property (nonatomic, retain) NSDate *date;
@property (nonatomic, retain) NSMutableArray *answers;
@property (nonatomic, retain) NSString *page;
@property (nonatomic, retain) NSNumber *questionLocation;
@property (nonatomic, retain) Owner *owner;
@end
Question.m
#import "Question.h"
#import "Answer.h"
@implementation Question
@synthesize questionId, questionRevision, text, date, answers, page, questionLocation, owner;
- (void)encodeWithCoder:(NSCoder *)coder
{
//[super encodeWithCoder:coder];
[coder encodeObject:questionId forKey:@"questionId"];
[coder encodeObject:questionRevision forKey:@"questionRevision"];
[coder encodeObject:text forKey:@"text"];
[coder encodeObject:date forKey:@"date"];
[coder encodeObject:answers forKey:@"answers"];
[coder encodeObject:page forKey:@"page"];
[coder encodeObject:questionLocation forKey:@"questionLocation"];
[coder encodeObject:owner forKey:@"owner"];
}
- (id)initWithCoder:(NSCoder *)decoder
{
//self = [super initWithCoder:decoder];
self = [super init];
self.questionId = [decoder decodeObjectForKey:@"questionId"];
self.questionRevision = [decoder decodeObjectForKey:@"questionRevision"];
self.text = [decoder decodeObjectForKey:@"text"];
self.date = [decoder decodeObjectForKey:@"date"];
self.answers = [decoder decodeObjectForKey:@"answers"];
self.page = [decoder decodeObjectForKey:@"page"];
self.questionLocation = [decoder 开发者_StackOverflow社区decodeObjectForKey:@"questionLocation"];
self.owner = [decoder decodeObjectForKey:@"owner"];
}
@end
Answer.h
#import <Foundation/Foundation.h>
#import "Owner.h"
@interface Answer : NSObject <NSCoding> {
Owner *owner;
NSString *text;
NSDate *date;
}
@property (nonatomic, retain) Owner *owner;
@property (nonatomic, retain) NSString *text;
@property (nonatomic, retain) NSDate *date;
@end
Answer.m
#import "Answer.h"
@implementation Answer
@synthesize owner, text, date;
- (void)encodeWithCoder:(NSCoder *)coder
{
//[super encodeWithCoder:coder];
[coder encodeObject:owner forKey:@"owner"];
[coder encodeObject:text forKey:@"text"];
[coder encodeObject:date forKey:@"date"];
}
- (id)initWithCoder:(NSCoder *)decoder
{
//self = [super initWithCoder:decoder];
self = [super init];
self.owner = [decoder decodeObjectForKey:@"owner"];
self.text = [decoder decodeObjectForKey:@"text"];
self.date = [decoder decodeObjectForKey:@"date"];
}
@end
Owner.h
#import <Foundation/Foundation.h>
@interface Owner : NSObject <NSCoding> {
NSString *name;
NSString *photoFileName;
}
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSString *photoFileName;
@end
Owner.m
#import "Owner.h"
@implementation Owner
@synthesize name, photoFileName;
- (void)encodeWithCoder:(NSCoder *)coder
{
//[super encodeWithCoder:coder];
[coder encodeObject:name forKey:@"name"];
[coder encodeObject:photoFileName forKey:@"photoFileName"];
}
- (id)initWithCoder:(NSCoder *)decoder
{
//self = [super initWithCoder:decoder];
self = [super init];
self.name = [decoder decodeObjectForKey:@"name"];
self.photoFileName = [decoder decodeObjectForKey:@"photoFileName"];
}
@end
Relevant line of code
BOOL result = [questions writeToFile:@"Users/brunoscheele/Desktop/questions.plist" atomically:YES];
writeToFile:atomically:
writes property list files, not serialised archives. Property list types can't be extended by implementing NSCoding
, and as your objects aren't one of the types supported by property lists, then they can't be written to a property list.
To archive your objects, you'll need to use an NSAchiver
, for example:
[NSKeyedArchiver archiveRootObject:questions
toFile:@"some/path/questions.archive"]
Taken from here NSMutableArray writeToFile:atomically always returns NO on device but works fine on simulator
I don't think you can not write into the application's bundle so you can not write to a plist in the Resources directory. One good way is to copy the plist from the Resource directory into the Documents directory on first launch and access it from there in the future..
精彩评论