SQLite介绍

SQLite是一个非常流行的嵌入式数据库,它支持SQL语言,并且只利用很少的内存就有很好的性能。此外它还是开源的,任何人都可以使用它。许多开源项目(Mozilla, PHP, Python)都使用了SQLite。

SQLite由以下几个组件组成:SQL编译器、内核、后端以及附件。SQLite通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展SQLite的内核变得更加方便。

下图是SQLite内部结构图

SQLite基本上符合SQL-92标准,和其他的主要SQL数据库没什么区别。它的优点就是高效,Android运行时环境包含了完整的SQLite。

SQLite和其他数据库最大的不同就是对数据类型的支持,创建一个表时,可以在 CREATE TABLE 语句中指定某列的数据类型,但是你可以把任何数据类型放入任何列中。当某个值插入数据库时,SQLite将检查它的类型。如果该类型与关联的列不匹配,则SQLite会尝试将该值转换成该列的类型。如果不能转换,则该值将作为其本身具有的类型存储。如果可以把一个字符串(String)放入 INTEGER 列。SQLite称这为"弱类型"。

Android集成了SQLite数据库

Android在运行时集成了SQLite,所以每个Android应用程序都可以使用SQLite数据库。对于熟悉SQL的开发人员来说,在Android开发中使用SQLite相当简单。但是由于JDBC会消耗太多系统资源,所以JDBC对于手机这种内存受限设备来说并不合适。因此,Android提供了一些新的API来使用SQLite数据库,Android开发中,程序员需要学使用这些API。

数据库存储在data/data/<项目文件夹>/databases/下

Android开发中使用SQLite数据库

Activities可以通过Content Provider或者Service访问一个数据库。下面会详细讲解如何创建数据库、添加数据、修改数据和查询数据。

一.创建数据库

Android不自动提供数据库。在Android应用程序中使用SQLite,必须自己创建数据库,然后创建表、索引,填充数据。Android提供了SQLiteOpenHelper类帮助你创建一个数据库,你只要继承SQLiteOpenHelper类,就可以轻松创建数据库。SQLiteOpenHelper类根据开发应用程序的需要,封装了创建和更新数据库使用的逻辑。SQLiteOpenHelper的子类,至少需要实现三个方法:

1.构造函数,调用父类SQLiteOpenHelper的构造函数。这个方法需要四个参数:上下文环境(例如一个Activity),数据库名字,一个可选的游标工厂(通常是NULL),一个代表你正在使用的数据库模型版本的整数。

2.onCreate()方法,它需要一个SQLiteDatabase对象作为参数,根据需要对这个对象填充表和初始化数据。

3.onUpgrade()方法,它需要三个参数,一个SQLiteDatabase对象,一个旧的版本号和一个新的版本号,这样你就可以清楚如何把一个数据库从旧的模型转变到新的模型。

下面的示例代码展示了如何继承SQLiteOpenHelper创建数据库:

public class SQLiteDatabaseHelper extends SQLiteOpenHelper
{ public SQLiteDatabaseHelper(Context context, String name,
CursorFactory factory, int version,
DatabaseErrorHandler errorHandler)
{
super(context, name, factory, version, errorHandler);
// TODO Auto-generated constructor stub
} @Override
public void onCreate(SQLiteDatabase db)
{
// TODO 创建数据库之后对数据库进行的操作
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
// TODO 更新数据库版本的操作
} @Override
public void onOpen(SQLiteDatabase db)
{
// TODO 每次成功打开数据库后首先被执行
super.onOpen(db);
}
}

接下来讨论具体如何创建表、插入数据、删除表等等。调用getReadableDatabase()或

getWritableDatabase()方法,你可以得到SQLiteDatabase实例,具体调用哪个方法,取决于你是否需要改变数据库的内容:

DatabaseHelper dbHelper = new SQLiteDatabaseHelper(context, name, factory, version, errorHandler);

SQLiteDatabase db = dbHelper.getWritableDatabase();

  

上面这段代码会返回一个SQLiteDatabase类的实例,使用这个对象,你就可以查询或者修改数据库。当你完成了对数据库的操作(例如你的Activity已经关闭),需要调用SQLiteDatabase的Close()方法来释放掉数据库连接。

二.创建表和索引

为了创建表和索引,需要调用SQLiteDatabase的execSQL()方法来执行SQL语句。如果没有异常,这个方法没有返回值。

例如,你可以执行如下代码:

db.execSQL("CREATE TABLE myTable(_id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, value REAL )");

这条语句会创建一个名为myTable的表,表有一个列名为_id,并且有一个主键,这列的值是会自动增长的整数(例如,当你插入一行时,SQLite会给这列自动赋值),另外还有两列:title(字符)和value(浮点数)。SQLite会自动为主键列创建索引。

