我正在尝试为iOS应用的简单数据模型实现持久性。它是一种数据库,但只有少量数据(200-500个条目)。我认为核心数据在这里没有选择。
数据模型看起来像这样(目前我使用NSDictionary
与NSArray
):
// Note: NSStrings and NSNumbers are simplified for readability (no @)
@{ "Companys" : @[
@{ "ID" : 1,
"Company name" : "ABC Inc.",
"Website" : "http://www.abc.com"
},
@{ "ID" : 2,
"Company name" : "XYZ Inc.",
"Website" : "http://www.xyz.com"
},
@{ "ID" : 3,
"Company name" : "123 Inc.",
"Website" : "http://www.123.net"
},
// ... about 90 companies
],
"Employees": @[
@{ "ID" : 1,
"First name" : "John",
"Last name" : "Doe"
},
@{ "ID" : 2,
"First name" : "David",
"Last name" : "Green"
},
// ... about 500 employees
]
}
现在我面临关系问题(员工在哪家公司工作)。我想到将NSArray
添加到公司NSDictionary
,其中包含该公司员工的ID。但不知怎的,我害怕表现不好,因为每次我想要雇用一名员工工作的公司时,我都需要列举所有公司。
有没有更好的解决方案来保存这类数据?我认为使用SQLite或Core Data会过度设计,并且会花费太多的开发时间......
修改 请不要在您的评论和答案中建议核心数据。核心数据不是一个选项,因为数据非常静态,只需要很少的更改,并且不需要排序。此外,iCloud同步可能是一种选择。使用iCloud时Core Data有很多错误......
答案 0 :(得分:3)
核心数据很酷,不要害怕它:)我建议你使用核心数据。
但如果您不想学习Apple推广的现代技术,您应该将数据保存在plist文件中。有许多教程,here是很好的样本。
答案 1 :(得分:2)
如果您的数据库对于Core Data而言太小,那么NSCoding
可能适合您。我不建议将数据存储在字典和数组中(在运行时)。相反(因为您的数据模型不是太复杂)实现模型对象,如Employee和Company。然后,这些模型对象应实现NSCoding
协议。它可能看起来像这样:
@interface Employee : NSObject <NSCoding>
@property (nonatomic) NSString *firstName;
@property (nonatomic) NSString *lastName;
@property (nonatomic, weak) Company *company;
@end
@implementation Employee
- (id)initWithCoder:(NSCoder *)coder {
self = [super init];
if (self) {
self.firstName = [coder decodeObjectForKey:@"FirstName"];
self.lastName = [coder decodeObjectForKey:@"LastName"];
self.company = [coder decodeObjectForKey:@"Company"];
}
}
- (void)encodeWithCoder:(NSCoder *)coder {
[coder encodeObject:self.firstName forKey:@"FirstName"];
[coder encodeObject:self.lastName forKey:@"LastName"];
[coder encodeConditionalObject:self.company forKey:@"Company"];
}
@end
@interface Company : NSObject <NSCoding>
@property (nonatomic) NSString *name;
@property (nonatomic) NSString *website;
@property (nonatomic) NSArray *employees;
@end
@implementation Company
- (id)initWithCoder:(NSCoder *)coder {
self = [super init];
if (self) {
self.name = [coder decodeObjectForKey:@"Name"];
self.website = [coder decodeObjectForKey:@"Website"];
self.employees = [coder decodeObjectForKey:@"Employees"];
}
}
- (void)encodeWithCoder:(NSCoder *)coder {
[coder encodeObject:self.name forKey:@"Name"];
[coder encodeObject:self.website forKey:@"Website"];
[coder encodeObject:self.employees forKey:@"Employees"];
}
@end
现在您只需使用NSKeyedArchiver
[NSKeyedArchiver archiveRootObject:companiesArray toFile:somePath];
加载它们
NSArray *companiesArray = [NSKeyedUnarchiver unarchiveObjectWithFile:somePath];