2011-03-16 105 views
1

我正在創建我的第一個iPhone應用程序。該應用程序當前使用核心數據與sqlite數據庫。存儲在數據庫中的內容在應用程序中保持靜態,但是我們可能希望向應用程序添加更多內容 - 這是我的問題所在。使用核心數據更新Iphone應用程序內容

我知道我不會負責維護應用程序,負責的人可能不是技術高手 - 所以我想讓它儘可能容易地更新內容。我越來越多地閱讀關於使用核心數據進行更新的信息,越是讓我覺得無法輕鬆更新內容。我也想通過應用商店發佈更新(現在我不允許在網絡服務器上存儲任何數據)。

在我理想的設置中,我希望能夠爲數據庫編寫前端(而不是iPhone),並讓我的用戶通過用戶友好的GUI更新數據庫內容。然後簡單地把這個更新的數據庫,並通過應用程序商店推出。這仍然可以使用核心數據嗎?我正在閱讀版本控制和遷移,這對我的簡單應用來說似乎非常複雜(或者我錯誤地解釋了這一點)?我會更好使用沒有核心數據的sqlite數據庫嗎?

無論如何,我很想聽聽有關使用核心數據更新內容的任何建議。

謝謝

回答

2

我目前正在做你正在列出的東西(減去用戶友好界面,我的只是一個命令行工具)。它工作的很好,我構建和運行該工具,它使用plist文件重新生成我的核心數據持久存儲sqlite數據庫。當你推出你的應用程序時,具有相同文件名的文件將被覆蓋。如果你的核心數據的sqlite數據庫被稱爲「asdf.sqlite」,那麼你只要確保它包含在你的新捆綁包中,它將替換舊的。

但是,要小心修改數據模型。在這種情況下,您需要執行數據模型遷移並將舊模型映射到新模型。如果您嘗試使用舊數據模型訪問核心數據持久性存儲,則會遇到運行時錯誤。

如果沒有人對數據模型進行過更改,那麼你沒事。只需使用自定義工具重建數據庫,然後將項目交給其他人。

回覆:

至於再生核心數據 持久存儲......究竟是 你完成這個? 如何知道何時更新商店或您是否在每次運行 應用程序時創建商店 ?

我的命令行應用程序引用(符號鏈接),以相同的數據模型和實體源代碼的iPhone應用程序(這個變化在iPhone項目的方式將提供給我的命令行工具)。我的項目尋找一個plist文件,我必須定製應用程序以遍歷整個plist文件並將該信息添加到核心數據數據庫。每次運行應用程序時,它都會刪除舊的sqlite文件並將其替換爲新的文件。所以如果我需要讓其他人管理我的應用程序,他們只需要知道如何修改plist文件以及如何運行命令行應用程序。 Out在生成應用程序的調試文件夾中彈出一個sqlite數據庫。

我的應用程序是一個參考工具,所以我只需要在參考資料發生變化時更新我的​​核心數據庫。當我進行更改時,我將生成的sqlite文件複製到我的iPhone項目中,並確保將其複製到應用程序包中。

順便說一句,這種方法只適用於您計劃在您的應用程序上傳送READ ONLY數據。如果使用部署的應用程序時將寫入相同的持久性存儲區,則每次更新時用戶的更改都將丟失。您可以使用多個商店(一個用於只讀,另一個用於用戶編寫的數據)解決此問題。

我描述的方法假定您只是通過應用商店更新來更新核心數據庫。如果您的核心數據生成代碼位於iphone應用程序中,那麼您可以在應用程序每次運行時重新生成代碼,但如果數據是靜態的,並且在更新應用程序之前預計不會更改,則不需要該代碼。

RE:

請問您的應用程序重建 sqlite的DB文件每次運行 以及時間文件夾?

簡答:不,我的iPhone應用程序不會在每次運行時重建sqlite數據庫。我的iPhone應用程序從不重建數據庫。

Long答案:爲了澄清一次,有兩個應用程序。 App1是使用核心數據數據庫的iPhone應用程序,App2是生成核心數據數據庫的桌面應用程序。最初,只有App1,iPhone應用程序。每次運行iPhone應用程序時,它都會從plist(XML)文件重新生成sqlite數據庫。由於我的db非常大,它增加了我的應用程序的加載時間很多。這是不可接受的,所以我做了這樣的事情,以便iPhone應用程序只在生成數據庫時才能找到數據庫文件(表明該應用程序正在第一次運行)。然後我意識到沒有必要讓應用程序第一次加載時間過長,所以我從iPhone應用程序中完全刪除了這些代碼,並創建了一個單獨的Mac OSX命令行應用程序app2來處理生成sqlite數據庫。這個程序app2只能在我的電腦上運行,所以我必須把生成的sqlite文件放到我的iPhone app1項目中。此重建的sqlite數據庫文件僅在向App Store提交更新時才提供給用戶。

+0

