SQLite
一、介绍
SQLite是一个关系型轻量级数据库,它对移动端相对极端的资源进行了专门的优化处理,它遵守大概70%的SQL语法,这使得它和MySQL大多语法相近,它的优点显而易见,轻量、较快速、安全、独立、隔离。SQLite百科介绍
数据库文件存放位置:data/data/主包名(AndroidManifest.XML中声明的主包名)/database/xx.db
使用到的类:1、SQLiteDatabase(相当于Connection、PreparedStatement) 2、SQLiteOpenHelper
二、SQL命令
掌握很多DML命令没大有用,因为SQLiteDatabase为我们提供了对应的方法。主要是DDL命令,后面给出一些列的函数。
(一)DDL语句
CREATE | 创建一个新的表,一个表的视图,或者数据库中的其他对象。 |
ALTER | 修改数据库中的某个已有的数据库对象,比如一个表。 |
DROP | 删除整个表,或者表的视图,或者数据库中的其他对象。 |
(二)DML语句
INSERT | 创建一条记录。 |
UPDATE | 修改记录。 |
DELETE | 删除记录。 |
查询语句:和MySQL、Oracle一致
SQLite中的自增:autoincrement
三、数据类型
INT、NTEGER、TINYINT、SMALLINT、MEDIUMINT、BIGINT、UNSIGNED BIG INT、INT2、INT8 | INTEGER |
CHARACTER(20)、VARCHAR(255)、VARYING CHARACTER(255)、NCHAR(55)、NATIVE CHARACTER(70)、NVARCHAR(100)、TEXT、CLOB | TEXT |
BLOB、no datatype specified | NONE |
REAL、DOUBLE、DOUBLE PRECISION、FLOAT | REAL |
NUMERIC、DECIMAL(10,5)、BOOLEAN、DATE、DATETIME | NUMERIC |
SQLite没有boolean值
DATE数据类型
存储类 | 日期格式 |
---|---|
TEXT | 格式为”YYYY-MM-DD HH:MM:SS.SSS”的日期。 |
REAL | 从公元前4714年11月24日格林尼治时间的正午开始算起的天数。 |
INTEGER | 从1970-01-01 00:00:00 UTC算起的秒数。 |
注意:1.SQLite没有boolean值
2.查询语句:和MySQL、Oracle一致
3.SQLite中的自增:autoincrement
4.使用id作为字段名会出现错误,应替换为_id.
------------------------------分割线-----------------------------------
下面开始具体的使用SQLiteDatabase来管理SQLite
四、使用SQLiteDatabase管理SQLite
首先要分三步走:这和把大象装进冰箱一致。1.创建数据库链接,2.放入数据或查询,3.关闭数据库
(一).创建数据库连接
创建一个SQLiteDatabase对象,第二个参数是打开方式(权限),第三个参数是工厂模式
SQLiteDatabase db = SQLiteDatabase.openOrCreateDatabase("数据库名.db",MODE_PRIVATE,null);
(二).执行SQL语句
1.直接执行SQL语句,适用于无返回值得SQL语句(增、删、改、建表、删表、改表)
String sql="create table stu(_id Integer primary key autoincrement,name varchar(20),pic integer)";
db.execSQL(sql);
2.占位模式,对比jdbc中的PreparedStatement
String sql="update emp set name=? where _id=?";
db.execSQL(sql, new Object[]{"王五",1});
3.直接执行函数
增加---insert();
删除---delete();
修改---update();
增加
//一个类似于Map的键值对存储结构
ContentValues values=new ContentValues();
//把数据加入到存储列表
values.put("name", "张三丰");
values.put("pic", 5);
//执行插入,第二个参数是当values列表出现空值时候的替补数据
db.insert("stu", null, values);
删除
db.delete(表名, "name=? and tel=?", new String[]{"张三丰","123456789"});
修改
//一个类似于Map的键值对存储结构
ContentValues values=new ContentValues();
//把数据加入到存储列表
values.put("name", "张三丰");
values.put("pic", 5);
db.update("表名", values, "_id=?", new String[]{"1"});
4.查询
(1)可扩展性高,且多行插询,推荐使用
//建立多行查询语句
//参数:表名,投影查询要查询的字段列表名,条件,条件中?的值,group by,having,order
Cursor cs=db.query("stu", new String[]{"*"}, "_id=?", new String[]{1+""}, null, null, null);
//循环取数据
while(cs.moveToNext())
{
String name=cs.getString(cs.getColumnIndex("name"));
int pic=cs.getInt(2);
//建议使用该方式
int _id=cs.getInt(cs.getColumnIndex("_id"));
}
(2)简化版,单行查询
//建立单行查询语句
//参数:sql语句,替换占位符
Cursor cs=db.rawQuery("select * from xxx where _id=?",new String[]{"1"});
//循环取数据
if(cs.moveToNext())
{
String name=cs.getString(cs.getColumnIndex("name"));
int pic=cs.getInt(2);
//建议使用该方式
int _id=cs.getInt(cs.getColumnIndex("_id"));
}
Cursor-->相当于ResultSet
--------------------华丽的分割线-----------------------
五、使用SQLiteOpenHelper
(一)介绍
这是一个SQLiteDatabase的辅助类,它可以简化打开数据库链接的过程,增加可维护性。
(二)使用
1.创建继承于SQLiteOpenHelper的类,并重写onCreate()和onUpgrade()
oncreate:第一次运行时调用,初始化数据库、建表等操作
onUpgrade:会自动判断传入的版本号,相同不调用,相当于升级。
2.打开连接
(1).创建SQLiteOpenHelper对象
SQLiteOpenHelper dbHelp=new SQLiteOpenHelper();
(2).获得链接
SQLiteDatabase db=dbHelper.getWritableDatabase();
SQLiteDatabase db=dbHelper.getReadableDatabase();
这两种方式,各有优点,getWritableDatabase方式速度较快(翻看源码并没发现优点)。
当数据库磁盘满了,或出现莫种bug,使得数据库只能读不能写,这时候使用getWritableDatabase打开会报错,而
getReadableDatabase会在打开失败的情况下,继续以只读方式打开。
3.关闭连接
使用之后不要忘记db.close();