Android操作嵌入式关系型SQLite数据库

来源:互联网 发布:无锡网络作协 编辑:程序博客网 时间:2024/05/13 00:36

转自http://blog.csdn.net/furongkang/article/details/6818243

SQLite特点

1.Android平台中嵌入了一个关系型数据库SQLite,和其他数据库不同的是SQLite存储数据时不区分类型

      例如一个字段声明为Integer类型,我们也可以将一个字符串存入,一个字段声明为布尔型,我们也可以存入浮点数。

      除非是主键被定义为Integer,这时只能存储64位整数


2.创建数据库的表时可以不指定数据类型,例如:

      CREATE TABLEperson(id INTEGER PRIMARY KEY, name)


3.SQLite支持大部分标准SQL语句,增删改查语句都是通用的,分页查询语句和MySQL相同

      SELECT * FROMperson LIMIT 20 OFFSET 10

      SELECT * FROMperson LIMIT 20,10

创建数据库

 1.定义类继承SQLiteOpenHelper

 2.声明构造函数,4个参数

 3.重写onCreate()方法

 4. 重写upGrade()方法

示例:

[java] view plaincopy
  1. package cn.itcast.sqlite;  
  2.   
  3. import android.content.Context;  
  4. import android.database.sqlite.SQLiteDatabase;  
  5. import android.database.sqlite.SQLiteOpenHelper;  
  6. import android.database.sqlite.SQLiteDatabase.CursorFactory;  
  7.   
  8. public class DBOpenHelper extends SQLiteOpenHelper {  
  9.   
  10.     /** 
  11.      * 创建OpenHelper 
  12.      * @param context 上下文 
  13.      * @param name 数据库名 
  14.      * @param factory 游标工厂 
  15.      * @param version 数据库版本, 不要设置为0, 如果为0则会每次都创建数据库 
  16.      */  
  17.     public DBOpenHelper(Context context, String name, CursorFactory factory, int version) {  
  18.         super(context, name, factory, version);  
  19.     }  
  20.   
  21.     /** 
  22.      * 当数据库第一次创建的时候被调用 
  23.      */  
  24.     public void onCreate(SQLiteDatabase db) {  
  25.         db.execSQL("CREATE TABLE person(id INTEGER PRIMARY KEY AUTOINCREMENT, name)");  
  26.     }  
  27.   
  28.     /** 
  29.      * 当数据库版本发生改变的时候被调用 
  30.      */  
  31.     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  
  32.         db.execSQL("ALTER TABLE person ADD balance");  
  33.     }  
  34. }  
[html] view plaincopy
  1. public void testCreateDB() {  
  2.     DBOpenHelper helper = new DBOpenHelper(getContext(), "itcast.db", null, 2);  
  3.     helper.getWritableDatabase(); // 创建数据库  
  4. }  

CRUD操作

1.和JDBC访问数据库不同,操作SQLite数据库无需加载驱动,不用获取连接,直接可以使用

     获取SQLiteDatabase对象之后通过该对象直接可以执行SQL语句

     SQLiteDatabase.execSQL()

     SQLiteDatabase.rawQuery()

2.getReadableDatabase()和getWritableDatabase()的区别

     查看源代码后我们发现getReadableDatabase()在通常情况下返回的就是getWritableDatabase()拿到的数据库

     只有在抛出异常的时候才会以只读方式打开

3.数据库对象缓存

     getWritableDatabase()方法最后会使用一个成员变量记住这个数据库对象,下次打开时判断是否重用

4.SQLiteDatabase封装了insert()、delete()、update()、query()四个方法也可以对数据库进行操作

     这些方法封装了部分SQL语句,通过参数进行拼接


执行crud操作有两种方式,第一种方式自己写sql语句执行操作,第二种方式是使用SQLiteDatabase类调用响应的方法执行操作

execSQL()方法可以执行insert、delete、update和CREATETABLE之类有更改行为的SQL语句; rawQuery()方法用于执行select语句。

第一种方式示例:

