内容来源:高成珍、钟元生《Android编程经典案例解析》

SQLite 数据库是Android 中内嵌的轻量级关系型数据库,本质上只是一个文件。SQLite 内部只支持NULL,INTEGER, REAL,TEXT 和BLOB 这五种数据类型,在SQLite 中可以把各种类型的数据保存到任何字段中而不用关心字段声明的数据类型是什么,例如可以把字符串类型的值存入INTEGER类型的字段中。因此在编写建表语句时可以省略数据列后面的类型声明。但有一种情况例外,定义为INTEGER PRIMARY KEY 的字段只能存储64位整数,当向这种字段保存整数以外的数据时会产生错误。

常见的SQL标准语句如下:

1. 查询:

select * from 表名 where 条件子句 group by 分组子句 having ...order by 排序子句

例如:

select name from person group by name having count(*) > 1

查询person 表中name 字段值出现超过1次的name 字段的值

2. 分页:

select * from 表名 limit 跳过的记录数, 显示的记录数

例如:

select * from person limit 3, 5

从person 表中获取5条记录,跳过前面三条记录

3. 插入:

insert into 表名(字段列表) values(值列表)

例如:

insert into person(name, age) values(‘张三’, 20)

向person表中插入一条记录,名字为小明,年龄为20岁

4. 更新:

update 表名 set 字段名=值 where 条件子句

例如:

update person set name=‘李四’ where id=10

将ID为10的记录的姓名改为李四

5.删除:

delete from 表名 where 条件子句

例如:

delete from person where id=10

删除person中ID为10的记录

与SQLite相关的几个类:

1.  SQLiteOpenHelper 是Android提供的管理数据库的工具类,主要用于数据库的创建/打开和版本更新等。该类是一个抽象类,在使用时需要创建SQLite类的子类,并重写它的  onCreate() 和onUpdate() 方法(这两个方法是抽象的,必须扩展)。

在SQLiteOpenHelper类中包含的方法主要如下:

(1)public abstract void onCreate(SQLiteDatabase db);

当数据库第一次被创建时调用该方法,通常在该方法中执行初始化操作,如创建表结构,插入初始数据等。

(2)public abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion);

数据库版本发生变化时调用该方法。

(3)public void onOpen(SQLiteDatabase db) {}

当数据库打开时调用该方法。

(4)public SQLiteDatabase getReadableDatabase();

以读写的方式打开数据库对应的SQLiteDatabase 对象,该方法内部调用 getWritableDatabase() 方法, 返回的对象与getWritableDatabase()对象返回的方法一致,当数据库磁盘空间满了时,通过getWritableDatabase() 方法打开数据库就会出错,但通过getReadableDatabase() 方法会尝试以只读的方式打开数据库。

(5)public SQLiteDatabase getWritableDatabase();

以写的方式打开数据库对应的SQLiteDatabase 对象,一旦打开成功,将会缓存该数据库对象。

当调用SQLiteOpenHelper 的getWritableDatabase() 或getReadableDatabase() 方法获取SQLite 实例时,系统会根据数据库名称来判断该数据库是否存在,如果数据库不存在,Android系统会自动生成一个数据库,然后回调onCreate方法,在onCreate()方法中执行建表语句及添加一些初始化数据。如果数据库存在,系统再根据数据库的版本号来判断是否需要更新,如果版本号与之前的不一致,则需要更新,系统自动调用onUpgrade() 方法,在该方法中根据需要执行数据表的结构及数据更新。

2. SQLiteDatabase 是Android提供的SQLite 数据库的封装类,该类封装了一些操作数据库的API,通过该类可以完成数据的添加(Create)/查询(Retrieve)/更新(Update)和删除(Delete) 操作,分别提供了insert(), query(), update(), delete() 方法。此外还有两个实用的方法:execSQL() 和rawQuery() 方法。execSQL() 方法可以执行insert/delete/update 和 create table 之类有更改行为的SQL语句,而rawQuery() 用于执行select 语句。原型分别如下:

//----------执行带占位符(占位符用?表示)的SQL语句,如果SQL语句中没有占位符,则第二个参数可传null。

execSQL(String sql, Object[] bindArgs);

//----------执行SQL语句

execSQL(String sql);

//----------执行带占位符的SQL查询。

rawQuery(String sql, String[] selectionArgs);

3. Cursor 接口主要用于存放查询记录的接口,Cursor 是结果集游标,用于对结果集进行随机访问。Cursor 提供了以下方法来移动查询结果的记录指针:

(1)move(int offset);//----------------将记录指针向上(offset为负)或向下(offset为正)移动指定行数;

(2)moveToNext();//------------------将游标从当前记录移动到下一条记录,如果已经移过了结果集的最后一条记录,返回false,否则返回true;

(3)moveToPrevious();//--------------将游标从当前记录移动到上一记录,如果已经移过了结果集的第一条记录,返回false,否则返回true;

(4)moveToFirst();//------------------将游标移动到结果集的第一条记录,如果结果集为空,返回false,否则返回true;

(5)moveToLast();//------------------将游标移动到结果集的最后一条记录,如果结果集为空,返回false,否则返回true;

使用SQLiteDatabase 进行数据库操作的步骤:

(1)创建数据库的辅助类对象,指定数据库的名称和版本号(继承抽象类SQLiteOpenHelper 并实现onCreate() 和 onUpgrade() );

(2)调用辅助类的getReadableDatabase() 或getWritabelDatabase()方法,获取SQLiteDatabase 对象,该对象代表了与数据库的连接;

(3)调用SQLiteDatabase对象的相关方法来执行增/删/查/改操作;

