Android SQLite3
Android内置了SQLite数据库。
ACID,指数据库事务正确执行的4个要素。
原子性、一致性、隔离性、持久性。
原子性是指整个事务中的所有操作,要么全部完成、要么全部不写成,不可能停滞在中间的某个环节。(否则会回滚)
一致性是指在事务开始之前和事务结束以后,数据库的完整性约束没有被有些破坏。
隔离性是指隔离状态执行事务,使它们好像是在系统给定的时间内执行的唯一性。(串行执行、同步)
持久性是指事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库中,不会回滚。
DDL、DML、DCL、DQL共同组成数据库的完整语言。
DQL数据库查询语言,关键字select
DDL数据库模式定义语言,关键字create、truncate、drop、alert
DML数据库操作语言,关键字insert、update、delete
DCL数据库控制语言,关键字grant、revoke
SQLite CMD
配置adb命令
adb shell
cd data/data/包名/databases/
进入数据库目录
ls
查看所有的数据库目录下的文件
后缀名为journal的文件是日志文件
sqlite3 数据库
打开数据库
.table
查看数据库的所有表
pragma table_info(数据库表名)
查看数据库表结构
执行SQL语句可以查看相应的操作
手机执行的话,需要root权限,并用执行su命令
Android数据库一般通过继承SQLiteOpenHelper类来完成
public class UPSQLiteOpenHelper extends SQLiteOpenHelper{
public UPSQLiteOpenHelper(Context context){
super(context,数据库名[string],null,数据库版本[int])
}
@Override
public void onCreate(SQLiteDatabase db){
db.execSQL(SQL语句(string));
//通过这个方法,创建数据库表
}
@Override
public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
//通过该方法升级数据库表
}
}
//构造出SQLiteOpenHelper实例对象
UPSQLiteOpenHelper helper = new UPSQLiteOpenHelper(context);
//通过getWritableDatabase方法得到可写的数据库
//可以进行insert、update、delete操作
SQLiteDatabase db = helper.getWritableDatabase();
db.inert(table,null,values); //插入操作
db.update(table,values,whereClause,whereArgs);//更新操作
db.delete(table,whereClause,whereArgs);//删除操作
db.close();//关闭数据库
//通过getReadableDatabase方法得到可读的数据库
//可以进行query操作
SQLiteDatabase db = helper.getReadableDatabase();
Cursor cursor = db.query(table, columns, selection, selectionArgs,
groupBy, having, orderBy);
ContentValues[] result = new ContentValues[cursor.getCount()];
int index = 0;
while (cursor.moveToNext()) {
ContentValues values = new ContentValues();
DatabaseUtils.cursorRowToContentValues(cursor, values);
result[index++] = values;
}
cursor.close();
db.close();
也可以直接使用db.execSQL(sql)方法
在进行数据库写操作时,使用事务,在数据库语句执行失败的时候,可以进行回滚。
db.beginTransaction(); //开启事务
db.setTransactionSuccessful();//设置事务成功标志
db.endTransaction();//关闭事务
性能优化
可以使用SQLiteStatement方式,类似JDBC中的PrepareStatement,可以预编译的SQL语句。
For example:
insert into table(field1,field2,field3) values (?,?,?)
update table set field1 = ? where field2 = ?
delete from table where field1 = ?
select * from table where field1 = ?
用?作为占位符,通过bind方法填充数据
bindNull(index)
bindLong(index,value[long])
bindString(index,value[String])
bindDouble(index,value[double])
bindBlob(index,value[byte[]])
index为替换?的索引
bindNull方法是用null替换其索引对应的?
其余就是替换对应数据类型的值
index从1开始计时
SQLiteStatement statement = db.compileStatement(sql);
int size = value.length;
for (int i = 0; i < size; i++) {
Object obj = value[i];
if (obj == null) {
statement.bindNull(i + 1);
} else if (obj instanceof Double) {
statement.bindDouble(i + 1, (Double) obj);
} else if (obj instanceof String) {
statement.bindString(i + 1, (String) obj);
} else if (obj instanceof Long) {
statement.bindLong(i + 1, (Long) obj);
} else if (obj instanceof byte[]) {
statement.bindBlob(i + 1, (byte[]) obj);
}
}
使用SQLiteStatement方法的执行速度最快,其次execSQL()
常用的SQL语句
查询语句
select * from table
select field1,field2 from table
select field1,field2 from table where field3 = value
select field1,field2 from table where field3 = value order by field1
select field1,field2 from table where field3 = value group by field2 order by field1 desc
select distinct(field1) from table 查询唯一不重复的值
聚合函数
sum() max() min() count()
select field1,sum(field2) from table where field3 = value1 group by field1 having sum(field2) > value2
插入语句
insert into table values(value1,value2)
insert into table(field1,field2) values(value1,value2)
更新语句
update table set field1 = value1,field2 = value2 where field3 = value3
删除语句
delete from table where field1 = value1
delete from table 清空表
truncate table tableName 清空表
创建数据库表
create table tableName(
field1 type,
field2 type,
field3 type primary key
);
删除数据库表
drop table tableName
drop table if exists tableName
更改数据库表
alter table tableName rename to tableNewName //改表名
复制表
insert into table1(field1,field2,field3) select field1,field2,field3 from table2
truncate、delete、drop
truncate:删除内容、释放空间但不删除定义
delete:删除内容、不删除定义,也不释放空间
drop:删除内容和定义、释放空间
网友评论