謝謝pokstad。我沒有看到我的用戶很快就會改變數據模型,所以我不會爲此擔心。至於重新生成核心數據持久性存儲......您是如何完成這項工作的?你怎麼知道什麼時候更新商店,或者你每次運行應用程序時都創建商店? – Gshock 2011-03-16 20:25:07

+0

查看我的回覆以上 – pokstad 2011-03-16 21:10:17

+0

有意義。據我瞭解,我的應用程序包中有我的數據庫,然後將其複製到下載應用程序的iPhone用戶的文檔文件夾中。您的應用程序在每次運行時都會在文檔文件夾中重建sqlite數據庫嗎? (這是我不太明白的部分) – Gshock 2011-03-18 12:32:44

1

更新內容和修改數據模型是有區別的。更新內容可以在現有數據模型(模式)內完成。例如,您的應用可能會提供有關電影的信息,並定期添加或修改電影信息。這可以通過從網站讀取並將更改合併到本地核心數據存儲(將用作本地高速緩存)來完成。

但是,如果您預計會更改數據模型,那麼這是另一回事。例如,您可能在應用程序的第一個版本中省略了電影長度。補充一點,你需要修改你的數據模型。 (免責聲明:我不知道以程序化方式修改數據模型有多簡單。)

更新內容應該比較容易設計。修改數據模型似乎稍微複雜一些 - 尤其是在輕量級遷移設施無法處理修改的情況下。

+0

謝謝 - 我現在並沒有預料到任何數據模型會發生變化,並且清楚地知道如果他們希望更改模型,他們將不得不讓一些人有更多的經驗來協助。 – Gshock 2011-03-16 20:22:26

0

當您談論通過應用商店分發內容時,您確實在談論更新整個應用程序。在應用程序中更換數據庫時,必須重新構建應用程序並提交該應用程序,並等待一週後才能批准該應用程序。如果您可以找到一種方法在Web服務器上發佈數據庫(或可以解析到數據庫中的XML文件),則可以在不更改應用程序本身的情況下更新內容。這對於維護應用程序的非技術人員來說會更容易,並且可以讓您更快地獲得更新。

2

老實說,在過去的兩年中,我已經完成了所有這一切。我從來沒有EVER滿意我必須破解和削減核心數據醜陋的方式,每當我想更新數據庫的內容。此外,在發佈應用程序之前「播種」數據庫從未像應有的那樣優雅或明顯。

過去一週發生了變化。我可以完全誠實地說出這一點,我已經找到了解決我所有的憤怒和對核心數據越來越仇恨的方法,以期保持它的最新狀態。我現在真的很喜歡它。爲什麼? (因爲害怕聽起來像一個商業信息...)

我開始使用RestKit。它基本上使一切變得如此簡單。我認爲它最初的目的是通過在線的JSON資源實時地向Core Data提供對象,然而,他們已經增加了使用JSON對數據庫進行種子處理的能力。

您在線的JSON數據可以是靜態文本文件(我是如何開始的),或者您可以通過數據庫上的REST後端將它們提供出去,或者其他方式。 RestKit不會爲你提供這個部分,但是在他們的論壇中有很多知識淵博的人,以防你對此感到不適。此外,只需稍作調整,我在應用程序中構建了我的RestKit實現,以僅查詢最近對象的後端,並在應用程序運行時在後臺就地加載新數據。

嚴肅地說,嚴肅認真地看一看,特別是如果你只是在佈置一個新的應用程序,因爲實施會更快。他們有一些很好的例子可以幫助你入門。

+0

+1這是不好的屁股,希望我知道這一點。聽起來這是將CouchDB與Cocoa應用程序集成的一種很酷的方式。 – pokstad 2011-03-16 21:30:40

+0

絕對。我非常喜歡CouchDB,最初希望將它用作我項目的後端,但從我的MySQL模式遷移時間/成本高昂。 – 2011-03-17 19:28:28

+0

Greg - 感謝您的建議。這絕對有用。對於這個特定的項目,客戶端不會讓我在網絡服務器上託管任何東西(Lame,但我在內部IT辯論中絕對沒有發言權)。 – Gshock 2011-03-18 12:19:06

0

你需要做的是開發一個我倒是 希望能夠寫數據庫 前端 (無法在iPhone),並有我的用戶更新通過分貝 內容用戶友好的GUI。

這是微不足道的,因爲MacOS和iOS都使用相同的核心數據。只要你在iOS上開發模型,你就不會使用任何奇特的將UIImage存儲在可轉換屬性中,那麼相同的確切數據模型和存儲將在兩個操作系統上工作。

然後,您只需使用綁定將模型連接到簡單的GUI界面,以便用戶可以更新商店。一旦他們擁有商店文件,他們就可以將其包含在與舊商店完全相同的地方的下一個版本中。該應用永遠不會知道其中的差異。

如果您想將數據推送到現有的已安裝應用程序,那麼當然這取決於您想要如何提供新數據,這會變得更加複雜。

相關問題