part one :

android SQLite 简单介绍

SQLite 介绍

SQLite 一个非常流行的嵌入式数据库。它支持 SQL 语言,而且仅仅利用非常少的内存就有非常好的性能。此外它还是开源的,不论什么人都能够使用它。很多开源项目((Mozilla, PHP, Python)都使用了 SQLite.

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

图 1. SQLite 内部结构

SQLite 基本上符合 SQL-92 标准,和其它的主要 SQL 数据库没什么差别。

它的长处就是高效,Android 执行时环境包括了完整的 SQLite。

SQLite 和其它数据库最大的不同就是对数据类型的支持。创建一个表时,能够在 CREATE TABLE 语句中指定某列的数据类型。可是你能够把不论什么数据类型放入不论什么列中。当某个值插入数据库时,SQLite 将检查它的类型。

假设该类型与关联的列不匹配,则 SQLite 会尝试将该值转换成该列的类型。

假设不能转换,则该值将作为其本身具有的类型存储。

比方能够把一个字符串(String)放入
INTEGER 列。SQLite 称这为“弱类型”(manifest typing.)。

此外,SQLite 不支持一些标准的 SQL 功能,特别是外键约束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 另一些 ALTER
TABLE 功能。

除了上述功能外,SQLite 是一个完整的 SQL 系统,拥有完整的触发器,交易等等。

 

Android 集成了 SQLite 数据库

Android 在执行时(run-time)集成了 SQLite,所以每一个 Android 应用程序都能够使用 SQLite 数据库。对于熟悉 SQL 的开发者来时,在 Android 开发中使用 SQLite 相当简单。可是。因为 JDBC 会消耗太多的系统资源,所以 JDBC 对于手机这样的内存受限设备来说并不合适。

因此。Android 提供了一些新的 API 来使用 SQLite
数据库。Android 开发中,程序猿须要学使用这些 API。

数据库存储在 data/< 项目目录 >/databases/ 下。

 

Android 开发中使用 SQLite 数据库

Activites 能够通过 Content Provider 或者 Service 訪问一个数据库。以下会具体解说假设创建数据库,加入数据和查询数据库。

创建数据库

Android 不自己主动提供数据库。

在 Android 应用程序中使用 SQLite,必须自己创建数据库,然后创建表、索引,填充数据。

Android 提供了 SQLiteOpenHelper 帮助你创建一个数据库,你仅仅要继承 SQLiteOpenHelper 类,就能够轻松的创建数据库。SQLiteOpenHelper 类依据开发应用程序的须要,封装了创建和更新数据库使用的逻辑。

SQLiteOpenHelper
的子类。至少须要实现三个方法:

  • 构造函数。调用父类 SQLiteOpenHelper 的构造函数。

    这种方法须要四个參数:上下文环境(比如。一个 Activity),数据库名字,一个可选的游标工厂(一般是 Null),一个代表你正在使用的数据库模型版本号的整数。

  • onCreate()方法。它须要一个 SQLiteDatabase 对象作为參数。依据须要对这个对象填充表和初始化数据。
  • onUpgrage() 方法,它须要三个參数,一个 SQLiteDatabase 对象,一个旧的版本号号和一个新的版本号号,这样你就能够清楚怎样把一个数据库从旧的模型转变到新的模型。

以下演示样例代码展示了怎样继承 SQLiteOpenHelper 创建数据库:

 public class DatabaseHelper extends SQLiteOpenHelper {
DatabaseHelper(Context context, String name, CursorFactory cursorFactory, int version)
{
super(context, name, cursorFactory, version);
} @Override
public void onCreate(SQLiteDatabase db) {
// TODO 创建数据库后,对数据库的操作
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO 更改数据库版本号的操作
} @Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
// TODO 每次成功打开数据库后首先被运行
}
}

