【Anroid进阶】SQLite数据库使用完全详解

来源:互联网 发布:软件编程就业前景 编辑:程序博客网 时间:2024/06/14 18:08

本文转载于:点击打开链接

在Android开发中,我们一般可以使用文件、sharedpreferences、以及数据库来保存我们程序运行中产生的数据,本篇主要讲解如何使用SQLite数据库,完成数据的增删改查的一般操作

SQLite介绍

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

SQLite 和其他的主要 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 系统,拥有完整的触发器等等。

SQLite数据库的创建

我们如果想在手机上使用数据库保存我们的应用信息,那么我们必须在使用之前,创建好数据库。Android的API给我们提供了SQLiteOpenHelper这个类,完成对数据库的初次创建,以及当软件升级造成的数据库版本更新时需要做的处理。我们必须自定义一个类,继承自SQLiteOpenHelper,并且实现它的三个方法,代码如下
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  * 数据库创建类 
  3.  *  
  4.  * @author ZhaoKaiQiang 
  5.  * @time 2014年6月4日 
  6.  */  
  7. public class MyDbOpenHelper extends SQLiteOpenHelper {  
  8.   
  9.     // 数据库的名称  
  10.     private static final String DATEBASE_NAME = "student.db";  
  11.     // 数据库的版本  
  12.     private static final int DATEBASE_VERSION = 1;  
  13.   
  14.     // 必须定义一个构造函数,并且调用父类的构造函数  
  15.     public MyDbOpenHelper(Context context) {  
  16.         super(context, DATEBASE_NAME, null, DATEBASE_VERSION);  
  17.     }  
  18.   
  19.     // 当数据库被第一次使用的时候,系统会判断是否已经创建数据库。若还未创建数据库,则运行下面的SQL语句完成数据库的创建  
  20.     @Override  
  21.     public void onCreate(SQLiteDatabase db) {  
  22.         db.execSQL("CREATE TABLE student(id integer primary key autoincrement,name vchar(20),age integer,school vchar(50))");  
  23.     }  
  24.   
  25.     // 当数据库的版本发生变化的时候,系统会自动调用这个方法,我们可以在这里完成数据库的更新等操作  
  26.     @Override  
  27.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  28.   
  29.     }  
  30.   
  31. }  

在我们完成了这个继承自SQLiteOpenHelper的类之后,我们一般会再创建一个专门的类,用于数据库的增删改查等操作。在这里,我们以student表为例,讲解如何实现对student表的增删改查的操作

首先看一下我们的student实体类
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. /** 
  2.  * 学生实体类 
  3.  * @author      ZhaoKaiQiang 
  4.  * @time        2014年6月4日 
  5.  */  
  6. public class Student implements Serializable {  
  7.   
  8.     private static final long serialVersionUID = -4885878468381093121L;  
  9.     private int id;  
  10.     private String name;  
  11.     private int age;  
  12.     private String school;  
  13.   
  14.     public int getId() {  
  15.         return id;  
  16.     }  
  17.   
  18.     public void setId(int id) {  
  19.         this.id = id;  
  20.     }  
  21.   
  22.     public String getName() {  
  23.         return name;  
  24.     }  
  25.   
  26.     public void setName(String name) {  
  27.         this.name = name;  
  28.     }  
  29.   
  30.     public int getAge() {  
  31.         return age;  
  32.     }  
  33.   
  34.     public void setAge(int age) {  
  35.         this.age = age;  
  36.     }  
  37.   
  38.     public String getSchool() {  
  39.         return school;  
  40.     }  
  41.   
  42.     public void setSchool(String school) {  
  43.         this.school = school;  
  44.     }  
  45.   
  46.     public Student(int id, String name, int age, String school) {  
  47.         super();  
  48.         this.id = id;  
  49.         this.name = name;  
  50.         this.age = age;  
  51.         this.school = school;  
  52.     }  
  53.   
  54.     public Student() {  
  55.         super();  
  56.     }  
  57.   
  58.     @Override  
  59.     public String toString() {  
  60.         return "--id = " + id + " --name = " + name + "--age = " + age + "--school = " + school;  
  61.     }  
  62.   
  63. }  

