Android 数据库的使用 -- Sqlite

Sqlite介绍

SQLite 是一款内置到移动设备上的轻量型的数据库,是遵守 ACID(原子性、一致性、隔离性、持久性)的关联式数据库管理系统,多用于嵌入式系统中。
SQLite 数据库是无类型的,可以向一个 integer 的列中添加一个字符串,但它又支持常见的类型比如: NULL,VARCHAR, TEXT, INTEGER, BLOB, CLOB 等。
但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段保存除整数以外的数据时,将会产生错误。
Android 系统内置了 SQLite,并提供了一系列 API 方便对其进行操作

API

SQLiteOpenHelper

SQLiteOpenHelper 是 Android 对于数据库的操作做了一个封装类,在实际使用的时候,需要继承它写一个新的子类。以下为重点方法介绍。

构造函数
传入数据库名称、版本号,在每次修改数据库结构后需要更新版本号!

onCreate
这个方法只会在首次创建数据时触发,一般在这里放入表的创建sql语句

onUpgrade
在数据库版本号发生变化后会执行,在这里要写入旧数据库升级的逻辑

示例:

public class OrderDBHelper extends SQLiteOpenHelper{
    private static final int DB_VERSION = 1;
    private static final String DB_NAME = "myTest.db";
    public static final String TABLE_NAME = "Orders";

    public OrderDBHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {
        // create table Orders(Id integer primary key, CustomName text, OrderPrice integer, Country text);
        String sql = "create table if not exists " + TABLE_NAME + " (Id integer primary key, CustomName text, OrderPrice integer, Country text)";
        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);
    }
}

SQLiteDatabase

SQLiteDatabase 代表了数据库的实例对象,通过SQLiteOpenHelper 的实例对象获取。有getWritableDatabase getReadableDatabase两种获取方式,区别是假如磁盘满了,getWritableDatabase 就会失败,而如果是采用 getReadableDatabase 的方式,会返回一个只读的数据库对象。

数据库的操作一般包括 增、删、改、查以及事务。

原生方式
execSQL 用于原生sql的删除、修改、添加

db.execSQL("insert into person(name, age) values('炸死特', 4)");  
db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"炸死特", 4});   
db.execSQL("delete from t_user where c_age<?", new Object[] { 21 });
db.execSQL("update t_user set c_name=? where c_age=?", new Object[] { "lisi", 25 });

rawQuery 用于原生sql的查询

Cursor cursor = db.rawQuery(“select * from person”, null);  
Cursor cursor = db.rawQuery("select * from person where name like ? and age=?", new String[]{"%炸死特%", "4"});  

API
除了原生的方式之外,还提供了几种方便的调用方式

//删除
db.delete("person", "personid<?", new String[]{"2"});  

//添加
ContentValues values = new ContentValues();
values.put("c_name", "王五" + new Random().nextInt(10));
values.put("c_age", new Random().nextInt(50));
values.put("c_phone", "5556");ContentValues values = new ContentValues();
values.put("c_name", "wangwu");

//修改
int update = database.update(TABLE_NAME, values, "c_age=?", new String[] { "28" });

//查询
Cursor cursor = database.query(TABLE_NAME, 
                new String[] {"uid", "c_name", "c_age", "c_phone" }, 
                "c_age<?", new String[] { "130" }, null, null, "c_age desc");

事务

在 SQLiteDatabase 提供了对事务的支持,处于事务中的操作都是“临时性”的,只有事务提交了 才会将数据保存到数据库。
事务的使用不仅可以保证数据的一致性,也可以提高批处理时的执行效率。

SQLiteDatabase 提供的 beginTransaction()打开事务,endTransaction()结束事务。
注意:结束 事务并不代表事务提交,如果想让数据写入的数据库需要在结束事务前执行 setTransactionSuccessful()方法。这是事务提交的唯一方式。

//数据库的事务操作
SQLiteDatabase database = mOpenHelper.getReadableDatabase();
String sql = "update t_user set c_money=c_money-500 where c_name=?";
// 模拟转账
// 开启了事务,那么之后的操作都是在缓存中执行
database.beginTransaction();
database.execSQL(sql, new String[] { "wangwu" });
 
// 在事务中模拟一个异常的发生
int a = 1 / 0;
String sql2 = "update t_user set c_money=c_money+500 where c_name=?";
database.execSQL(sql2, new String[] { "lisi" });

// 只有执行该代码,才将缓存中的数据写到数据库中
database.setTransactionSuccessful();
database.endTransaction();
database.close();

工具

推荐使用 Sqlite Studio 免费、开源、好用
https://sqlitestudio.pl/index.rvt

参考

https://www.jianshu.com/p/f80f0fe088b9
http://www.jianshu.com/p/5c33be6ce89d
http://blog.csdn.net/jason0539/article/details/10248457

    原文作者:画世界
    原文地址: https://www.jianshu.com/p/1ef7cfb69cde
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