2012-06-07 38 views
0

我有一個問題:)我經常遇到這種情況,我有一些對象(書籍說)和用戶列表。每個用戶都有一些書。還有一個特殊情況是當前登錄的用戶比普通用戶擁有更多的屬性(發佈權,收藏夾等)。使用核心數據存儲用戶對象

在以前的所有項目中,我一直在創建一個名爲CurrentUser的用戶子類,並添加當前的用戶屬性/邏輯(例如,普通用戶不能註銷)。但我總是遇到確保只有一個CurrentUser對象存在的問題。

其他人如何做到這一點?我是否正確地做這件事?

回答

0

我不能肯定我明白你的問題,但如果你想控制存在的CurrentUser只有一個實例,我將建立一種單級的,說SessionController,有CurrentUser類型的屬性。

因此,您可以在任何地方訪問該屬性,並且您知道它只能提供該類的一個實例,因此只有當前用戶的一個屬性。

CurrentUser* cu = [[SessionController sharedSessionController] currentUser]; 
if(!cu) // allowed 
else // not allowed 

當您登錄(或其他)時,您填充該屬性。當你註銷時,你將它設置爲零。當您想與其他用戶一起輸入時,您可以檢查該屬性。這是一個簡單的方法,可以在大多數情況下工作。

關於你的問題,我不確定你爲什麼要將User實體分類。但也許有一些動機。處理子類時請注意。實際上,如果您使用sqlite存儲,Core Data會使您創建的子類扁平化。因此,對於您的情況,您只有一個User表,其中包含您在CurrentUser中創建的屬性。

編輯

讀你的問題的標題,如果控制必須與數據庫文件來完成,我將創建一個實體,稱爲LoggedUser,避免使用子類。

在這裏,你可以存儲你當前用戶的ID和你想要的其他屬性。

然後,如果您想驗證是否存在一個已經登錄一個用戶,你可以簡單地設置類似如下的要求:

NSInteger count = [fetchRequest countForFetchRequest:&error]; // query against `LoggedUser` 
if(count >= 1) // not allowed 
else // allowed 
+0

好了,我要與解決方案所帶來的編輯。我也注意到了子類問題。有誰知道CoreData是否對平面數據庫或這些多表數據庫更高效?我知道在Android上我總是瞄準平面數據庫的速度... –

+0

這取決於。如果你使用多表dbs,你需要做更多的工作來檢索不同表格上的數據。相反,當你使用平板的時候,你可能會在內存中看到一些對你的應用無用的屬性。如果需要,請標記爲答案和/或更新。乾杯。 –

+1

有道理。是的,我是標記它,我標記它:) –