接下来讨论详细怎样创建表、插入数据、删除表等等。调用 getReadableDatabase() 或 getWriteableDatabase() 方法。你能够得到 SQLiteDatabase 实例。详细调用那个方法。取决于你是否须要改变数据库的内容:

 db=(new DatabaseHelper(getContext())).getWritableDatabase();
return (db == null) ? false : true;

上面这段代码会返回一个 SQLiteDatabase 类的实例,使用这个对象,你就能够查询或者改动数据库。

当你完毕了对数据库的操作(比如你的 Activity 已经关闭),须要调用 SQLiteDatabase 的 Close() 方法来释放掉数据库连接。

创建表和索引

为了创建表和索引,须要调用 SQLiteDatabase 的 execSQL() 方法来运行 DDL 语句。假设没有异常,这种方法没有返回值。

比如,你能够运行例如以下代码:

 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 .使用 rawQuery() 直接调用 SELECT 语句;

使用 query() 方法构建一个查询。

  • Raw Queries

    正如 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() 方法会方便非常多。

  • 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 数据库游标。使用游标。你能够:

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

通过 moveToFirst(), moveToNext(), 和 isAfterLast() 方法遍历全部记录;

通过 getColumnNames() 得到字段名。

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

通过 getString(),getInt() 等方法得到给定字段当前记录的值。

通过 requery() 方法又一次运行查询得到游标;

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

比如,以下代码遍历 mytable 表

 Cursor result=db.rawQuery("SELECT ID, name, inventory FROM mytable");
result.moveToFirst();
while (!result.isAfterLast()) {
int id=result.getInt(0);
String name=result.getString(1);
int inventory=result.getInt(2);
// do something useful with these
result.moveToNext();
}
result.close();
 

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

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

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

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

假设你喜欢使用更友好的工具,你能够把数据库复制到你的开发机上。使用 SQLite-aware client来操作它。这种话,你在一个数据库的拷贝上操作,假设你想要你的改动能反映到设备上。你须要把数据库备份回去。

把数据库从设备上考出来,你能够使用 adb pull 命令(或者在 IDE 上做对应操作)。存储一个改动过的数据库到设备上,使用 adb push 命令。

一个最方便的 SQLite client是 FireFox SQLite Manager 扩展,它能够跨全部平台使用。

图 2. SQLite Manager

 

part two :


