2013-08-12 34 views
0
// Test listing all words with their sentence 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Word" 
              inManagedObjectContext:context]; 
[fetchRequest setEntity:entity]; 
[fetchRequest setFetchLimit:10]; 
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error]; 

for (Word *info in fetchedObjects) { 
    NSLog(@"Word object: %@", info.word); 
    Sentence *details = info.relatedToSentence; 
    NSLog(@"Sentence object: %@", details.sentence); 
} 

我有兩個名爲Word和Sentence的實體。在每個實體中分別有一個稱爲單詞和句子的屬性。關係是相反的,而不是可選的,並且是一對一的。核心數據一對一關係無法正常工作

我能夠分別從兩個實體提取記錄,但不知何故,我無法通過一個實體獲取相關對象,我做錯了什麼? 上面的代碼工作,它只打印出單詞對象的值,並且爲句子對象打印(空)...我使用sqlite作爲此數據庫的源。在建模我的模型之後,我填充了由Xcode創建的sqlite文件。

+0

該代碼看起來不錯。如果'info.relatedToSentence'打印爲(null),那麼Word對象與句子對象無關。你是如何填寫sqlite文件的? –

+0

@martin是的,我該如何建立關係?我通過在它們的表中插入字符串值zword和zsentence來填充它,即兩個單獨的表,稱爲ZWORD和ZSENTENCE。 – wagashi

+0

爲什麼不使用核心數據來填充初始數據庫?編寫一個小的命令行工具,創建數據庫並創建託管對象和關係。不推薦直接修改sqlite文件,並且容易出錯。 - (在你的情況下,ZSENTENCE將有一個ZRELATEDTOWORD列,ZWORD將有一個ZRELATEDTOSENTENCE列,並且兩者都必須正確填寫。) –

回答

1

用於核心數據模型SQLite的表是這樣的:

CREATE TABLE ZSENTENCE (Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZRELATEDTOWORD INTEGER, ZSENTENCE VARCHAR); 
CREATE TABLE ZWORD (Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZRELATEDTOSENTENCE INTEGER, ZWORD VARCHAR); 

其中ZRELATEDTOWORD是相關詞的主鍵(Z_PK),並ZRELATEDTOSENTENCE 相關句子的主鍵。兩者都必須正確填寫。

但是:請注意,修改的核心數據的SQLite文件,不建議和 容易出錯。格式沒有正式記錄,可能將來會發生變化。

我還是建議寫一個單獨的命令行工具(可使用相同的核心數據 模型作爲主項目)使用核心數據的方法來創建和填寫 初始數據庫。

+0

謝謝。預填充單獨的工具應用程序是一個好主意! – wagashi

相關問題