[英]ios storing custom objects
如何存儲自定義對象的NSMutableArray
? 我有用於加載和保存文件的代碼:
- (NSMutableArray *)loadDataFromFile:(NSString *)fileName {
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
NSString *path = [docDir stringByAppendingPathComponent:fileName];
NSFileManager *fileMgr = [NSFileManager defaultManager];
if (![fileMgr fileExistsAtPath:path]) {
NSArray *fileArray = [fileName componentsSeparatedByString:@"."];
NSString *name = [fileArray objectAtIndex:0];
NSString *ext = [fileArray objectAtIndex:1];
NSString *bundle = [[NSBundle mainBundle] pathForResource:name ofType:ext];
[fileMgr copyItemAtPath:bundle toPath:path error:&error];
}
NSMutableArray *data = [[NSMutableArray alloc] initWithContentsOfFile:path];
return data;
}
- (void)saveData:(NSMutableArray *)arrayData toFile:(NSString *)filename forKey:(NSString *)key {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
NSString *path = [docDir stringByAppendingPathComponent:filename];
[arrayData writeToFile: path atomically:YES];
NSLog(@"%@", arrayData);
}
但是當我使用data.plist
作為文件名時,它不起作用,因為NSLog(@"%@", arrayData);
返回列表自定義對象地址:
“區域表記錄:0x76a7ef0”
使用以下代碼將此自定義對象插入到數組中:
AreaTableRecord *area=[[AreaTableRecord alloc] init];
area.title=title;
area.lastScore=0;
area.vocabulary=[[NSMutableArray alloc] init];
[self.areas addObject:area];
我怎么能存儲NSMutableArray
self.areas
包含自定義對象AreaTableRecord? 以及我使用什么文件格式來存儲這些數據? (在我看來 plist 在這種情況下不起作用)
您只能在 NSDefaults 或 plist 中存儲原始數據類型。 為了解決這個問題,您可以選擇將您的信息存儲在數據庫中……或者將您的對象編碼為字節流,然后將它們保存到文件中。
看看這個線程。 它詳細說明了如何對對象進行編碼。
基本上,您需要將這些方法添加到您的自定義類中:
- (void)encodeWithCoder:(NSCoder *)encoder
{
//Encode properties, other class variables, etc
[encoder encodeObject:self.question forKey:@\"question\"];
[encoder encodeObject:self.categoryName forKey:@\"category\"];
[encoder encodeObject:self.subCategoryName forKey:@\"subcategory\"];
}
- (id)initWithCoder:(NSCoder *)decoder
{
self = [super init];
if( self != nil )
{
//decode properties, other class vars
self.question = [decoder decodeObjectForKey:@\"question\"];
self.categoryName = [decoder decodeObjectForKey:@\"category\"];
self.subCategoryName = [decoder decodeObjectForKey:@\"subcategory\"];
}
return self;
}
然后為了使用它們,你可以這樣調用:
對於設置:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSData *myEncodedObject = [NSKeyedArchiver archivedDataWithRootObject:obj];
[defaults setObject:myEncodedObject forKey:@\"myEncodedObjectKey\"];
用於檢索:
NSUserDefaults defaults = [NSUserDefaults standardUserDefaults];
NSData *myEncodedObject = [defaults objectForKey: key];
MyCustomObject* obj = (MyCustomObject*)[NSKeyedUnarchiver unarchiveObjectWithData: myEncodedObject];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.