通常情况下,第一次创建数据库时创建了表和索引。如果你不需要改变表的schema,不需要删除表和索引。

删除表和索引需要使用execSQL()方法调用DROP INDEX和DROP TABLE语句。

三.给表添加数据

上面的代码,已经创建了数据库和表,现在需要给表添加数据。有两种方法可以给表添加数据。像上面创建表一样,你可以使用execSQL()方法执行INSERT、UPDATE、DELETE等语句来更新表的数据。execSQL()方法适用于所有不返回结果的SQL语句。例如:

Db.execSQL("INSERT INTO widgets (name, inventory)" + "VALUES ('Sprocket', 5)");

另一种方法是使用SQLiteDatabase对象的insert()、update()、delete()方法。这些方法把SQL语句的一部分作为参数。示例如下:

ContentValues = cv = new ContentValues();

cv.put(Constants.TITLE, "example title");

cv.put(Constants.VALUE, SensorManager.GRAVITY_DEATH_STAR_I);

db.insert("myTable", getNullColumnHack(), cv);

update()方法有四个参数,分别是表名,表示列名的值和ContentValues对象,可选的WHERE条件和可选的填充WHERE语句的字符串,这些字符串会替换WHERE条件中的 "?" 标记。update()根据条件,更新指定列的值,所以用execSQL()方法可以达到同样的目的。

WHERE条件和其参数和用过的其他SQL APIS类似。例如:

String[] parms = new String[] {"this is a string"};

db.update("widgets", replacements, "name=?", parms);

delete()方法的使用和update()类似,使用表名,可选的WHERE条件和相应的填充WHERE条件的字符串。

四.查询数据库

  类似INSERT、UPDATE、DELETE,有两种方法使用SELECT从SQLite数据库检索数据。

  1.Raw Query()

    正如API名字,rawQuery()是最简单的解决方法。通过这个方法你就可以调用SQL SELECT语句。例如:

    Cursor c = db.rawQuery("SELECT name FROM sqlite_master WHERE type='table' AND name='myTable'", null);

    在上面的例子中,我们查询SQLite系统表(sqlite_master)检查table表是否存在。返回值是一个cursor对象,这个对象的方法可以迭代查询结果。  

    如果查询是动态的,使用这个方法就会非常复杂。例如,当你需要查询的列在程序编译的时候不能确定,这时候使用query()方法会方便很多。

  2.Regular Queries

    query()方法用SELECT语句段构建查询。SELECT语句内容作为query()方法的参数,比如:要查询的表名,要获取的字段名,WHERE条件,包含可选的位置参数,

    去替代WHERE条件中位置参数的值,GROUP BY 条件,HAVING条件。

    除了表名,其他参数可以是null。所以,以前的代码段可以写成:

    String[] columns = {"ID", "inventory"};

    String[] parms = {"snicklefritz"};

    Cursor result = db.query("widgets", columns, "name=?", parms, null, null, null);

五.使用游标

不管你如何执行查询,都会返回一个Cursor,这是Android的SQLite数据库游标,使用游标,你可以:

    1.通过getCount()方法得到结果集中有多少记录;

    2.通过moveToFirst()、moveToNext()、isAfterLase()方法遍历所有记录;

    3.通过getColumnNames()得到字段名;

    4.通过getColumnIndex()转换成字段号;

    5.通过getString()、getInt()等方法得到给定字段当前记录的值;

    6.通过requery()方法重新执行查询得到游标;

    7.通过close()方法释放游标资源;

例如,下面代码遍历myTable表

Cursor result = db.rawQuery("SELECT ID, name, inventory FROM myTable");

result.moveToFirst();

while(!result.isAfterLase())

{

    int id = result.getInt(0);

String name = result.getString(1);

int inventory = result.getInt(2);

result.moveToNext();

}

Result.close();

  

六.在Android中使用SQLite数据库管理工具

在其他数据库上作开发,一般都使用工具来检查和处理数据库的内容,而不是仅仅使用数据库的API。使用Android模拟器,有两种可供选择的方法来管理数据库。

首先,模拟器绑定了sqlite3控制台程序,可以使用adb shell命令来调用他。只要你进入了模拟器的shell,在数据库的路径执行sqlite3命令就可以了。数据库文件一般存放在:

/data/data/your.app.package/databases/your-db-name

如果你喜欢使用更友好的工具,你可以把数据库拷贝到你的开发机上,使用SQLite-aware客户端来操作它。这样的话,你在一个数据库的拷贝上操作,如果你想要你的修改能反映到设备上,你需要把数据库备份回去。

