一、 SQLite 简介

 

在Android 平台上,集成了一个嵌入式关系型数据库—SQLite ,SQLite3 支持 NULL 、INTEGER 、REAL (浮点数字)、TEXT( 字符串文本) 和BLOB( 二进制对象) 数据类型,虽然它支持的类型虽然只有五种,但实际上sqlite3 也接受varchar(n) 、char(n) 、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。 SQLite 最大的特点是你可以保存任何类型的数据到任何字段中,无论这列声明的数据类型是什么。例如:可以在Integer 字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。 但有一种情况例外:定义为INTEGER PRIMARY KEY 的字段只能存储64 位整数, 当向这种字段中保存除整数以外的数据时,将会产生错误。另外, SQLite 在解析CREATE TABLE 语句时,会忽略 CREATE TABLE

 

二、SQLite 的CURD

      

Android 提供了一个名为SQLiteDatabase 的类,该类封装了一些操作数据库的API ,使用该类可以完成对数据进行添加(Create) 、查询(Retrieve) 、更新(Update) 和删除(Delete) 操作(这些操作简称为CRUD )。对SQLiteDatabase 的学习,我们应该重点掌握execSQL() 和rawQuery() 方法。 execSQL() 方法可以执行insert 、delete 、update 和CREATE TABLE 之类有更改行为的SQL 语句; rawQuery() 方法可以执行select 语句。SQLiteDatabase 还专门提供了对应于添加、删除、更新、查询的操作方法: insert() 、delete() 、update() 和query() 。这些方法实际上是给那些不太了解SQL 语法的菜鸟使用的,对于熟悉SQL 语法的程序员而言,直接使用execSQL() 和rawQuery() 方法执行SQL

 

三、SQLite

      

使用SQLiteDatabase 的beginTransaction() 方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果为成功则提交事务,否则回滚事务。当应用需要提交事务,必须在程序执行到endTransaction() 方法之前使用setTransactionSuccessful() 方法设置事务的标志为成功,如果不调用setTransactionSuccessful()

 

三、SQLite

      

如果应用使用到了SQLite 数据库,在用户初次使用软件时,需要创建应用使用到的数据库表结构及添加一些初始化记录,另外在软件升级的时候,也需要对数据表结构进行更新。在Android 系统,为我们提供了一个名为SQLiteOpenHelper 的类,该类用于对数据库版本进行管理,该类是一个抽象类,必须继承它才能使用。为了实现对数据库版本进行管理,SQLiteOpenHelper 类有两种重要的方法,分别是onCreate(SQLiteDatabase db) 和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

 

当调用SQLiteOpenHelper 的getWritableDatabase() 或者getReadableDatabase() 方法获取用于操作数据库的SQLiteDatabase 实例的时候,如果数据库不存在,Android 系统会自动生成一个数据库,接着调用onCreate() 方法,onCreate() 方法在初次生成数据库时才会被调用,在onCreate() 方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。onUpgrade() 方法在数据库的版本发生变化时会被调用,数据库的版本是由程序员控制的,假设数据库现在的版本是1 ,由于业务的需要,修改了数据库表的结构,这时候就需要升级软件,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2( 或其他数值) ,并且在onUpgrade() 方法里面实现表结构的更新。当软件的版本升级次数比较多,这时在onUpgrade()

 

getWritableDatabase() 和getReadableDatabase() 方法都可以获取一个用于操作数据库的SQLiteDatabase 实例。但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用的是getWritableDatabase() 方法就会出错。getReadableDatabase()

 

四、SQLite

我们编写一个对表(Contacts) 进行的操作来演示SQLite

 

       1. 创建Android

Project name: AndroidSQLite 
       BuildTarget:Android2.1 
       Application name: SQLite嵌入式数据库 
       Package name: com.changcheng.sqlite 
       Create Activity: AndroidSQLite 
       Min SDK Version:7

 

       2. Contact 实体

package com.changcheng.sqlite.entity;

 

