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

3 則留言:

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

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

      刪除
  2. Do you understand there is a 12 word sentence you can communicate to your crush... that will trigger deep feelings of love and instinctual attraction for you buried within his heart?

    Because hidden in these 12 words is a "secret signal" that fuels a man's impulse to love, admire and guard you with all his heart...

    12 Words Who Fuel A Man's Desire Response

    This impulse is so built-in to a man's brain that it will drive him to try better than ever before to make your relationship the best part of both of your lives.

    Matter-of-fact, triggering this powerful impulse is so essential to achieving the best possible relationship with your man that the instance you send your man a "Secret Signal"...

    ...You'll soon find him expose his mind and heart for you in such a way he haven't expressed before and he will see you as the only woman in the galaxy who has ever truly appealed to him.

    回覆刪除