【Android】13.0 第13章 創建和訪問SQLite數據庫—本章示例主界面 -开发者知识库

【Android】13.0 第13章 創建和訪問SQLite數據庫—本章示例主界面 -开发者知识库,第1张

分類:C#、Android、VS2015;

創建日期:2016-02-26

一、簡介

Android 內置了三種數據存取方式:SQLite數據庫、文件、SharedPreferences。

這一章我們主要學習如何使用SQLite數據庫存取數據。

1、SQLite是個什么檔次的數據庫

SQLite是一種免費的、開源的數據庫,由於它獨特的設計(把各種數據類型都轉換為它自己內部處理的5種類型)導致其占用內存極少,因此很多項目都喜歡使用它。

Android集成了SQLite並內置了專門對SQLite操作的API,因此開發人員可在手機應用程序中直接使用它。

本章示例演示的是SQLite3,該版本內部僅有NULL、INTEGER、REAL(浮點數)、TEXT(字符串)、BLOB(二進制對象)共5種數據類型。換言之,它所處理的各種SQL數據類型保存時都會在內部自動轉換為這5種數據類型,由於SQLite這種獨特的設計,使它占用的內存極少且可移植性高,但是,也正因為如此,它提供的功能也很有限(只提供了最基本的數據庫操作),這也是為什么說它僅是一種輕量級的數據庫,非常適合於在嵌入式和移動應用開發中使用的原因。

 

如果將大型數據庫(Oracle、SQL Server、DB2等)和SQLite相比,可以將前者理解為是一個“大型超市”,各種商品從低檔到高檔應有盡有,但占用的空間也大;而后者則是一個“小超市”,它僅銷售大家喜歡的最基本最常用的商品,因此占用的空間也少。

但是,如果你希望它像大型超市一樣什么東西都有,那你還是直接到大型超市去吧。

 

2、訪問SQLite數據庫的方式

用C#編寫Android應用程序時,創建和訪問SQLite數據庫的方式非常多,這些都可以通過NuGet免費下載。這一章僅介紹幾種最基本的方式。

(1)用Android內置的API實現

本章的【例13-1】、【例13-2】都是用這種方式實現的。

需要引用的命名空間:

using Android.Database;

using Android.Database.Sqlite;

這里需要說明一點,直接用SQL語法來構造SQL語句是最原始的實現方式,熟悉SQL語法的可能比較喜歡用這種方式。不過,用這種方式編寫SQL語句實在是太費勁了,不但要記住各種SQL語法,而且查找SQL字符串中的錯誤也非常困難。特別是初學者,用這種方式編寫出來的程序常常漏洞百出、bug一堆。

(2)用Xamarin提供的API實現

這是安裝Xamarin for VS時內置的API,版本較早(1.0.66),利用它可通過ADO.NET訪問sqlite數據庫。上一章(第12章)的【例12-5】簡單記事本功能就是用這種方式實現的。

早期版本需要引用的命名空間:

using Mono.Data.Sqlite;

新版本(1.0.99)支持.NET的各種版本,包括.NET 4.5、4.6以及LINQ、Entity Framework等,但目前尚不成熟,還在持續改進中,暫時先不使用它吧,等它完善了再玩也不晚。

新版本需要引用的命名空間:

using System.Data.Sql;

using System.Data.SqlClient;

(3)用sqlite-net實現

sqlite-net是用C#編寫的操作SQLite數據庫的輕量級的、開源的程序包,該程序包的C#源程序可直接通過NuGet直接下載到你的項目中。這個程序包最初的設計目的是為了用於操作iPhone應用程序中的SQlite的,但也可以在安卓應用程序中使用它。

sqlite-net的主要目標是設計一個快速而方便的數據庫訪問層。它是按照下面的這些原則來設計這個庫的:

  • 易於集成現有項目和MonoTouch項目。
  • 對SQLite快速高效的輕量級包裝(不會因為使用了它而引起查詢的性能瓶頸)。
  • 提供簡單方法來安全執行CRUD操作(即:創建、讀取、更新、刪除),以及通過檢索強類型檢索方式來執行可帶參數的查詢,並快速返回結果。
  • 內部包含一個輕量級的ORM反射驅動層,從而讓你可以完全使用你自己定義的數據模型。

注意:sqlite-net並沒有提供ADO.NET的完整實現,也沒有提供SQLite的完整驅動。如果你需要這些,請使用Mono.Data.SQLite(即13.1介紹的內容)或者csharp-sqlite。

可利用NuGet免費下載sqlite-net程序包:

  • sqlite-net:容量很小(最新的1.0.8版本解壓后也僅有143KB)
  • SQLiteNetExtensions:這個是sqlite-net的ORM擴展包(最新版本為1.3.0),支持1對1、1對n、n對1、n對n的關聯操作。

但是,由於后來又出現了改進的SQLite.NET-PCL,所以這個用C# 3.0寫的早期版本的sqlite-net就變得沒用了。

(4)用SQLite.NET-PCL和SQLite.NET.Async-PCL實現

本章的【例13-3】、【例13-4】都是用這種方式實現的。