首先看我们的添加数据的方法
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. // 添加数据  
  2.     public void add(String name, int age, String school) {  
  3.   
  4.         SQLiteDatabase database = dbOpenHelper.getWritableDatabase();  
  5.         database.execSQL("insert into student(name,age,school) values(?,?,?)"new Object[] { name, age, school });  
  6.   
  7.     }  

在添加方法中,我们使用占位符,将我们需要添加的数据添加到我们的数据库中。
我们可以使用单元测试完成添加方法的测试,下面是单元测试的方法
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. //测试数据添加  
  2.     public void testAdd() throws Exception {  
  3.   
  4.         StudentDbHelper dbHelper = new StudentDbHelper(getContext());  
  5.         dbHelper.add("zhao"19"QUST");  
  6.         dbHelper.add("kai"18"青大");  
  7.         dbHelper.add("qiang"17"清华");  
  8.         dbHelper.add("da"16"青农");  
  9.         dbHelper.add("huai"15"青医");  
  10.         dbHelper.add("dan"14"青岛");  
  11.     }  

在单元测试运行完毕之后,没有错误信息,这说明我们添加数据成功了。
在我们完成添加数据之前,系统会自动在/data/data/<package  name>/database/目录下面创建名为"student.db"的数据库,如下图所示


当有这个文件存在,就说明我们已经完成了数据库的创建以及数据的添加等工作。

那么如何查看数据库里面的信息呢?

我们可以使用SQLite developer这个软件完成SQLite数据库的查看。
首先我们将我们的数据库文件导出到我们的桌面,然后使用这个软件将数据库文件导入进去



导入成功之后,我们就可以看到我们创建的表结构,以及我们插入的数据了




这里是我们成功添加的数据



到这里,我们对数据的添加工作就完成了。

其他删改查的方法类似。

下面是删除方法
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. // 删除数据  
  2.     public void delete(int id) {  
  3.         SQLiteDatabase database = dbOpenHelper.getWritableDatabase();  
  4.         database.execSQL("delete from student where id=?"new Object[] { id });  
  5.     }  

进行单元测试
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. //删除方法测试  
  2.     public void testDelete() throws Exception {  
  3.         StudentDbHelper dbHelper = new StudentDbHelper(getContext());  
  4.         dbHelper.delete(3);  
  5.     }  

结果图


修改方法

[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. // 修改  
  2.     public void update(Student student) {  
  3.         SQLiteDatabase database = dbOpenHelper.getWritableDatabase();  
  4.         database.execSQL("update student set name=?,age=?,school=? where id=?"new Object[] { student.getName(), student.getAge(), student.getSchool(), student.getId() });  
  5.   
  6.     }  

单元测试
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. // 修改方法测试  
  2.     public void testUpdate() throws Exception {  
  3.         StudentDbHelper dbHelper = new StudentDbHelper(getContext());  
  4.         Student student = new Student(1"修改"10"家里蹲");  
  5.         dbHelper.update(student);  
  6.     }  
结果图



查询方法
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. // 查询  
  2.     public Student find(int id) {  
  3.         SQLiteDatabase database = dbOpenHelper.getReadableDatabase();  
  4.         // 获取查询结果的游标  
  5.         Cursor cursor = database.rawQuery("select * from student where id=?"new String[] { id + "" });  
  6.         // 利用游标获取对应的值  
  7.         if (cursor.moveToFirst()) {  
  8.             Student student = new Student();  
  9.             student.setId(cursor.getInt(cursor.getColumnIndex("id")));  
  10.             student.setAge(cursor.getInt(cursor.getColumnIndex("age")));  
  11.             student.setName(cursor.getString(cursor.getColumnIndex("name")));  
  12.             student.setSchool(cursor.getString(cursor.getColumnIndex("school")));  
  13.             return student;  
  14.         }  
  15.         return null;  
  16.     }  

单元测试
[java] view plaincopy在CODE上查看代码片派生到我的代码片
  1. //查找方法测试  
  2.     public void testFind() throws Exception {  
  3.         StudentDbHelper dbHelper = new StudentDbHelper(getContext());  
  4.         Student student = dbHelper.find(1);  
  5.         Log.d(TAG, student.toString());  
  6.     }  

结果


至此,SQLIte数据库的简单的增删改查操作就介绍到这里了,如果有疑问,还请留言交流!
0 0
原创粉丝点击