publicclass Contact {
          private Integer _id ;
          private String name ;
          private String phone ;
         
          public Contact() {
                    super ();
         }
 
          public Contact(String name, String phone) {
                    this . name = name;
                    this . phone = phone;
         }
 
          public Integer get_id() {
                    return _id ;
         }
 
          publicvoid set_id(Integer id) {
                    _id = id;
         }
 
          public String getName() {
                    return name ;
         }
 
          publicvoid setName(String name) {
                    this . name = name;
         }
 
          public String getPhone() {
                    return phone ;
         }
 
          publicvoid setPhone(String phone) {
                    this . phone = phone;
         }
 
          @Override
          public String toString() {
                    return "Contants [id=" + _id + ", name=" + name + ", phone=" + phone
                                     + "]" ;
         }


 

       3. 编写MyOpenHelper

       MyOpenHelper 继承自SQLiteOpenHelper 类。我们需要创建数据表,必须重写onCreate (更新时重写onUpgrade

package com.changcheng.sqlite;
 
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
 
publicclass MyOpenHelper extends SQLiteOpenHelper {
 
          privatestaticfinal String name = "contants" ; //
          privatestaticfinalintversion = 1; //
 
          public MyOpenHelper(Context context) {
                    /**
                     * CursorFactory 指定在执行查询时获得一个游标实例的工厂类。 设置为null
                     */
                    super (context, name , null , version );
         }
 
          @Override
          publicvoid onCreate(SQLiteDatabase db) {
                    // 创建contacts 表,SQL
                   db.execSQL( "CREATE TABLE IF NOT EXISTS contacts("
                                     + "_id integer primary key autoincrement,"
                                     + "name varchar(20)," + "phone varchar(50))" );
         }
 
          @Override
          publicvoid onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                    //
                   db.execSQL( "DROP TABLE IF EXISTS contacts" );
                    this .onCreate(db);
         }
}

 

4. 编写ContactsService

       ContactsService

package com.changcheng.sqlite.service;
 
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.database.Cursor;
import com.changcheng.sqlite.MyOpenHelper;
import com.changcheng.sqlite.entity.Contact;
 
publicclass ContactsService {
 
          private MyOpenHelper openHelper ;
 
          public ContactsService(Context context) {
                    this . openHelper = new MyOpenHelper(context);
         }
 
          /**
           *
           *
           * @param contact
           */
          publicvoid save(Contact contact) {
                   String sql = "INSERT INTO contacts (name, phone) VALUES (?, ?)" ;
                   Object[] bindArgs = { contact.getName(), contact.getPhone() };
                    this . openHelper .getWritableDatabase().execSQL(sql, bindArgs);
         }
 
          /**
           *
           *
           * @param id
           * @return
           */
          public Contact find(Integer id) {
                   String sql = "SELECT _id,name, phone FROM contacts WHERE _id=?" ;
                   String[] selectionArgs = { id + "" };
                   Cursor cursor = this . openHelper .getReadableDatabase().rawQuery(sql,
                                     selectionArgs);
                    if (cursor.moveToFirst())
                             returnnew Contact(cursor.getInt(0), cursor.getString(1), cursor
                                               .getString(2));
                    returnnull ;
         }
 
          /**
           *
           *
           * @param contact
           */
          publicvoid update(Contact contact) {
                   String sql = "UPDATE contacts SET name=?, phone=? WHERE _id=?" ;
                   Object[] bindArgs = { contact.getName(), contact.getPhone(),
                                     contact.get_id() };
                    this . openHelper .getWritableDatabase().execSQL(sql, bindArgs);
         }
 
          /**
           *
           *
           * @param id
           */
          publicvoid delete(Integer id) {
                   String sql = "DELETE FROM contacts WHERE _id=?" ;
                   Object[] bindArgs = { id };
                    this . openHelper .getReadableDatabase().execSQL(sql, bindArgs);
         }
 
          /**
           *
           *
           * @return
           */
          publiclong getCount() {
                   String sql = "SELECT count(*) FROM contacts" ;
                   Cursor cursor = this . openHelper .getReadableDatabase().rawQuery(sql,
                                      null );
                   cursor.moveToFirst();
                    return cursor.getLong(0);
         }
 
          /**
           *
           *
           * @param startIndex
           * @param maxCount
           * @return
           */
          public List<Contact> getScrollData ( long startIndex, long maxCount) {
                   String sql = "SELECT _id,name,phone FROM contacts LIMIT ?,?" ;
                   String[] selectionArgs = { String.valueOf (startIndex),
                                     String.valueOf (maxCount) };
                   Cursor cursor = this . openHelper .getReadableDatabase().rawQuery(sql,
                                     selectionArgs);
                   List<Contact> contacts = new ArrayList<Contact>();
                    while (cursor.moveToNext()) {
                            Contact contact = new Contact(cursor.getInt(0),
                                               cursor.getString(1), cursor.getString(2));
                            contacts.add(contact);
                   }
                    return contacts;
         }
 
          /**
           * 获取分页数据,提供给SimpleCursorAdapter
           *
           * @param startIndex
           * @param maxCount
           * @return
           */
          public Cursor getScrollDataCursor( long startIndex, long maxCount) {
                   String sql = "SELECT _id,name,phone FROM contacts LIMIT ?,?" ;
                   String[] selectionArgs = { String.valueOf (startIndex),
                                     String.valueOf (maxCount) };
                   Cursor cursor = this . openHelper .getReadableDatabase().rawQuery(sql,
                                     selectionArgs);
                    return cursor;
         }
}