SQLite 是一款内置到移动设备上的轻量型的数据库,是遵守ACID(原子性、一致性、隔离性、持久性)的关联式数据库管理系统,多用于嵌入式系统中
SQLite 数据库是无类型的,可以向一个integer 的列中添加一个字符串,但它又支持常见的类型比如:NULL,VARCHAR, TEXT,INTEGER,BLOB,CLOB 等
Android 系统内置了SQLite,并提供了一系列API 方便对其进行操作。
SQLiteOpenHelper 是Android 提供的一个抽象工具类,负责管理数据库的创建、升级工作。如果我们想创建数据库,就需要自定义一个类继承SQLiteOpenHelper,然后覆写其中的抽象方法。
方法 | 说明 |
---|---|
getWritableDatabase() | 打开可读写的数据库,没有权限或磁盘已满时会抛异常 |
getReadableDatabase() | 在磁盘空间不足时打开只读数据库,否则打开可读写数据库;有异常时返回一个只读数据库 |
创建的数据库位于:/data/data/包名/databases/目录中
public class MySQLiteOpenHelper extends SQLiteOpenHelper { private static final String DB_NAME = "user.db"; private static final int VERSION = 1; public MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } public MySQLiteOpenHelper(Context context) { super(context, DB_NAME, null, VERSION); } @Override public void onCreate(SQLiteDatabase db) { //数据库创建 db.execSQL("create table person (_id integer primary key autoincrement, " + "name char(10), phone char(20), money integer(20))"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //数据库升级 } @Override public void onOpen(SQLiteDatabase db) { super.onOpen(db); } }
注意:上面的代码我们只是定义了一个MySQLiteOpenHelper 类继承了SQLiteOpenHelper 类。在onCreate()方法中通过执行sql 语句实现表的创建。
方法 | 说明 |
---|---|
execSQL() | 执行SQL语句实现增删改查 |
Cursor rawQuery() | 执行sql查询语句 |
insert() | 插入 |
delete() | 删除 |
update() | 更新 |
query() | 查询 |
beginTransaction() | 开始事务 |
setTransactionSuccessful() | 设置事务成功 |
endTransaction() | 结束事务 |
insert into person (name, phone, money) values ('张三', '159874611', 2000);//插入 delete from person where name = '李四' and _id = 4;//删除 update person set money = 6000 where name = '李四';//更新 select name, phone from person where name = '张三';//查询 alter table t_user add c_money float;//升级 create table t_user(uid integer primary key not null,c_name varchar(20),c_age integer,c_phone varchar(20))";//创建
db.execSQL("insert into person (name, phone, money) values (?, ?, ?);", new Object[]{ "张三", 15987461, 75000}); Cursor cursor = db.rawQuery("select _id, name, money from person where name = ?;", new String[]{ "张三"});
//以键值对的形式保存要存入数据库的数据 ContentValues cv = new ContentValues(); cv.put("name", "刘能"); cv.put("phone", 1651646); cv.put("money", 3500); //返回值是改行的主键,如果出错返回-1 long i = db.insert("person", null, cv);
nullColumnHack:当ContentValues为空的时候,会将nullColumnHack 作为“NULL”的属性,几乎用不到,一般为null
ContentValues cv = new ContentValues(); cv.put("money", 25000); int i = db.update("person", cv, "name = ?", new String[]{ "赵四"});
//返回值是删除的行数 int i = db.delete("person", "_id = ? and name = ?", new String[]{ "1", "张三"});
db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit);
参数名 | 作用 |
---|---|
table | 表名 |
columns | 查询的字段 |
selection | 查询条件 |
selectionArgs | 填充查询条件的占位符,条件中?对应的值 |
groupBy | 分组查询参数 |
having | 分组查询条件 |
orderBy | 排序字段和规则,“字段名 desc/asc” |
limit | 分页查询,“m,n”,m表示从第几条开始查,n表示一个查询多少条数据 |
select * from blacknumber limit pagesize offset startindex
pageSize每页有多少条数据,startIndex 从哪条数据开始
方法 | 说明 |
---|---|
moveToNext() | 游标移动到下一行位置 |
moveToFirst() | 游标移动到第一行位置 |
moveToPrevious() | 游标移动到前一行位置 |
moveToLast() | 游标移动到最后一行位置 |
getXxx() | 获取列的值,如:getInt(),getString() |
getColumnIndex() | 获取列索引 |
getColumnNames() | 获取所有字段名字 |
getCount() | 获取游标的记录行数 |
游标工厂,创建游标
ContentValues values = new ContentValues(); values.put("name", "lisi"); values.clear();
在SQLiteDatabase 提供了对事务的支持,处于事务中的操作都是“临时性”的,只有事务提交了才会将数据保存到数据库。
事务的使用不仅可以保证数据的一致性,也可以提高批处理时的执行效率。
SQLiteDatabase 提供的beginTransaction()打开事务,endTransaction()结束事务。注意:结束事务并不代表事务提交,如果想让数据写入的数据库需要在结束事务前执行setTransactionSuccessful()方法。这是事务提交的唯一方式。
使用事务会大大提高批量处理的效率
try { //开启事务 db.beginTransaction(); ........... //设置事务执行成功 db.setTransactionSuccessful(); } finally{ //关闭事务 //如果此时已经设置事务执行成功,则sql语句生效,否则不生效 db.endTransaction(); }
SQLiteOpenHelper 有两个方法均可返回SQLiteDatabase 对象:
该方法返回的对象和另外一个方法返回的对象没有任何差异,返回的对象对数据库都可以进行读、写操作,当磁盘已满或者权限不足的情况下该方法会抛出异常。
跟另外一个方法相比,在磁盘已满的情况下,该方法不会抛出异常,而是返回一个只读的数据库操作对象。根据这两种方法返回对象的差异,如果需要对数据库进行查询操作则推荐使用后者,如果添加、修改、删除数据则推荐使用前者。
sqlite3 是Android 内置的操作数据库工具,使用该工具可以直接对SQLite 数据库进行操作。操作步骤:
定义操作数据库的增删改查抽象方法,insert(),delete(),update(),select()
Dao接口的实现类
SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version)
创建数据库
onCreate(SQLiteDatabase db)
升级数据库
onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
ORM是Object Relation Mapping的简称,即对象关系映射,说人话就是用面向对象的编程思想去操作数据库,调用一个方法即可完成数据库的增删改查操作,不用写繁琐的SQL语句,大大提高了开发效率
框架名称 | 功能描述 |
---|---|
OrmLite | JDBC和Android的轻量级ORM java包 |
Sugar | 用超级简单的方法处理Android数据库 |
GreenDAO | 一种轻快地将对象映射到SQLite数据库的ORM解决方案,使用的App有:薄荷,京东 |
ActiveAndroid | 以活动记录方式为Android SQLite提供持久化 |
SQLBrite | SQLiteOpenHelper 和ContentResolver的轻量级包装 |
Realm | 移动数据库:一个SQLite和ORM的替换品 |
android-database-sqlcipher | 数据库加密 |
storio | Beautiful API for SQLiteDatabase and ContentResolver |
realm-java | 高性能数据库,Realm is a mobile database: a replacement for SQLite & ORMs |
当SQLite数据库中包含自增列时,会自动建立一个名为 sqlite_sequence 的表。这个表包含两个列:name和seq。name记录自增列所在的表,seq记录当前序号(下一条记录的编号就是当前序号加1)。如果想把某个自增列的序号归零,只需要修改 sqlite_sequence表就可以了。
UPDATE sqlite_sequence SET seq = 0 WHERE name='TableName'; <!--也可以直接把该记录删掉--> DELETE FROM sqlite_sequence WHERE name='TableName'; <!--要想将所有表的自增列都归零,直接清空sqlite_sequence表就可以了--> DELETE FROM sqlite_sequence;
SQLite教程
性能优化之数据库优化
Android数据库高手秘籍
Android数据存储与持久化
MySQL数据库:SQL语句
MySQL数据库:完整性约束