Android应用程序都能够使用SQLite数据库

 Android在执行时集成了SQLite , 所以每一个Android应用程序都能够使用SQLite数据库。

  数据库存放的位置:data/<项目目录>/databases/

  第一步:创建数据库

  Android 中提供SQLiteOpenHelper类帮助创建一个数据库,继承该类能够轻松的创建SQLite数据库;

  注意:SQLiteOpenHelper的子类至少要实现三个方法:

  * 带參的构造方法;

  * onCreate();

  * onUpgrag();

  java代码例如以下:

  Java代码

  package com.example.sqlite;

  import android.content.Context;

  import android.database.sqlite.SQLiteDatabase;

  import android.database.sqlite.SQLiteDatabase.CursorFactory;

  import android.database.sqlite.SQLiteOpenHelper;

  /* SQLiteOpenHelper的子类, 用于操作数据库

  *

  * SQLiteOpenHelper 是一个辅助类,用来管理数据库的创建和版本号,提供双方面的功能;

  *

  * 第一:getReadableDatabase() 、 getWriteableDatabase() 能够获得SQLiteDatabase对象,通过该对象能够对数据库进行操作;

  *

  * 第二:提供onCreate() ; onUpgrade() 两个回调函数。同意我们再创建和删除数据库时。进行自己的操作;

  *

  * */

  public class MySQLiteOpenHelper extends SQLiteOpenHelper {

  /* 构造方法,调用父类SQLiteOpenHelper的构造函数 */

  /* 參1:上下文环境;參2:数据库名称(以.db结尾) ; 參3:游标工厂(默觉得null) ; 參4:代表使用数据库模型版本号的证书*/

  public MySQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) {

  super(context, name, factory, version);

  }

  /* 依据须要对SQLiteDatabase 的对象填充表和数据初始化 */

  /* 该方法时在第一次创建的时候运行,实际上时第一次得到SQLiteDatabase对象的时侯才会调用这种方法 */

  public void onCreate(SQLiteDatabase db) {

  // TODO 创建数据库后,对数据库的操作

  }

  /* 将数据库从旧的模型转换为新的模型 *//* 參1:对象 ; 參2:旧版本 ; 參3:新版本 */

  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

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

  }

  /* 打开数据库运行的函数 */

  public void onOpen(SQLiteDatabase db) {

  // TODO 每次成功打开数据库后首先被运行

  super.onOpen(db);

  }

  }

  package com.example.sqlite;

  import android.content.Context;

  import android.database.sqlite.SQLiteDatabase;

  import android.database.sqlite.SQLiteDatabase.CursorFactory;

  import android.database.sqlite.SQLiteOpenHelper;

  /* SQLiteOpenHelper的子类。 用于操作数据库

  *

  * SQLiteOpenHelper 是一个辅助类,用来管理数据库的创建和版本号。提供双方面的功能;

  *

  * 第一:getReadableDatabase() 、 getWriteableDatabase() 能够获得SQLiteDatabase对象,通过该对象能够对数据库进行操作;

  *

  * 第二:提供onCreate() ; onUpgrade() 两个回调函数,同意我们再创建和删除数据库时,进行自己的操作;

  *

  * */

  public class MySQLiteOpenHelper extends SQLiteOpenHelper {

  /* 构造方法,调用父类SQLiteOpenHelper的构造函数 */

  /* 參1:上下文环境;參2:数据库名称(以.db结尾) ; 參3:游标工厂(默觉得null) ; 參4:代表使用数据库模型版本号的证书*/

  public MySQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) {

  super(context, name, factory, version);

  }

  /* 依据须要对SQLiteDatabase 的对象填充表和数据初始化 */

  /* 该方法时在第一次创建的时候运行,实际上时第一次得到SQLiteDatabase对象的时侯才会调用这种方法 */

  public void onCreate(SQLiteDatabase db) {

  // TODO 创建数据库后,对数据库的操作

  }

  /* 将数据库从旧的模型转换为新的模型 *//* 參1:对象 ; 參2:旧版本 ; 參3:新版本 */

  public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

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

  }

  /* 打开数据库运行的函数 */

  public void onOpen(SQLiteDatabase db) {

  // TODO 每次成功打开数据库后首先被运行

  super.onOpen(db);

  }

  }

  案例代码例如以下:

  Java代码

  package com.example.sqlite;

  import android.app.Activity;

  import android.content.ContentValues;

  import android.database.Cursor;

  import android.database.sqlite.SQLiteDatabase;

  import android.os.Bundle;

  import android.view.View;

  import android.view.View.OnClickListener;

  import android.widget.Button;

  import android.widget.Toast;

  public class MainActivity extends Activity {

  /* 设置表相关信息的常量 */

  final String MYTAB = "t_score";

  final String MYNAME ="name";

  final String MYSCORE = "score";

  MySQLiteOpenHelper helper;

  private Button selectData,createDatabase,createTable,insertData,updateData,deleteData;

  /* 获取组建对象 */

  public void init(){

  selectData = (Button) findViewById(R.id.selectData);

  createDatabase = (Button) findViewById(R.id.createDatabase);

  createTable = (Button) findViewById(R.id.createTable);

  insertData = (Button) findViewById(R.id.insertData);

  updateData = (Button) findViewById(R.id.updateData);

  deleteData = (Button) findViewById(R.id.deleteData);

  }

  protected void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  /* 初始化组件对象 */

  init();

  /* 创建数据库 */

  createDatabase.setOnClickListener(new OnClickListener() {

  public void onClick(View v) {

  /* 创建一个MySQLiteOpenHelper。该语句运行是不会创建或打开连接的 */

  helper = new MySQLiteOpenHelper(MainActivity.this, "mydb.db", null, 1);

  /* 调用MySQLiteOpenHelper的getWriteableDatabase()方法。创建或者打开一个连接 */

  SQLiteDatabase sqlitedatabase = helper.getWritableDatabase();

  Toast.makeText(MainActivity.this, "数据库创建成功", 1000).show();

  }

  });

  /* 创建表 */

  createTable.setOnClickListener(new OnClickListener() {

  public void onClick(View v) {

  /* 创建一个MySQLiteOpenHelper。该语句运行是不会创建或打开连接的 */

  helper = new MySQLiteOpenHelper(MainActivity.this, "mydb.db", null, 1);

  /* 获取一个可写的SQLiteDatabase对象,创建或打开连接 */

  SQLiteDatabase sqliteDatabase = helper.getWritableDatabase();

  /* 创建两张表 */

  sqliteDatabase.execSQL("create table student(id INTEGER PRIMARY KEY autoincrement,name text);");

  sqliteDatabase.execSQL("create table "+MYTAB+"("+MYNAME+" text,"+MYSCORE+" integer);");

  /* 小贴士 */

  Toast.makeText(MainActivity.this, "数据表创建成功", 1000).show();

  }

  });

  /* 插入数据 */

  insertData.setOnClickListener(new OnClickListener() {

  public void onClick(View v) {

  /* 连接数据库 *//* 数据库中有表 , 对表进行操作 */

  SQLiteDatabase sqliteDatabase = helper.getWritableDatabase();

  /* 给表加入数据: *//* 方式1: *//* 添加一条数据 */

  sqliteDatabase.execSQL("insert into student(name) values('mike')");

  /* 方式2: *//* 使用SQLiteDatabase 对象的insert()方法 */

  /* 创建ContentValues对象 *//* 每次插入的时一条数据 */

  ContentValues cv = new ContentValues();

  cv.put("name", "mary"); /* key==列 value==值 */

  sqliteDatabase.insert("student", null, cv);

  cv.clear();

  /* 对MYTAB进行数据加入 */

  sqliteDatabase.execSQL("insert into "+MYTAB+" values('ray',95)");

  sqliteDatabase.execSQL("insert into "+MYTAB+" values('tom',85)");

  sqliteDatabase.execSQL("insert into "+MYTAB+" values('jone',90)");

  cv.put(MYNAME, "jack");

  cv.put(MYSCORE, 78);

  sqliteDatabase.insert(MYTAB, null, cv);

  cv.clear();

  Toast.makeText(MainActivity.this, "数据插入成功", 1000).show();

  }

  });

  /* 改动数据 *//* updateData点击事件监听器 */

  updateData.setOnClickListener(new OnClickListener() {

  public void onClick(View v) {

  /* 建立和数据库的连接,获取SQLiteDatabase对象 */

  SQLiteDatabase sqliteDatabase = helper.getWritableDatabase();

  /* 方式1:直接使用语句 */

  //sqliteDatabase.execSQL("update student set name='mary key' where id=1");

  /* 方式2:使用sqliteDatabase.update();方法 */

  ContentValues cv = new ContentValues();

  cv.put("name", "mary key"); /* 确定须要改动相应列的值 */

  /* 參1:表名 ; 參2:ContentValues对象; 參3:where字句,相当于sql中where后面的语句,?

是占位符 */

  /* 參4:占位符的值; */

  sqliteDatabase.update("student", cv, "id=?", new String[]{"1"});

  Toast.makeText(MainActivity.this, "数据改动成功", 1000).show();

  }

  });

  /* 删除数据 ; 设置deleteData点击事件监听器 */

  deleteData.setOnClickListener(new OnClickListener() {

  public void onClick(View v) {

  /* 与数据库建立联系。获得SQLiteDatabase的对象 */

  SQLiteDatabase sqliteDatabase = helper.getWritableDatabase();

  /* 使用sql语句直接进行删除 */

  //sqliteDatabase.execSQL("");

  /* 调用:SQLiteDatabase对象的delete()的方法删除数据 */

  /* 參1:表名; 參2:条件语句; 參3:条件语句中相应占位符的值 */

  sqliteDatabase.delete("student", "id=?", new String[]{"1"});

  Toast.makeText(MainActivity.this, "数据删除成功", 1000).show();

  }

  });

  /* 查看数据 *//* selectData点击事件监听器 */

  selectData.setOnClickListener(new OnClickListener() {

  public void onClick(View v) {

  /* 获取SQLiteDatabase的对象 */

  SQLiteDatabase sqliteDatabase = helper.getReadableDatabase();

  /* 调用SQLiteDatabase的query()方法进行查询。返回一个Cursor对象:由数据库查询返回的结果集对象 */

  /* 參1 String:表名

  * 參2 String[]:须要查询的列;

  * 參3 String :查询条件;

  * 參4 String[]:查询条件的參数;

  * 參5 String: 对查询的结果进行分组;

  * 參6 String: 对分组结果进行限制;

  * 參7 String: 对查询结果进行排序;

  *

  * */

  Cursor cursor = sqliteDatabase.query("student", new String[]{"id","name"}, "id=?", new String[]{"1"}, null, null, null);

  /* 保存结果集中相应字段的数据 */

  String id = null;

  String name = null;

  /* 从结果集中读取数据 */

  while(cursor.moveToNext()){

  id = cursor.getString(cursor.getColumnIndex("id"));

  name = cursor.getString(cursor.getColumnIndex("name"));

  }

  Toast.makeText(MainActivity.this, "查询数据为:id="+id+" \n name="+name, 1000).show();

  }

  });

  }

  }