SQLite.Net-PCL在sqlte-net的基礎上改進的程序包(最新的版本是3.1.1版),它除了支持同步和異步操作以外,還支持跨多種平台,例如Xamarin.Android、Xamarin.iOS(Classic)、Xamarin.iOS(Unified)、Windows Phone 8.1、Win8、Win10、……)等。

使用SQLite.Net-PCL時不需要下載sqlte-net。但是,為了區分原來的sqlte-net,這個包才又將其命名為SQLlite.NET-PCL。

PCL是英文“Portable Class Library”的縮寫,含義是:用它設計的庫可運行在Win8、Win10、Win32、Window Phone、monotouch、MonoAndroid、……等平台上。

SQLite.Net-PCL對sqlte-net的API做了一些修改。具體修改的地方有:

  • 修改了SQLiteConnection類,使其可以跨多個平台。
  • 提供了SQliteAsyncConnection,使其支持跨多個平台的異步操作。注意在這個類中,你編寫的Task.Run模式的程序由SQLiteAsyncConnection來管理它。
  • 修改了DateTime的串行化實現,以便可讓其支持多區域。如果你要獲取本地化的DateTime,需要調用dateTime.ToLocalTime()。

總的來說,如果你希望編寫可跨Android、iOS、Windows Phone、……等多個平台的數據庫公共操作類,建議用它來實現。

3、其他說明

不論你使用哪種數據庫,也不論你采用哪種技術,一定要始終記住一點:手機應用程序是一種客戶端程序,沒有網絡編程的基礎你很難去完整地理解它。特別是別指望在實際項目中把數據庫直接塞到手機中,你不會迷糊到用一個手機去當作服務器給很多人提供服務吧。在實際的大型應用中,數據庫都是專門的服務器(到底需要多少個服務器那要看應用的規模了),而客戶端僅僅是通過網絡間接地和數據庫服務器打交道來存取手機中需要的極小的一部分數據而已。那么,通過網絡直接建立連接的是誰呢?是應用服務器中的程序對外公開的服務或接口,比如Web Service、Web API、……等。

但是,作為例子,都是把數據庫也弄到手機上或者你自己的程序中,這樣你調試和理解起來方便,添加、刪除、復制數據庫也方便,畢竟是學學、玩玩的階段,反正記住一句話就行了:萬丈高樓不是從中間憑空蓋起來的,你只有學會和理解了它的最基本的用法,先學會蓋一個小啪啪屋,然后再研究如何一點一點增加樓層的高度才靠譜。

二、觀察本項目引用和下載的程序包

1、觀察引用的.dll文件命名空間

到這一章為止,MyDemos項目已經添加了下列引用:

【Android】13.0 第13章 創建和訪問SQLite數據庫—本章示例主界面 -开发者知识库,image,第2张

2、packages.config文件

再看看到這一章為止本項目已經通過NuGet下載了哪些程序包。MyDemos項目根目錄下packages.config文件的內容如下:

<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="SQLite.Net.Async-PCL" version="3.1.1" targetFramework="monoandroid60" />
<package id="SQLite.Net.Core-PCL" version="3.1.1" targetFramework="monoandroid60" />
<package id="SQLite.Net-PCL" version="3.1.1" targetFramework="monoandroid60" />
<package id="Xamarin.Android.Support.v4" version="23.1.1.0" targetFramework="monoandroid60" />
<package id="Xamarin.Android.Support.v7.AppCompat" version="23.1.1.0" targetFramework="monoandroid60" />
<package id="Xamarin.Android.Support.v7.CardView" version="23.1.1.0" targetFramework="monoandroid60" />
<package id="Xamarin.Android.Support.v7.RecyclerView" version="23.1.1.0" targetFramework="monoandroid60" />
</packages>

三、本章示例主界面

1、運行截圖

【Android】13.0 第13章 創建和訪問SQLite數據庫&mdash;本章示例主界面 -开发者知识库,image,第3张

2、MainActivity.cs文件中本章對應的代碼

chItems.Add(new Chapter()
{
ChapterName
= "第13章 SQLite數據庫訪問",
ChapterItems
= new ChItem[]
{
new ChItem { type=typeof(ch1301MainActivity), Title="例13-1 SQLite基本用法1-SimpleCursorAdapter", Desc = "演示如何用SimpleCursorAdapter訪問SQLite數據庫" },
new ChItem { type=typeof(ch1302MainActivity), Title="例13-2 SQLite基本用法2-自定義CursorAdapter", Desc = "演示如何用自定義CursorAdapter訪問SQLite數據庫" },
new ChItem { type=typeof(ch1303MainActivity), Title="例13-3 SQLite基本用法3-SQLite.NET-PCL", Desc = "演示如何用SQLite.NET-PCL訪問SQLite數據庫" },
new ChItem { type=typeof(ch1303MainActivity), Title="例13-4 SQLite基本用法4-SQLite.NET.Async-PCL", Desc = "演示如何用SQLite.NET.Async-PCL訪問SQLite數據庫" },
}
});

最佳答案:

本文经用户投稿或网站收集转载,如有侵权请联系本站。

发表评论

0条回复