把数据库从设备上拷贝出来,你可以使用adb pull命令(或者在IDE上做相应的操作)。存储一个修改过的数据库到设备上,使用adb push命令。

结束语

如果你想要开发Android应用程序,一定需要在Android上存储数据,使用SQLite数据库是一种非常好的选择。本文介绍了如何在Android应用程序中使用SQLite数据库,主要介绍了在Android应用程序中使用SQLite创建数据库和表、添加数据、更新和检索数据,还介绍了比较常用的SQLite管理工具。

[JIT_APP]Android SQLite简介的更多相关文章

  1. Android SQLite简介

    SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PHP, Python)都使 ...

  2. Android——SQLite/数据库 相关知识总结贴

    android SQLite简介 http://www.apkbus.com/android-1780-1-1.html Android SQLite基础 http://www.apkbus.com/ ...

  3. Android SQLite数据库使用

    在Android开发中SQLite起着很重要的作用,网上SQLite的教程有很多很多,不过那些教程大多数都讲得不是很全面.本人总结了一些SQLite的常用的方法,借着论坛的大赛,跟大家分享分享的.一. ...

  4. "浅谈Android"第一篇:Android系统简介

    近来,看了一本书,名字叫做<第一行代码>,是CSDN一名博主写的,一本Android入门级的书,比较适合新手.看了书之后,有感而发,想来进行Android开发已经有一年多了,但欠缺系统化的 ...

  5. Android SQLite (二) 基本用法

    在Android开发中SQLite起着很重要的作用,网上SQLite的教程有很多很多,不过那些教程大多数都讲得不是很全面.本人总结了一些SQLite的常用的方法,借着论坛的大赛,跟大家分享分享的. 一 ...

  6. Android系统简介(中):系统架构

    Android的系统架构栈分为4层,从上往下分别是Applications.Application framework.Libraries  & Android Runtime.Linux  ...

  7. 数据库-SQLite简介

    SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库(轻型数据库). 由于资源占用少.性能良好和零管理成本,嵌入式数据库有了它的用武之地,像Android.iPhone都有内置的S ...

  8. Android SQLite基本用法

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

  9. Android SQLite学习指南

    一.SQLite简介 在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL.INTEGER.REAL(浮点数字).TEXT(字符串文本)和BLOB(二进制对 ...

随机推荐

  1. google map 定位

    在map初始化的过程中,得到当前经纬度,完成初始化地图,通过HTML5中的Geolocation实现,具体参考:http://www.jb51.net/html5/71556.html 1.获取当前地 ...

  2. android - DefaultHttpClient设置超时.

    Android的DefaultHttpClient中,超时设置需要调用HttpConnectionParams.setConnectionTimeout方法,如(以下代码的31~35行代码): ref ...

  3. 不知道的陷阱:C#委托和事件的困惑

    转载网址:http://www.cnblogs.com/buptzym/archive/2013/03/15/2962300.html 不知道的陷阱:C#委托和事件的困惑   一. 问题引入 通常,一 ...

  4. SVM技法

    PLA不管胖瘦,SVM喜欢胖的 fewer dichotomies=> small VC 演算法的VC dimension shatter 掉3个点 如果限制胖瘦,两个点都shatter不掉 喜 ...

  5. YouTube视频代码总结

    var tag = document.createElement('script'); tag.src = "https://www.youtube.com/iframe_api" ...

  6. mysql基本介绍和优化技巧

    一. mysql框架和基本介绍 1. 框架图 更详细: 2. 存储引擎 MYISAM与INNODB对比: MYISAM:mysql5.1及以前版本的默认存储引擎.支持全文检索,压缩,表级锁等,但不支持 ...

  7. CodeforcesGym101116 B Bulbs

    Description Greg has an \(m \times n\) grid of Sweet Lightbulbs of Pure Coolness he would like to tu ...

  8. 提升 DevOps 效率,试试 ChatOps 吧!

    本文翻译自文章 To Boost DevOps, Try ChatOps,文中用简单易懂的方式介绍了 ChatOps 的发展和价值,由 OneAPM 工程师编译整理. 当我们谈论 DevOps 时,总 ...

  9. 使用mysql-proxy代理实现msyql数据库读写分离

    要实现读写分离,可以先看看如何实现mysql数据库主从:http://www.cnblogs.com/sustudy/p/4174189.html mysql-proxy下载地址(要看好对应版本):h ...

  10. 如何在sourcetree 下提交代码到gerrit上

    gerrit的审核机制决定了提交到远程到代码并非远程master分支,而是/refs/for/master 分支,所以需要解决怎么在sourcetree下提交代码到/refs/for/master分支 ...