[java] view plaincopy
  1. package cn.itcast.sqlite.service;  
  2. import java.util.ArrayList;  
  3. import java.util.List;  
  4. import android.content.Context;  
  5. import android.database.Cursor;  
  6. import android.database.sqlite.SQLiteDatabase;  
  7.   
  8. import cn.itcast.sqlite.DBOpenHelper;  
  9. import cn.itcast.sqlite.domain.Person;  
  10. public class SQLPersonService {  
  11.   
  12.     private DBOpenHelper helper;  
  13.   
  14.     public SQLPersonService(Context context) {  
  15.         helper = new DBOpenHelper(context, "itcast.db"null2);//初始化数据库  
  16.     }  
  17.   
  18.     /** 
  19.      * 插入一个Person 
  20.      * @param p 要插入的Person 
  21.      */  
  22.     public void insert(Person p) {  
  23.         SQLiteDatabase db = helper.getWritableDatabase();  //获取到数据库  
  24.         db.execSQL("INSERT INTO person(name,phone,balance) VALUES(?,?)"new Object[] { p.getName(), p.getPhone() });  
  25.         db.close();  
  26.     }  
  27.   
  28.     /** 
  29.      * 根据ID删除 
  30.      * @param id 要删除的PERSON的ID 
  31.      */  
  32.     public void delete(Integer id) {  
  33.         SQLiteDatabase db = helper.getWritableDatabase();  
  34.         db.execSQL("DELETE FROM person WHERE id=?"new Object[] { id });  
  35.         db.close();  
  36.     }  
  37.   
  38.     /** 
  39.      * 更新Person 
  40.      * @param p 要更新的Person 
  41.      */  
  42.     public void update(Person p) {  
  43.         SQLiteDatabase db = helper.getWritableDatabase();  
  44.         db.execSQL("UPDATE person SET name=?,phone=?,balance=? WHERE id=?"new Object[] { p.getName(), p.getPhone(), p.getBalance(), p.getId() });  
  45.         db.close();  
  46.     }  
  47.   
  48.     /** 
  49.      * 根据ID查找 
  50.      * @param id 要查的ID 
  51.      * @return 对应的对象, 如果未找到返回null 
  52.      */  
  53.     public Person find(Integer id) {  
  54.         SQLiteDatabase db = helper.getReadableDatabase();  
  55.         Cursor cursor = db.rawQuery("SELECT name,phone,balance FROM person WHERE id=?"new String[] { id.toString() });  
  56.         Person p = null;  
  57.         if (cursor.moveToNext()) {  
  58.             String name = cursor.getString(cursor.getColumnIndex("name"));  
  59.             String phone = cursor.getString(1);  
  60.             Integer balance = cursor.getInt(2);  
  61.             p = new Person(id, name, phone, balance);  
  62.         }  
  63.         cursor.close();  
  64.         db.close();  
  65.         return p;  
  66.     }  
  67.   
  68.     /** 
  69.      * 查询所有Person对象 
  70.      * @return Person对象集合, 如未找到, 返回一个size()为0的List 
  71.      */  
  72.     public List<Person> findAll() {  
  73.         SQLiteDatabase db = helper.getReadableDatabase();  
  74.         Cursor cursor = db.rawQuery("SELECT id,name,phone,balance FROM person"null);  
  75.         List<Person> persons = new ArrayList<Person>();  
  76.         while (cursor.moveToNext()) {  
  77.             Integer id = cursor.getInt(0);  
  78.             String name = cursor.getString(1);  
  79.             String phone = cursor.getString(2);  
  80.             Integer balance = cursor.getInt(3);  
  81.             persons.add(new Person(id, name, phone, balance));  
  82.         }  
  83.         cursor.close();  
  84.         db.close();  
  85.         return persons;  
  86.     }  
  87.   
  88.     /** 
  89.      * 查询某一页数据 
  90.      * @param page 页码 
  91.      * @param size 每页记录数 
  92.      * @return 
  93.      */  
  94.     public List<Person> findPage(int page, int size) {  
  95.         SQLiteDatabase db = helper.getReadableDatabase();  
  96.         Cursor cursor = db.rawQuery("SELECT id,name,phone,balance FROM person LIMIT ?,?" //  
  97.                 , new String[] { String.valueOf((page - 1) * size), String.valueOf(size) });  
  98.         List<Person> persons = new ArrayList<Person>();  
  99.         while (cursor.moveToNext()) {  
  100.             Integer id = cursor.getInt(0);  
  101.             String name = cursor.getString(1);  
  102.             String phone = cursor.getString(2);  
  103.             Integer balance = cursor.getInt(3);  
  104.             persons.add(new Person(id, name, phone, balance));  
  105.         }  
  106.         cursor.close();  
  107.         db.close();  
  108.         return persons;  
  109.     }  
  110.   
  111.     /** 
  112.      * 获取记录数 
  113.      * @return 记录数 
  114.      */  
  115.     public int getCount() {  
  116.         SQLiteDatabase db = helper.getReadableDatabase();  
  117.         Cursor cursor = db.rawQuery("SELECT COUNT(*) FROM person"null);  
  118.         cursor.moveToNext();  
  119.         return cursor.getInt(0);  
  120.     }  
  121. }  

