通过各种关系保存应用数据的最佳方式

时间:2013-07-26 14:28:11

标签: ios objective-c database

我正在尝试为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
    ]
}

现在我面临关系问题(员工在哪家公司工作)。我想到将NSArray添加到公司NSDictionary,其中包含该公司员工的ID。但不知怎的,我害怕表现不好,因为每次我想要雇用一名员工工作的公司时,我都需要列举所有公司。

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

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

2 个答案:

答案 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];

并使用NSKeyedUnarchiver

加载它们
NSArray *companiesArray = [NSKeyedUnarchiver unarchiveObjectWithFile:somePath];