0

我正在尝试为 iOS 应用程序的简单数据模型实现持久性。它是一种数据库,但数据量很小(200-500 个条目)。我认为核心数据在这里是没有选择的。

数据模型看起来像这样(目前我使用NSDictionarywith 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
    ]
}

现在我面临关系问题(哪些员工在哪家公司工作)。我想将和添加NSArrayNSDictionary拥有该公司员工 ID 的公司。但不知何故,我害怕表现不佳,因为每次我想获得员工工作的公司时,我都需要列举所有公司。

有没有更好的解决方案来保存此类数据?我认为使用 SQLite 或 Core Data 会过度设计并且会花费太多的开发时间......

编辑: 请不要在您的评论和答案中建议核心数据。Core Data 不是一个选项,因为数据是非常静态的,只有很少的更改,并且不需要排序。iCloud 同步也可能是一种选择。Core Data 在使用 iCloud 时有很多错误...

4

2 回答 2

3

Core Data 很酷,不要害怕 :) 我建议你使用 Core Data。

但是如果你不想学习 Apple 普及的现代技术,你应该将你的数据保存在 plist 文件中。有很多教程,这里有很好的示例。

于 2013-07-26T14:40:48.400 回答
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];

并加载它们NSKeyedUnarchiver

NSArray *companiesArray = [NSKeyedUnarchiver unarchiveObjectWithFile:somePath];
于 2013-07-26T14:42:48.810 回答