Search code examples
objective-cnsmutablearraynsdataarchivenskeyedarchiver

Error message is saying my data is NULL - NSKeyedUnArchiver - I've followed all the steps - still won't work


I want to save an NSMutableArray *allRedItems to a file. It contains custom objects, Itemz :

@interface Itemz : NSObject <NSCoding>
@property double price;
@property double quality;
@property double style;


@property double overallAverage;

I've done all the right steps so far:

@implementation Itemz

- (void)encodeWithCoder:(NSCoder *)encoder {


[encoder encodeDouble:self.price forKey:@"price"];
[encoder encodeDouble:self.style forKey:@"style"];
[encoder encodeDouble:self.quality forKey:@"quality"];
[encoder encodeDouble:self.overallAverage forKey:@"overallAverage"];

[encoder encodeBool: self.isClicked forKey:@"isClicked"];
}

- (id)initWithCoder:(NSCoder *)decoder {
if((self = [super init])) {
    //decode properties, other class vars
    self.price = [decoder decodeDoubleForKey:@"price"];

    self.style = [decoder decodeDoubleForKey:@"style"];
    self.quality = [decoder decodeDoubleForKey:@"quality"];
    self.overallAverage = [decoder decodeDoubleForKey:@"overallAverage"];
    self.isClicked = [decoder decodeBoolForKey:@"isClicked"];


}
return self;
}
@end

Here is where I saved my array *allRedItems

@implementation AllRedItems
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.allRedItems];

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);

NSString *documentsDirectory = [paths objectAtIndex:0];

NSString *allItemsRed = [documentsDirectory  stringByAppendingPathComponent:@"allItemsRed"];

[data writeToFile:allItemsRed atomically:YES];
 @end  

When I retrieve it, it gives me this error - [NSKeyedUnarchiver initForReadingWithData:]: data is NULL

@implementation ItemSuggestion
NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * documentsDirectory = [paths objectAtIndex:0];
NSString * path = [documentsDirectory stringByAppendingPathComponent:@"allItemsRed"];
NSData * data = [NSData dataWithContentsOfFile:path];
NSMutableArray *allRedItems = [NSKeyedUnarchiver unarchiveObjectWithData:data];
@end

Am I missing something? Or do I need to add something?


Solution

  • You save it in NSDocumentationDirectory

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory, NSUserDomainMask, YES);
    

    But retrieve it from NSDocumentDirectory, so you can't get it.

    NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    

    Use NSDocumentDirectory in the two methods.