一.前言

零零散散钻研了2天的SQLite的,终于有个基本的认识,说来没脸,正式工作20个月了,还真没用过的SQLite存储数据,因为我负责的公司项目都不需要联网,没有什么复杂的数据需存储,一般用SharedPreferences处理就行了!

二.SQLite的介绍

SQLite是一款轻型的数据库,它的设计目标是嵌入式的,占用资源非常低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows / Linux / Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl,PHP,Java,C ++,.Net等,还有ODBC接口,同样比起Mysql,PostgreSQL这两款开源世界着名的数据库管理系统来讲,它的处理速度比他们都快。

特点:

  • 轻量级:它是进程内的数据库引擎,因此不存在数据库的客户端和服务器
  • 单一文件:数据库中所有的信息(比如表,视图等)都包含在一个文件内这个文件可以自由复制到其它目录或其它机器上
  • 不需要安装
  • 跨平台/可移植
  • 开源

三.SQLiteDatabase的介绍

SQLite数据类型

一般数据采用的固定的数据类型,而SQLite采用的是动态数据类型,会根据存入值自动判断。
SQLite具有以下五种常用的数据类型:

类型 释义
NULL 这个值为空值
VARCHAR(n) 长度
CHAR(n) 长度固定为n的字串,n不能超过254.
INTEGER 值被标识为整数,依据值的大小可以依次被字段,n不能超过存储为1,2,3,4,5,6,7,8。
REAL 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号。
TEXT 值为文本字符串,使用数据库编码存储(TUTF-8,UTF-16BE或UTF-16-LE)。
BLOB 值是BLOB数据块,以输入的数据格式进行存储。如何输入就如何存储,不改变格式。
DATA 包含了年份,月份,日期。
TIME 包含了小时,分钟,秒。

常用方法:

方法 释义
openOrCreateDatabase(String path,SQLiteDatabase.CursorFactory factory) 打开或创建数据库
insert(String table,String nullColumnHack,ContentValues values) 插入一条记录
delete(String table,String whereClause,String[] whereArgs) 删除一条记录
query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy) 查询一条记录
update(String table,ContentValues values,String whereClause,String[] whereArgs) 修改记录
execSQL(String sql) 执行一条SQL语句
close() 关闭数据库

四.一步一步实现

创建一个继承在SQLiteOpenHelper的类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
String sql = "create table if not exists " + TABLE_NAME + " (Version integer , Id integer primary key, CustomName text, OrderPrice integer, Country text)"

@Override
public void onCreate(SQLiteDatabase sqLiteDatabase){
sqLiteDatabase.execSQL(sql);
}


@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase,int oldVersion, int newVersion){
String sql = "DROP TABLE IF EXISTS " + TABLE_NAME;
sqLiteDatabase.execSQL(sql);
onCreate(sqLiteDatabase);
}

创建一个OrderDao用于处理所有的数据操作,在OrderDao中实例化OrderDBHelper

1
2
3
4
5
6
7
8
9
public class OrderDao{

public OrderDao(Context context){

this.context = context;
ordersDBHelper = new OrderDBHelper(context,null, null, 0);
}

}

增/删/改/查
对于“增删改”这种对表内容变换的操作,我们需要先调用getWritableDatabase(),在执行的时候可以调用通用的execSQL(String sql)方法或对应的操作API:insert(),delete(),更新()。

