2011-06-14 232 views
1

我是一名學習android的php/mysql開發人員。我正在創建一個android應用程序,它接收來自我的php應用程序的信息,以創建不同產品的列表視圖,從而打開該產品詳細信息的Web視圖。xml數據存儲的最佳方法

目前我的iPhone應用程序的PHP CMS Web應用程序輸出的XML列表....(也分別輸出HTML)。我有完全控制的PHP應用程序,所以如果有更好的方式來輸出Android應用程序的數據,請讓我知道。

我創建的代碼,從網絡讀取XML和創建列表視圖。該列表可以每天刷新,因此每次應用程序啓動時都不需要從在線xml讀取數據。

所以我想存儲本地檢索到的數據以提高我的應用程序響應速度。在任何給定時間最多可以存儲500個產品描述,最多可存儲30個不同的XML列表。我正在開發一個包含約30個產品的xml列表。

爲了獲得最佳性能,我應該存儲在sqlLite分貝的產品信息,或者我應該實際的XML文件存儲在緩存/ db或類似應用程序緩存一些其他的方法。

我也被認爲創造了數據的更新的服務,這會是一個好主意?

回答

2

存儲數據的最有效方式是RAM。但是如果你想緩存它,那麼最有效的方式就是數據庫。

我建議你在sqlite android數據庫中存儲你的數據。

你也可以考慮XML荏苒你更快的網絡傳輸,並通過java.util.zip包解壓類。使用datainput/outputstream,您甚至可以考慮使用更簡單的數據傳輸格式,而不是xml的詳細格式。 (我這樣做,我的應用程序和它的偉大工程)

這裏有一些細節上的數據輸入/輸出流的方法:

  • 想象一個專有的協議爲您的數據,你只需要什麼。沒有標籤,沒有屬性,只是原始值的順序。
  • 在客戶端,使用URL.getContent()獲取數據的輸入流並將其轉換爲輸入流。
  • 仍然在客戶端,建立一個封裝你的套接字輸入流的數據輸入流並按順序讀取數據。使用readInt,readDouble,readUTF等。
  • 在客戶端,從php,你需要找到一種方法來保存您的數據格式與客戶端預期的數據格式兼容。我無法講述很多關於PHP的知識,我只使用java編程。

這種技術的優點是您可以節省帶寬,因爲只有數據,並且由於xml而沒有詳細的裝飾。您應該閱讀Java規範以瞭解如何在數據輸出流中編寫double,int,字符串。但使用兩種語言很難獲得正確的數據。

如果PHP不能保存格式以適當的方式,使用XML,它會簡單得多。首先嚐試使用普通的xml,然後嘗試使用zip或tarball或xml文件。

但所有這些都是關於網絡連接期間的速度增益。

你必須做的第二部分是將你列表的每一行存儲在SQL表中。然後,您可以使用CursorAdapter爲您的列表視圖快速檢索它(它打破了迷人的MVC模型,但速度非常快!)。

+0

謝謝Stéphane,你可以擴展RAM和datainput/outputstream方法嗎?這些如何工作?如果我選擇了sqlite方法,我應該保存整個XML作爲記錄,或者我應該解析並保存在字段中的數據? – 2011-06-14 17:00:43

+0

@Traveling_Monk我將在anwser中詳細介紹數據對象輸入流。對於RAM而言,我的意思是沒有比在RAM中,內存中,加載到列表或適配器中更快的速度。但是,如果您不希望數據在應用程序退出時被擦除,這還不夠。 – Snicolas 2011-06-14 17:03:46

1

對不起,但寫評論太長了。這不是爲了回答你的問題,因爲我認爲斯特凡很好地回答了。最好的解決方案確實是將數據存儲在sqlite數據庫中。然後,您需要創建用作數據,數據庫和應用程序之間連接的類。我不想因爲這裏所說的話而讚揚(我也投了票)。

我很關心其他建議(使用低級原始數據流進行數據操作,列表中的步驟就是這個答案)。我強烈建議您避免創建自己的專有協議。它是這樣的:

  • 我需要交換數據。
  • 我不想處理將外部API集成到我的代碼中的麻煩。
  • 我知道我可以寫兩個5分鐘的例程來讀寫數據來回。
  • 因此,我只是創建了我自己的專有格式來交換數據!

無論何時我需要處理未知,晦澀和任意數據blob序列,它都會讓我流淚。這是一件好事,記得爲什麼我們應該使用未知格式:

  • 重新發明輪子是適得其反。它似乎不是,但在中期來看是這樣。您可以輕鬆地將您的項目調整到其他媒體(服務器端,其他平臺)。
  • 使用現成的組件可以幫助您稍後擴展代碼。
  • 無論何時您需要將您的解決方案適應其他技術和媒介,您的工作速度都會更快。否則,您可能會以特設的代碼解決方案結束,這些解決方案不是(容易)可擴展和可互操作的。
  • 使用現成的組件可以使您利用該特定技術的進步。當您使用Android API時,這一點尤爲重要,因爲它們經常針對未來的性能進行優化(請參閱Android的Designing for Performance)。滾動自己的標準可能會導致性能損失。
  • 除非您記錄您的協議,否則忘記您自己創建的協議是非常容易的。只要給它足夠的時間,就會發生:你需要重新學習/記住。如果你記錄,那麼你只是在浪費你大腦的計算時間。
  • 你認爲你不需要擴展你的工作,但是大部分時間你都會有機會。
  • 當你這樣做時,你會希望你已經學會了如何輕鬆,無縫地整合知名的格式。
  • 無論如何都需要學習曲線。根據我的經驗,當你學習時,你實際上整合了衆所周知的格式更快比想象你自己的做事方式。
  • 最後,將您的數據信任給那些將自己的生命轉化爲創造凝聚力和智能標準的天才。他們更瞭解它!

最後,如果目的是爲了避免XML的典型冗長,無論出於何種原因,您有幾個選項。現在我可以想到CSV,但我並不是數據存儲方面的專家,所以如果你不適應它,我相信你可以找到很多好的備選方案,並有大量準備好使用的API。

祝你好運!

+0

謝謝你爲什麼不DIY自己的流的原因,我並不期待這種方法。 CSV,嗯,可能會插入數據庫真的很容易,在Android的支持sqlite的[LOAD DATA INFILE](http://dev.mysql.com/doc/refman/5.1/en/load-data.html) ?或者我應該只讀它像[這](http://stackoverflow.com/questions/2887119/populate-android-database-from-csv-file/4210473#4210473)? – 2011-06-14 21:50:31

+1

好點@大衛。當然,這總是一個決定,它只依賴於性能(或模糊的嘗試)來創建專有的協議。儘管如此,它是有效的。但正如你提到的那樣,csv可以完成這項工作,甚至更好:JSON! – Snicolas 2011-06-14 21:52:27

+0

Snicolas:JSON爲+1。你是對的。起初效率很高,但我想知道值得多少效率是值得的。我知道規則不是刻在石頭上,常識是(這就是爲什麼我說你的答案是100%正確的)。說...對於非常小的批量數據應用程序來說,這當然可以應用,而XML將是無用的。但是在一般的應用程序中,我不認爲這是值得的,而且當應用程序增長時,這種差異越來越難以察覺。但是,返回並查看熟悉的代碼或者有人處理您的代碼時總是很好。我只是XML的粉絲,因爲1)它很容易(...) – davidcesarino 2011-06-15 13:50:42

相關問題