2013-07-26 84 views
0

我正在嘗試爲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或核心數據會的方式來過度設計,並會花費太多的開發時間......

編輯: 請不要在您的意見和建議的答案核心數據。核心數據不是一個選項,因爲數據是非常靜態的,只需很少的更改,並且不需要排序。此外,iCloud同步可能是一個選項。核心數據在使用iCloud時有很多缺陷...

+0

imho使用sqlite,即使你以前從未使用過它,如果試圖基於數組和字典實現自己的「高性能」關係模型,它仍然更容易。 – peko

+0

您也可以使用存儲在您的應用包或沙箱中的plists。你可以在這裏找到http://developer.apple.com/library/ios/#documentation/general/Reference/InfoPlistKeyReference/Articles/AboutInformationPropertyListFiles.html。 – Engnyl

+1

當你編寫完自己的持久化模型(無bug)時,你可以學會正確地管理CoreData,放入你的簡歷並準備你的項目進化和擴展。 200到500個實體是使用CoreData的強有力的理由。不要太提及所有相關的內容(提取結果控制器,通知ecc ...)。 – Leonardo

回答

2

如果您的數據庫對於Core Data來說太小,或許NSCoding會爲您工作。我不建議將數據存儲在字典和數組中(在運行時)。相反(因爲你的數據模型不太複雜)實現模型對象,如Employee和Company。這些模型對象應該執行協議。它可能是這個樣子:

@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]; 
+0

我認爲200-500對於Core Data來說對象不是太小,但對於歸檔來說太多了。核心數據在這種情況下速度更快。 –

+0

我也會使用核心數據,但是OP詢問了另一種選擇而不是性能。 – DrummerB

+0

@ValentinShamardin:你能否澄清一下爲什麼200-500個物體存檔過多? – FrankZp

3

核心數據很酷,不要害怕它:)我建議你使用核心數據。

但是,如果你不想學習被Apple推廣的現代技術,你應該將你的數據保存在plist-files中。有很多教程,here是很好的示例。

+0

是的,核心數據很酷,在這種情況下會很有用。 我也推薦https://github.com/magicalpanda/MagicalRecord以方便使用。 –

+0

我使用了很多Core Data。但正如我所說,這將過度設計(特別是因爲我不需要排序的東西等,因爲數據庫是非常靜態的)。核心數據也伴隨着很多問題(使用iCloud時充滿了錯誤,應用程序更新等方面的遷移問題等)。實現數據模型類,提取結果控制器等將需要時間,只有非常低的好處... – FrankZp

+0

看看MagicalRecord。即使在小型應用程序中,它也很好。它不會在代碼中添加任何混亂。 –

相關問題