[英]Best way to save app data with kind of relationships
我正在嘗試為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
和NSArray
添加到公司NSDictionary
,該公司擁有該公司員工的ID。 但是由於某種原因,我害怕表現不佳,因為每次我想要獲得一名雇員所工作的公司時,都需要列舉所有公司。
有沒有更好的解決方案來保存此類數據? 我認為使用SQLite或Core Data將是過度設計的方式,並且會花費過多的開發時間...
編輯:請不要在您的評論和答案中建議核心數據。 核心數據不是一種選擇,因為數據是非常靜態的,只有很少的更改,並且不需要排序。 也可以選擇iCloud同步。 使用iCloud時,核心數據有很多錯誤...
Core Data很酷,請不要害怕:)而且我建議您使用Core Data。
但是,如果您不想學習由Apple普及的現代技術,則應將數據保存在plist文件中。 有很多教程, 這是一個很好的示例。
如果您的數據庫對於核心數據而言太小,也許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];
並使用NSKeyedUnarchiver
加載它們:
NSArray *companiesArray = [NSKeyedUnarchiver unarchiveObjectWithFile:somePath];
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.