分类: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项目已经添加了下列引用:

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数据库" },
}
});

【Android】13.0 第13章 创建和访问SQLite数据库—本章示例主界面的更多相关文章

  1. 【Android】13.1 用Android自带的API访问SQLite数据库

    分类:C#.Android.VS2015: 创建日期:2016-02-26 一.简介 这一节我们先来看看如何直接用Android自带的API创建和访问SQLite数据库. 1.创建SQLite数据库 ...

  2. 【Android】13.4 使用SQLite.NET.Async-PCL访问SQLite数据库

    分类:C#.Android.VS2015: 创建日期:2016-02-27 一.简介 这一节演示如何利用以异步方式(async.await)访问SQLite数据库. 二.示例4运行截图 下面左图为初始 ...

  3. 【Android】19.0 第19章 前面章节的代码优化及本章示例主界面

    分类:C#.Android.VS2015: 创建日期:2016-03-05 一.简介 这一章我们介绍"共享存储和内容提供程序"的基本用法. 二.先优化一下前面章节例子的代码 在前面 ...

  4. 【Android】7.0 第7章 简单适配器和布局--本章示例主界面

    分类:C#.Android.VS2015: 创建日期:2016-02-09 修改日期:2016-02-13 一.在AssemblyInfo.cs文件中配置应用程序清单 前面的章节我们说过,除了在And ...

  5. 【Android】13.2 使用自定义的CursorAdapter访问SQLite数据库

    分类:C#.Android.VS2015: 创建日期:2016-02-26 一.简介 SQliteDemo1的例子演示了SimpleCursorAdapter的用法,本节我们将使用用途更广的自定义的游 ...

  6. 【Android】17.0 第17章 服务绑定—本章示例主界面

    分类:C#.Android.VS2015: 创建日期:2016-03-03 一.简介 通过服务绑定(Bound Services),可以轻松实现后台服务与界面(UI)的交互. 二.本章示例主界面 1. ...

  7. 【Android】12.0 第12章 Intent及其过滤器—本章示例主界面

    分类:C#.Android.VS2015: 创建日期:2016-02-23 一.简介 这一章我们主要学习Intent的基本用法,并通过例子演示如下功能: 如何启动另一个界面: 如何获取另一个界面的返回 ...

  8. 【Android】11.0 第11章 活动和片段--本章示例主界面

    分类:C#.Android.VS2015: 创建日期:2016-02-21 一.简介 这一章我们学习activity和fragment,深入理解activity和fragment的生命周期是如何工作的 ...

  9. 【Android】16.0 第16章 自定义服务和系统服务—本章示例主界面

    分类:C#.Android.VS2015: 创建日期:2016-03-01 一.简介 本章主要演示Started Service.带Intent过滤器的Started Service.IntentSe ...

随机推荐

  1. CloudStack 4.0.2 vRouter导致重启后状态不正常

    最近总玩CloudStack + KVM,发现在重启CloudStack服务后,host(kvm)的状态老是为alert.日志里出现如下错误提示: ERROR [agent.manager.Agent ...

  2. Openshift 和Harbor的集成

    1.安装配置Harbor 环境rhel 7.6 安装docker,python 安装docker-compose sudo curl -L https://github.com/docker/comp ...

  3. TYVJ P1933 绿豆蛙的归宿 题解(未完成)

    P1933 「Poetize3」绿豆蛙的归宿 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 随着新版百度空间的上线,Blog宠物绿豆蛙完成了它的使命,去寻找 ...

  4. MANIFEST.MF文件Class-Path:节点需要引入的jar太多解决方案

    每行开头结尾都要有一个空格(半角的) 例子如下: Manifest-Version: 1.0 Class-Path: lib/mongo-java-driver-2.11.4.jar lib/guav ...

  5. (剑指Offer)面试题38:数字在排序数组中出现的次数

    题目: 统计一个数字在排序数组中出现的次数. 思路: 1.顺序遍历 顺序扫描一遍数组,统计该数字出现的次数. 时间复杂度:O(n) 2.二分查找 假设我们需要找的数字是k,那么就需要找到数组中的第一个 ...

  6. Report Studio中目录结构报表浅析

    一:场景:在一个报表中如果存在多个页面,每个页面显示不同的数据,如何通过目录控件实现对每一个报表的友好访问呢?下面我们就来看一下下面的效果,如下图1,2 图1:-------------------- ...

  7. 怎样更爽地看PDF杂志

    下载了一些PDF的杂志,想着要是全屏双页显示,应该是很爽的,但是,下载了应该foxit reader,还是遇到一些问题: 1.全屏:F11即可 2.全屏后不双页:在选项中,"全屏" ...

  8. C#基础视频教程7.1 如何编写简单游戏

    要做一个FlappyBird,最核心的功能是创建几个区块,如果发生碰撞则游戏结束(小鸟撞到管子上,或者小鸟到地上),至于随机生成一些管子,小鸟如何跳跃,最后如何统计分数,都不难想通要怎么做.   首先 ...

  9. 论文笔记《Feedforward semantic segmentation with zoom-out features》

    [论文信息] <Feedforward semantic segmentation with zoom-out features> CVPR 2015 superpixel-level,f ...

  10. BOM*创建工艺路线

    --工艺路线 DECLARE -- API input variables l_operation_tbl bom_rtg_pub.operation_tbl_type := bom_rtg_pub. ...