(4)对数据库操作的结果进行处理,例如判断是否插入/删除或者更新成功,将查询结果记录转换成列表显示等;

(5)关闭数据库连接,回收资源。

SQLite 数据库的更多相关文章

  1. Android之SQLite数据库篇

    一.SQLite简介 Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大. 二.SQLite的特点 1.轻量级使用 SQLit ...

  2. Qt5 开发 iOS 应用之访问 SQLite 数据库

    开发环境: macOS 10.12.1 Xcode 8.1 Qt 5.8 iPhone 6S+iOS 10.1.1   源代码: 我在 Qt 程序里指定了数据库的名称来创建数据库,在 Win10.An ...

  3. 【Win 10 应用开发】Sqlite 数据库的简单用法

    如果老周没记错的话,园子里曾经有朋友写过如何在 UWP 项目中使用 Sqlite数据库的文章.目前我们都是使用第三方封装的库,将来,SDK会加入对 Sqlite 的支持. 尽管目前 UWP-RT 库中 ...

  4. Android之SQLite数据库使用

    转载整理于:http://my.csdn.net/lmj623565791 我刚开始接触Android的时候甚至都不敢相信,Android系统竟然是内置了数据库的!好吧,是我太孤陋寡闻了.由于我之前是 ...

  5. 让PDF.NET支持最新的SQLite数据库

    最近项目中用到了SQLite,之前项目中用的是PDF.NET+MySQL的组合,已经写了不少代码,如果能把写好的代码直接用在SQLite上就好了,PDF.NET支持大部分主流的数据库,这个当然可以,只 ...

  6. iOS sqlite数据库图像化查看

    问题描述:在xocde上用sqlite数据库的时候,因为没有图形化界面,有些时候很难看出自己设计的数据库是否有问题,比如我刚上手sqlite数据库设计id为自增长时,很自然的用了identify(1, ...

  7. Android中SQLite数据库小计

    2016-03-16 Android数据库支持 本文节选并翻译<Enterprise Android - Programing Android Database Applications for ...

  8. Android开发-之SQLite数据库

    之前我们讲了如何将数据存储在文件中,那么除了这种方式呢,就是我们常见的大家都知道的将数据存储在数据库当中了. 将数据存储在数据库中的优势: 1)存储在数据库中的数据更加方便操作,比如增.删.改.查等 ...

  9. Java操作Sqlite数据库-jdbc连接

    Java操作Sqlite数据库步骤: 1. 导入Sqlite jdbc 本文使用sqlite-jdbc-3.7.2.jar,下载地址 http://pan.baidu.com/s/1kVHAGdD 2 ...

  10. Android开发学习——SQLite数据库与单元测试

    SQLite数据库 轻量级关系型数据库 创建数据库需要使用的api:SQLiteOpenHelper  public class Myopenhelper extends SQLiteOpenHelp ...

随机推荐

  1. PostgreSQL指南

    PostgreSQL指南 历史简介 最近几年Postgres的关注度变得越来越高. 它加快了Postgres的发展步伐, 与此同时其他 的关系数据库系统的发展放缓. 在数据库领域中 Postgre S ...

  2. 第24篇 js小知识和“坑”

    前面说了说了js的相关知识,基本上除了语法外,把项目常用的知识做了一个梳理,现在说下js的其它方面的知识,这些知识不成体系,属于不理解对于一般开发没什么太多影响,但如果理解清楚,可以更好去开发. js ...

  3. 第十八篇 js高级知识---作用域链

    一直有想法去写写js方面的东西,我个人是最喜欢js这门语言,喜欢的他的自由和强大,虽然作为脚本语言有很多限制的地方,但也不失为一个好的语言,尤其是在H5出现之后.下面开始说说js的方面的东西,由于自己 ...

  4. Omi应用md2site发布-markdown转网站利器

    写在前面 Md2site是基于Omi的一款Markdown转网站工具,使用简单,生成的文件轻巧,功能强大. 当我们想把一堆markdown文档转成网站时,你可能有许多选择,倘若选择 md2site , ...

  5. 构建Docker平台【第三篇】安装 kubernetes 组件

    第一步:准备 1. 安装包: kubeadm-1.6.0-0.alpha.0.2074.a092d8e0f95f52.x86_64.rpm kubernetes-cni-0.3.0.1-0.07a8a ...

  6. Android学习总结(十五) ———— Notification(状态栏通知)基本用法

    一.Notification基本概念  Notification是一种具有全局效果的通知,它展示在屏幕的顶端,首先会表现为一个图标的形式,当用户向下滑动的时候,展示出通知具体的内容.我们在用手机的时候 ...

  7. 1592: [Usaco2008 Feb]Making the Grade 路面修整

    1592: [Usaco2008 Feb]Making the Grade 路面修整 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 428  Solv ...

  8. 算法模板——KMP字符串匹配

    功能:输入一个原串,再输入N个待匹配串,在待匹配串中找出全部原串的起始位置 原理:KMP算法,其实这个东西已经包含了AC自动机的思想(fail指针/数组),只不过适用于单模板匹配,不过值得一提的是在单 ...

  9. Django中使用CKEditor代码高亮显示插件Code Snippet

    Django使用CKEditor可以安装django-ckeditor这个模块,具体步骤可按照这里进行:http://www.nanerbang.com/article/2/ 我在富文本编辑器中想使用 ...

  10. 谈谈Backbone.js中的el

    小编最近开始接触backbone.js,这个曾经非常优秀的一款MVC前端框架,在学习的过程中,遇到下图的这样一个问题 下面上代码 小编的想法很简单,只是view了一个实例,然后在initalize中调 ...