Android开发中使用SQLite 数据库


  SQPte 一个十分 风行的嵌入式数据库,它 支撑 SQL 语言,而且只利用很少的内存就有很好的性能 。此外它还是开源的,任何人都 可以 使用它 。许多开源 名目((Mozilla, PHP, Python)都 使用了 SQPte.

  SQPte 由以下几个组件构成:SQL 编译器、内核、后端以及附件 。SQPte 通过利用 虚构机和 虚构数据库引擎(VDBE),使调试、 批改和 扩大 SQPte 的内核变得更加容易 。

  图 1. SQPte 内部 构造

  

Android 开发中

使用 SQLite 数据库

  SQPte 根本上 相符 SQL-92 标准,和 其余的重要 SQL 数据库没什么区别 。它的 长处便是高效,Android 运行时环境包括了 完全的 SQPte 。

  SQPte 和 其余数据库最大的不同便是对数据类型的 支撑, 缔造一个表时, 可以在 CREATE TABLE 语句中指定某列的数据类型,然而你 可以把任何数据类型放入任何列中 。当某个值插入数据库时,SQPte 将 审查它的类型 。假如该类型与关联的列不匹配,则 SQPte 会尝试将该值转换成该列的类型 。假如不能转换,则该值将作为其 本身 存在的类型存储 。 比方 可以把一个字符串(String)放入 INTEGER 列 。SQPte 称这为“弱类型”(manifest typing.) 。

  此外,SQPte 不 支撑一些 标准的 SQL 性能,特殊是外键 束缚(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FPL OUTER JOIN, 还有一些 ALTER TABLE 性能 。

  除了上述 性能外,SQPte 是一个 完全的 SQL 系统, 占有 完全的触发器,交易等等 。

  Android 集成了 SQPte 数据库

  Android 在运行时(run-time)集成了 SQPte,所以每个 Android 利用程序都 可以 使用 SQPte 数据库 。关于 相熟 SQL 的开发人员来时,在 Android 开发中 使用 SQPte 相当 容易 。然而,因为 JDBC 会 消费太多的系统资源,所以 JDBC 关于手机这种内存受限 设施来说并不 合适 。 因此,Android 提供了一些新的 API 来 使用 SQPte 数据库,Android 开发中,程序员需求学 使用这些 API 。

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

  Android 开发中 使用 SQPte 数据库

  Activites 可以通过 Content Provider 或者 Service 拜访一个数据库 。下面会 详尽 讲解假如 缔造数据库,增加数据和 查问数据库 。

   缔造数据库

  Android 不自动提供数据库 。在 Android 利用程序中 使用 SQPte,必须自己 缔造数据库, 而后 缔造表、索引,填充数据 。Android 提供了 SQPteOpenHelper 协助你 缔造一个数据库,你 惟独继承 SQPteOpenHelper 类,就 可以轻松的 缔造数据库 。SQPteOpenHelper 类依据开发 利用程序的需求,封装了 缔造和更新数据库 使用的逻辑 。SQPteOpenHelper 的子类,至少需求实现三个 步骤:

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

  onCreate() 步骤,它需求一个 SQPteDatabase 对象作为参数,依据需求对这个对象填充表和初始化数据 。

  onUpgrage() 步骤,它需求三个参数,一个 SQPteDatabase 对象,一个旧的版本号和一个新的版本号,这样你就 可以清晰如何把一个数据库从旧的模型转变到新的模型 。

  下面示例代码 展示了如何继承 SQPteOpenHelper 缔造数据库:

  pubPc class DatabaseHelper extends SQPteOpenHelper {

  DatabaseHelper(Context context, String name, CursorFactory cursorFactory, int version)

  {

  super(context, name, cursorFactory, version);

  }

  @Override

  pubPc void onCreate(SQPteDatabase db) {

  // TODO 缔造数据库后,对数据库的操作

  }

  @Override

  pubPc void onUpgrade(SQPteDatabase db, int PdVersion, int newVersion) {

  // TODO 更改数据库版本的操作

  }

  @Override

  pubPc void onOpen(SQPteDatabase db) {

  super.onOpen(db);

  // TODO 每次 顺利 打开数据库后首先被执行

  }

  }

  接下来 探讨具体如何 缔造表、插入数据、删除表等等 。调用 getReadableDatabase() 或 getWriteableDatabase() 步骤,你 可以得到 SQPteDatabase 实例,具体调用那个 步骤,取决于你是不是需求转变数据库的内容:

  db=(new DatabaseHelper(getContext())).getWritableDatabase();

  return (db == nPl) ? false : true;

  上面这段代码会返回一个 SQPteDatabase 类的实例, 使用这个对象,你就 可以 查问或者 批改数据库 。

  当你 实现了对数据库的操作(例如你的 Activity 已经关闭),需求调用 SQPteDatabase 的 Close() 步骤来 开释掉数据库衔接 。

   缔造表和索引

  为了 缔造表和索引,需求调用 SQPteDatabase 的 execSQL() 步骤来执行 DDL 语句 。假如没有 异样,这个 步骤没有返回值 。

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

  db.execSQL("CREATE TABLE mytable (_id INTEGER PRIMARY KEY

  AUTOINCREMENT, title TEXT, value REAL);");

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

  通常状况下,第一次 缔造数据库时 缔造了表和索引 。假如你不需求转变表的 schema,不需求删除表和索引 . 删除表和索引,需求 使用 execSQL() 步骤调用 DROP INDEX 和 DROP TABLE 语句 。

  给表增加数据

  上面的代码,已经 缔造了数据库和表,现在需求给表增加数据 。有两种 步骤 可以给表增加数据 。

  像上面 缔造表一样,你 可以 使用 execSQL() 步骤执行 INSERT, UPDATE, DELETE 等语句来更新表的数据 。execSQL() 步骤 实用于全部不返回 后果的 SQL 语句 。例如:

  db.execSQL("INSERT INTO widgets (name, inventory)"+

  "VALUES ('Sprocket', 5)");

  另一种 步骤是 使用 SQPteDatabase 对象的 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", getNPlCPumnHack(), 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 条件的字符串 。