结束语

假设你想要开发 Android 应用程序,一定须要在 Android 上存储数据,使用 SQLite 数据库是一种很好的选择。本文介绍了怎样在 Android 应用程序中使用 SQLite 数据库 ,主要介绍了在 Android 应用程序中使用 SQLite 创建数据库和表、加入数据、更新和检索数据,还介绍了比較经常使用的 SQLite 管理工具,通过阅读本文。你能够在 Android 中轻松操作 SQLite 数据库。

最新文章

  1. [Modern OpenGL系列(二)]创建OpenGL窗口
  2. 3. K线基础知识三
  3. SQL中获取最近的N个半年度
  4. js:语言精髓笔记7----原型继承
  5. Python科学画图小结
  6. SharePoint中修改密码的WEB Part之终极版:即可以修改AD,又可以修改本机用户密码的Web Part!!
  7. SLC和MLC闪存芯片的区别
  8. BCM wifi分析
  9. Akka(12): 分布式运算:Cluster-Singleton-让运算在集群节点中自动转移
  10. Mabits简单应用 2017.8.3
  11. vue 学习链接地址
  12. 【SpringBoot】服务器端主动推送SSE技术讲解
  13. Apache模块 mod_proxy
  14. malloc()函数(Linux程序员手册)及函数的正确使用【转】
  15. java系统的优化
  16. ubuntu MySQL安装和设置
  17. 【Storm】学习笔记
  18. VBA学习笔记(4)--文件夹和文件遍历一层
  19. Vue学习计划基础笔记(五) - 表单输入绑定、组件基础
  20. Adobe Acrobat Pro 修改背景色

热门文章

  1. MVC自定义错误日志异常处理
  2. ARM嵌入式复习
  3. Android开发日志统一管理
  4. php八大设计模式之职责链模式
  5. JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, jstat(复制)
  6. 运行npm start vue.js项目 出现 npm ERR! missing script: start 错误
  7. CF GYM 100781A(菊花图+直径)
  8. Bash 基础特性
  9. Spring拦截器 /* 和 /** 的区别
  10. 【LeetCode OJ 14】Longest Common Prefix