而对“查”,需要调用getReadableDatabase(),这时就不能使用execSQL方法了,得使用查询()或rawQuery()方法

  • 首先填充一些数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    /**
    * 初始化数据
    */
    db = ordersDBHelper.getWritableDatabase();
    db.beginTransaction();
    db.execSQL("insert into " + OrderDBHelper.TABLE_NAME +" ( Id, CustomName, OrderPrice, Country) values ( 1, 'Arc', 100, 'China')");
    db.execSQL("insert into "+OrderDBHelper.TABLE_NAME +" ( Id, CustomName, OrderPrice, Country) values ( 2, 'Bor', 200, 'USA')");
    db.execSQL("insert into "+ OrderDBHelper.TABLE_NAME +" ( Id, CustomName, OrderPrice, Country) values ( 3, 'Cut', 500, 'Japan')");
    db.execSQL("insert into "+ OrderDBHelper.TABLE_NAME + " ( Id, CustomName, OrderPrice, Country) values ( 4, 'Bor', 300, 'USA')");
    db.execSQL("insert into " + OrderDBHelper.TABLE_NAME + " ( Id, CustomName, OrderPrice, Country) values ( 5, 'Arc', 600, 'China')");
    db.execSQL("insert into " + OrderDBHelper.TABLE_NAME + " ( Id, CustomName, OrderPrice, Country) values ( 6, 'Doom', 200, 'China')");
    db.setTransactionSuccessful();
  • 增加一条数据:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    /**
    * 新增一条数据
    */
    db = ordersDBHelper.getWritableDatabase();
    db.beginTransaction();

    // insert into Orders(Id, CustomName, OrderPrice, Country) values (7, "Jne", 700, "China");
    ContentValues contentValues = new ContentValues();
    contentValues.put("Id", 7);
    contentValues.put("CustomName", "Jne");
    contentValues.put("OrderPrice", 700);
    contentValues.put("Country", "China");
    db.insertOrThrow(OrderDBHelper.TABLE_NAME, null, contentValues);
    db.setTransactionSuccessful();
    return true;

    1
    2
    3
    4
    5
    6
        db = ordersDBHelper.getWritableDatabase();
    db.beginTransaction();

    // delete from Orders where Id = 7
    db.delete(OrderDBHelper.TABLE_NAME, "Id = ?", new String[]{String.valueOf(7)});
    db.setTransactionSuccessful();

    源码:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
        public int delete(String table, //表名          
    String whereClause,//删除条目判断
    String[] whereArgs //删除位置) {
    acquireReference();
    try{
    SQLiteStatement statement = new SQLiteStatement(this, "DELETE FROM " + table + (!TextUtils.isEmpty(whereClause) ? " WHERE " + whereClause : ""), whereArgs);
    try{
    return statement.executeUpdateDelete();
    }finally {
    statement.close(); }
    }
    finally{
    releaseReference();
    }
    }

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    db = ordersDBHelper.getWritableDatabase();
    db.beginTransaction();
    // update Orders set OrderPrice = 800 where Id = 6
    ContentValues cv = new ContentValues();
    cv.put("OrderPrice", 800);
    //需要改的内容
    db.update(OrderDBHelper.TABLE_NAME,
    cv,"Id = ?",new String[]{String.valueOf(6)});
    //需要改的位置
    db.setTransactionSuccessful();

  • 单数据查询:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
            db = ordersDBHelper.getReadableDatabase();
    // select * from Orders where CustomName = 'Bor'
    cursor = db.query(OrderDBHelper.TABLE_NAME,//table:表名称
    ORDER_COLUMNS, //columns:列名称数组
    "CustomName = ?", //selection:条件字句,相当于where
    new String[] {name}, //selectionArgs:条件字句,参数数组
    null, //orderBy:排序列
    null, //having:分组条件
    null);

    //orderBy:排序列
    if (cursor.getCount() > 0) { //将cursor数据放到Order队列中
    List<Order> orderList = new ArrayList<Order>(cursor.getCount());
    while (cursor.moveToNext()) {
    Order order = parseOrder(cursor);
    orderList.add(order);
    }
    return orderList;
    }
  • 总数查询:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    db = ordersDBHelper.getReadableDatabase();
    // select count(Id) from Orders where Country = 'China'
    cursor = db.query(OrderDBHelper.TABLE_NAME,new String[]{
    "COUNT(Id)"}, "Country = ?",
    new String[] {"China"},null, null, null);

    if (cursor.moveToFirst()) {
    count = cursor.getInt(0);
    }
  • 比较查询:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    db = ordersDBHelper.getReadableDatabase();
    // select Id, CustomName, Max(OrderPrice) as OrderPrice, Country from Orders
    cursor = db.query(OrderDBHelper.TABLE_NAME, new String[]{
    "Version","Id","CustomName",
    "Max(OrderPrice) as OrderPrice",
    "Country"},null, null, null, null, null);

    if (cursor.getCount() > 0){
    if (cursor.moveToFirst()) {
    return parseOrder(cursor);
    }
    }