簡體   English   中英

通過某種關系保存應用程序數據的最佳方法

[英]Best way to save app data with kind of relationships

我正在嘗試為iOS應用程序的簡單數據模型實現持久性。 它是一種數據庫,但是數據量很少(200-500個條目)。 我認為這里沒有核心數據。

數據模型看起來像這樣(當前我將NSDictionaryNSArray使用):

// 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
    ]
}

現在,我面臨着關系問題(哪些員工在哪個公司工作)。 我想到了將NSArrayNSArray添加到公司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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM