編輯:關於android開發
分類:C#、Android、VS2015;
創建日期:2016-02-26
Android 內置了三種數據存取方式:SQLite數據庫、文件、SharedPreferences。
這一章我們主要學習如何使用SQLite數據庫存取數據。
1、SQLite是個什麼檔次的數據庫
SQLite是一種免費的、開源的數據庫,由於它獨特的設計(把各種數據類型都轉換為它自己內部處理的5種類型)導致其占用內存極少,因此很多項目都喜歡使用它。
Android集成了SQLite並內置了專門對SQLite操作的API,因此開發人員可在手機應用程序中直接使用它。
如果將大型數據庫(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的主要目標是設計一個快速而方便的數據庫訪問層。它是按照下面的這些原則來設計這個庫的:
注意:sqlite-net並沒有提供ADO.NET的完整實現,也沒有提供SQLite的完整驅動。如果你需要這些,請使用Mono.Data.SQLite(即13.1介紹的內容)或者csharp-sqlite。
可利用NuGet免費下載sqlite-net程序包:
但是,由於後來又出現了改進的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做了一些修改。具體修改的地方有:
總的來說,如果你希望編寫可跨Android、iOS、Windows Phone、……等多個平台的數據庫公共操作類,建議用它來實現。
3、其他說明
不論你使用哪種數據庫,也不論你采用哪種技術,一定要始終記住一點:手機應用程序是一種客戶端程序,沒有網絡編程的基礎你很難去完整地理解它。特別是別指望在實際項目中把數據庫直接塞到手機中,你不會迷糊到用一個手機去當作服務器給很多人提供服務吧。在實際的大型應用中,數據庫都是專門的服務器(到底需要多少個服務器那要看應用的規模了),而客戶端僅僅是通過網絡間接地和數據庫服務器打交道來存取手機中需要的極小的一部分數據而已。那麼,通過網絡直接建立連接的是誰呢?是應用服務器中的程序對外公開的服務或接口,比如Web Service、Web API、……等。
但是,作為例子,都是把數據庫也弄到手機上或者你自己的程序中,這樣你調試和理解起來方便,添加、刪除、復制數據庫也方便,畢竟是學學、玩玩的階段,反正記住一句話就行了:萬丈高樓不是從中間憑空蓋起來的,你只有學會和理解了它的最基本的用法,先學會蓋一個小啪啪屋,然後再研究如何一點一點增加樓層的高度才靠譜。
1、觀察引用的.dll文件命名空間
到這一章為止,MyDemos項目已經添加了下列引用:
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、運行截圖
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數據庫" }, } });
nagios二次開發之“依據分組繪制服務圖”背景: 在nagios3.2.0版本,曾將nagios、saltstack、Thinkphp進行整合。在整合的基礎之上,進行了
Android Studio分類整理res/Layout中的布局文件(創建子目錄),androidlayoutres/layout中的布局文件太雜,沒有層次感,受不了的我
Android動畫三部曲之一 View Animation & LayoutAnimation Tween動畫 Tween動畫又稱補間動畫。通過對view的位
Android性能優化之使用線程池處理異步任務 說到線程,我想大家都不陌生,因為在開發時候或多或少都會用到線程,而通常創建線程有兩種方式: 1、繼承Thread類