第二种方式示例:
[java] view plaincopy
  1. /** 
  2.  * 插入一个Person 
  3.  * @param p 要插入的Person 
  4.  */  
  5. public void insert(Person p) {  
  6.     SQLiteDatabase db = helper.getWritableDatabase();  
  7.   
  8.     ContentValues values = new ContentValues();  
  9.     values.put("name", p.getName());  
  10.     values.put("phone", p.getPhone());  
  11.     values.put("balance", p.getBalance());  
  12.   
  13.     // 第一个参数是表名, 第二个参数是如果要插入一条空记录时指定的某一列的名字, 第三个参数是数据  
  14.     db.insert("person"null, values);  
  15.   
  16.     db.close();  
  17. }  
  18.   
  19. /** 
  20.  * 根据ID删除 
  21.  * @param id 要删除的PERSON的ID 
  22.  */  
  23. public void delete(Integer id) {  
  24.     SQLiteDatabase db = helper.getWritableDatabase();  
  25.     db.delete("person""id=?"new String[] { id.toString() });  
  26.     db.close();  
  27. }  
  28.   
  29. /** 
  30.  * 更新Person 
  31.  * @param p 要更新的Person 
  32.  */  
  33. public void update(Person p) {  
  34.     SQLiteDatabase db = helper.getWritableDatabase();  
  35.   
  36.     ContentValues values = new ContentValues();  
  37.     values.put("id", p.getId());  
  38.     values.put("name", p.getName());  
  39.     values.put("phone", p.getPhone());  
  40.     values.put("balance", p.getBalance());  
  41.   
  42.     db.update("person", values, "id=?"new String[] { p.getId().toString() });  
  43.   
  44.     db.close();  
  45. }  
  46.   
  47. /** 
  48.  * 根据ID查找 
  49.  * @param id 要查的ID 
  50.  * @return 对应的对象, 如果未找到返回null 
  51.  */  
  52. public Person find(Integer id) {  
  53.     SQLiteDatabase db = helper.getReadableDatabase();  
  54.   
  55.     Cursor cursor = db.query("person"new String[] { "name""phone""balance" }, "id=?"new String[] { id.toString() }, nullnullnull);  
  56.   
  57.     Person p = null;  
  58.     if (cursor.moveToNext()) {  
  59.         String name = cursor.getString(cursor.getColumnIndex("name"));  
  60.         String phone = cursor.getString(1);  
  61.         Integer balance = cursor.getInt(2);  
  62.         p = new Person(id, name, phone, balance);  
  63.     }  
  64.     cursor.close();  
  65.     db.close();  
  66.     return p;  
  67. }  
  68.   
  69. /** 
  70.  * 查询所有Person对象 
  71.  * @return Person对象集合, 如未找到, 返回一个size()为0的List 
  72.  */  
  73. public List<Person> findAll() {  
  74.     SQLiteDatabase db = helper.getReadableDatabase();  
  75.   
  76.     Cursor cursor = db.query("person"new String[] { "id""name""phone""balance" }, nullnullnullnull"id desc");  
  77.   
  78.     List<Person> persons = new ArrayList<Person>();  
  79.     while (cursor.moveToNext()) {  
  80.         Integer id = cursor.getInt(0);  
  81.         String name = cursor.getString(1);  
  82.         String phone = cursor.getString(2);  
  83.         Integer balance = cursor.getInt(3);  
  84.         persons.add(new Person(id, name, phone, balance));  
  85.     }  
  86.     cursor.close();  
  87.     db.close();  
  88.     return persons;  
  89. }  
  90.   
  91. /** 
  92.  * 查询某一页数据 
  93.  * @param page 页码 
  94.  * @param size 每页记录数 
  95.  * @return 
  96.  */  
  97. public List<Person> findPage(int page, int size) {  
  98.     SQLiteDatabase db = helper.getReadableDatabase();  
  99.   
  100.     Cursor cursor = db.query( //  
  101.             "person"new String[] { "id""name""phone""balance" }, nullnullnullnullnull, (page - 1) * size + "," + size);  
  102.   
  103.     List<Person> persons = new ArrayList<Person>();  
  104.     while (cursor.moveToNext()) {  
  105.         Integer id = cursor.getInt(0);  
  106.         String name = cursor.getString(1);  
  107.         String phone = cursor.getString(2);  
  108.         Integer balance = cursor.getInt(3);  
  109.         persons.add(new Person(id, name, phone, balance));  
  110.     }  
  111.     cursor.close();  
  112.     db.close();  
  113.     return persons;  
  114. }  
  115.   
  116. /** 
  117.  * 获取记录数 
  118.  * @return 记录数 
  119.  */  
  120. public int getCount() {  
  121.     SQLiteDatabase db = helper.getReadableDatabase();  
  122.   
  123.     Cursor cursor = db.query( //  
  124.             "person"new String[] { "COUNT(*)" }, nullnullnullnullnull);  
  125.   
  126.     cursor.moveToNext();  
  127.     return cursor.getInt(0);  
  128. }  

事务管理

1.使用在SQLite数据库时可以使用SQLiteDatabase类中定义的相关方法控制事务

      beginTransaction() 开启事务

      setTransactionSuccessful() 设置事务成功标记

      endTransaction() 结束事务

2.endTransaction()需要放在finally中执行,否则事务只有到超时的时候才自动结束,会降低数据库并发效率

示例:

[java] view plaincopy
  1. public void remit(int from, int to, int amount) {  
  2.     SQLiteDatabase db = helper.getWritableDatabase();  
  3.   
  4.     // 开启事务  
  5.     try {  
  6.         db.beginTransaction();  
  7.         db.execSQL("UPDATE person SET balance=balance-? WHERE id=?"new Object[] { amount, from });  
  8.         System.out.println(1 / 0);  
  9.         db.execSQL("UPDATE person SET balance=balance+? WHERE id=?"new Object[] { amount, to });  
  10.         // 设置事务标记  
  11.         db.setTransactionSuccessful();  
  12.     } finally {  
  13.         // 结束事务  
  14.         db.endTransaction();  
  15.     }  
  16.   
  17.     db.close();  
  18. }