2009-10-15 43 views
2

我有一個應用程序,使用核心數據與SQLite商店。Cocoa-Touch,核心數據:如何刪除實體的所有對象?

在某些時候,我想刪除一些實體的所有對象。可能有近千個物體。

從我可以告訴通過谷歌和官方文檔,刪除對象的唯一方法是[managedObjectContext deleteObject:(Entity *)]爲每個對象。但這意味着我必須首先獲取所有對象。

數據存儲只是sqlite,有沒有辦法簡單地通過一個TRUNCATE TABLE ZENTITY;它?

回答

4

問題是CoreData不只是一個SQLite包裝。這是一個對象圖管理解決方案,除了其他內容之外,它還將對象的緩存版本存儲在內存中。據我所知,要刪除給定的託管對象的所有實例,你必須獲取它們,然後刪除每個實例。這並不是說這個功能不應該存在,因爲它可能應該。

0

你真的嘗試過它,發現它是一個性能問題?如果是這樣,那麼你可以提供一些信息顯示,更重要的是提交一個錯誤報告。如果沒有,那麼你爲什麼要困擾呢?

這並不像做TRUNCATE TABLE ZENTITY;那麼簡單,因爲核心數據還必須對每個對象(以及其他操作)應用刪除規則,這意味着要執行提取操作。因此,他們可能會讓您進行抓取,然後逐個將結果傳遞到上下文中。

+0

我這麼問是因爲我覺得它不好取〜從數據庫1K行時,所有你需要做的就是將它們刪除。我還沒有爲它做過基準測試,但即使Core Data在所有對象上都進行了延遲加載,我仍然希望能夠對錶格執行截斷操作,因爲這甚至不需要先計數。 – Prody 2009-10-16 13:22:19

+0

做事煩瑣的做法總是一個不好的解決辦法,如果有相關的性能問題沒關係。 – 2012-02-28 12:17:34

+1

雖然這並不是特別麻煩。它保持了Core Data API的精益,並且非常清楚你的代碼在做什麼。 **是**如果存在性能問題,那很糟糕,但您需要先測量。 – 2012-03-03 16:08:09

9

如果您將對象與父實體關聯,則只需刪除父對象。如果您的父母刪除規則設置爲「級聯」,那麼所有這些(1k)孩子也將被刪除。

約翰

+2

我剛剛遇到此問題並打算使用此方法,但請注意級聯規則適用於實體關係。父/子狀態用於創建實體子類型。 – 2011-04-20 15:23:13

相關問題