2017年2月22日 星期三

在 Xamarin.Android 當中使用 LiteDB 處理 NoSQL 資料…

 

1

 

平常我們在 Mobile App 中常用 SQLite 來儲存 Mobile App 中的資料,但遇到為數較多的非關聯式資料要儲存的時候(如: 圖片等),就得另外作資料上的處理後才能作存取,此時就顯得有點綁手綁腳的。

後來發現了 LiteDB 這個原生利用 C# 打造的 Embedded DB,讓只要是 C# 開發的任何應用程式,都可以利用 LiteDB 來儲存資料,而 LiteDB 除了本身的 DLL 量體小、直接支援 Linq 查詢、效能快 (多種情境下都比 SQLite 快)、加密 …等好處之外,最重要的就是它從一開始打造時就是用處理 NoSQL 的 DB 架構設計的。

因此,當 Mobile App 遇到需要儲存為數較多的非關聯式資料時,用 LiteDB 來儲存就相當方便,以下我們就簡單的來看看如何在 Xamarin.Android 當中,使用 LiteDB 處理圖片儲存與讀取。

開始囉~~~

 

首先照慣例,先建一個 Xamarin.Android 的專案。

2

 

接著直接在建立好的專案上點選右鍵選單中的"管理NuGet套件"。

3

接著在NuGet 封裝管理員中點選"瀏覽",搜尋 LiteDB。點選搜尋到的 LiteDB 套件後點選安裝。

4

 

安裝完成後,專案的參考會多出 LiteDB 的 DLL 參考。

5

 

接著打開專案的Resources底下的Layout底下的Main.axml檔案。

6

 

設計這個測試 App 的畫面如下圖:

7

實線框當中的元件為Button,由上到下的 Id 依序為 SaveImageFromUrlToLiteDbButton、 LoadImageFromLiteDbButton、SaveImageFromLiteDbToLocalFileButton。

虛線框當中的元件為ImageView,其 Id 為 MainImageView。

 

設計完成後,打開 MainActivity.cs 來增加對應的程式碼。

8

 

首先先設定使用 LiteDb 時會用到的一些基本定義值。

9

在此測試App中的 DB 名稱定義為 "MyData.db”,再透過 LiteDB 本身所設計的連線字串格式設定好連線字串(LiteDB Connection String)。

 

接著設定畫面按鈕與按鈕點選的事件註冊,如下圖程式碼:

10

 

在此測試的 App 其中的一個按鈕功能是想要做到從網路上下載一個圖片檔後,將此圖片儲存到 LiteDB 當中。

下圖展示額外寫一個方法來完成從網路上下載圖片到 LiteDB 當中的功能。

11

由於在這邊是使用 HttpClient來下載圖片,請自行利用Nuget來安裝HttpClient套件道專案當中。另外,其中的FileKey請給一個不會重複的 Key值,在這邊簡單的使用檔名做Hash的方式當作FileKey,請讀者要依照真正專案的需求性定義應有的Key值。

接著回到 SaveImageFromUrlToLiteDbButton 按鈕點選的程式碼,呼叫此方法,並傳入圖片所在的位址。

12

 

繼續完成第二個按鈕的功能,將 LiteDB 當中所存的圖檔,讀取呈現到 ImageView 當中,如下圖程式碼:

13

若對以上讀取圖片顯示的程式沒有太熟悉的朋友,可參考 "在 Xamarin.Android 當中讀取圖片來顯示的方法…I" 與 "在 Xamarin.Android 當中讀取圖片來顯示的方法…II" 兩篇文章多加了解。

 

最後第三個按鈕的功能,將 LiteDB 當中所存的圖檔,寫出到檔案系統當中存成一張圖片檔,如下圖:

14

 

 

執行結果

開始測試之前,請先從 Visual Studio 的 "工具" 選單當中,找到 "Android -> Android 裝置監視器"。

15

在 "Android 裝置監視器" 當中,看到 "File Explorer" 分頁。

16

 

接著回到在 Visual Studio 當中執行測試該專案後,回到 "Android 裝置監視器" 的 "File Explorer" 當中的 "data –> data" 底下,找到該測試專案 App1.App1 使用檔案的情形。

17

 

在執行起來的 App1當中,點選第一顆按鈕:

18

就會在 "File Explorer" 當中看到出現了 "MyData.db"。

19

 

接著再按下第二顆按鈕,就會看到下面的 ImageView 出現我們存在 LiteDB 中的圖檔。

2021

 

在按下第三顆按鈕,會將存在 LiteDB 的圖檔寫到檔案系統當中,透過 "Android 裝置監視器" 的 "File Explorer" 來觀察這件事情,看到下載的圖檔存在指定的路徑底下。

22

23

 

當然,若透過 "Android 裝置監視器" 的 "File Explorer" 將檔案抽取出來,當然可以到這張完整的圖檔顯示的。

24

 

以上就是簡單的使用 LiteDB 來處理非關聯式資料的簡單操作,有興趣的人趕快試用看看吧~~

 

而 LiteDB 目前有個比較明顯的缺點,就是沒有在電腦上可協助瀏覽資料庫檔案的工具(舊版有 LiteDB Viewer,但是到了 v3 之後此工具暫時無法正常使用)。等待善心人士更新或完成。

(3/10 更新:已經在2月底 release 新版的 Viewer工具 https://github.com/falahati/LiteDBViewer/releases/tag/v3.0.1)

25 

 

然後,不知道為什麼 LiteDB 很少中文的資源與介紹資料,看它從發表到現在也已經兩年了,很少人介紹這可能也是個缺點吧…

 


 


本篇文章同步發表於 昕力大學 ,網址是:

https://tpu.thinkpower.com.tw/tpu/File/html/201702/20170221224154_f.html

歡迎前往 昕力大學 觀看更多有關 Xamarin 的文章。

 

參考資料:

LiteDB 官網:
http://www.litedb.org/

LiteDB Viewer
https://github.com/falahati/LiteDBViewer

2 則留言:

  1. 請問冒昧詢問幾個問題
    我現在是用VC在開發桌面3D軟體,想朝跨平台前進,但是只鎖定window and macros ,不需要考慮行動裝置,目前有使用c#開發,覺得不錯,請問我使用Xamarin是否可以達到開發跨平台3d軟件的需求?

    回覆刪除
    回覆
    1. Hi Xamarin的技術也是可以用C#跨平台開發 MacOS 的應用程式,但我不確定您所說的桌面3D軟體是會做到什麼階段,而且3D技術不是我熟悉的技術,比較難回答你。如果有興趣可以到Facebook的Xamarin Asia Developers的社群來討論,應該會有更多人會回答你。

      刪除