sqlite在android里面的应用十分广泛,例如我们的离线缓存、APP运行数据存储、数据处理等等。我们的QQ的聊天记录也是通过sqlite数据库存储的。所以这几天天天倒腾android里面的数据存储方式了。看了看视频,又翻了翻博客,又咨询了咨询,终于把SQLite稍微透彻点了。好了,废话不多说,不如正规。
什么是sqlite
优点: sqlite是一种轻量的、高效的、零配置、嵌入式的、ACID事务性的关系型数据库。我们可以将其看作是一个API库、数据引擎库。因为谷歌已经把他放在了Android里面了。我们可以直接使用,不需要安装。
缺点:并发性能稍微困难,就是说我们多个进行同时对sqlite进行操作。网络文件支持的也比较弱。它虽然支持了sql大部分功能子集,但不是全部。
sqlite数据类型
NULL :空值。
INTEGER:带符号的整数。
REAL:浮点数字,存储为8-byte IEEE浮点数 。
TEXT:字符串文本
BLOB:二进制对象
sqlite数据库的操作:自己手动操作和使用API库函数操作
下面先看一下 手动操作 吧:
数据库的创建
我们新建一个项目,命名为SqliteDemo。 看一下目录结构。每一个java类在下面都有详细的解释
准备工作:
由于在下面会经常用到数据库的名字、表的名字、数据库的版本号等等一些信息。我们把这些常量放在一个公共类中。
package com.fdd.sqlitedemo;
//公共类
public class Constant {
public static final String DATABASE_NAME="info.db";//数据库名称
public static final int DATABASE_VERSION=1;//数据库版本
public static final String TABLE_NAME="";//表名
}
这些公共的参数放在里面。以后还有其他的一些公公参数也放在里面。我们在布局文件里面添加一个按钮。当点击按钮的时候创建数据库。接下来为了实现代码分离。我们将创建数据库的操作单独封装了一个MysqliteHelper类并继承SQLiteOpenHelper接口,重写里面的构造方法即可
。
接下来看一下我们 MysqliteHelper到底怎么实现的。
/**
* SQLiteOpenHelper
* 1、提供了onCreate,onUpgrade等创建数据库更新数据库方法
* 2、提供了获取数据库对象的函数。
*/
public class MysqliteHelper extends SQLiteOpenHelper {
/**
* 构造函数
* @param context 上下文对象
* @param name 表示创建的数据库的名称
* @param factory 游标工厂
* @param version 表示创建的数据库的版本》=1
*/
@SuppressLint("NewApi") public MysqliteHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
}
/**
*
* @param context
*/
public MysqliteHelper(Context context){
super(context,Constant.DATABASE_NAME,null,Constant.DATABASE_VERSION);
}
/**
* 当数据库创建的时候回调的函数
* @param db 数据库对象
*/
@Override
public void onCreate(SQLiteDatabase db) {
Log.i("info", "创建数据库对象");
}
/**
* 当我们数据库有版本更新的时候回调的函数
* @param db 数据库对象
* @param oldVersion 数据库旧版本
* @param newVersion 数据库新版本
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.i("info", "数据库版本更新");
}
/**
* 此回调函数不是必须重写的
* 在数据库打开的时候回调
*/
@Override
public void onOpen(SQLiteDatabase db) {
Log.i("info", "打开了数据库");
super.onOpen(db);
}
}
我们在创建数据库的时候为了显示创建成功,我们log一下在后台。既然我们有了创建数据库的类,我们点击Button创建就好了。
我们以前可能接触过MVC模式。就是把模型层、控制层、表现层给分离开。在这里由于我们经常要操作数据库。如果我们全部把代码都放在Activity里面,那里面的代码就太多了。而且杂乱无章,为此我们创建一个对数据库操作的工具类DbManger.java
/**
* 对数据库操作的工具类
*/
public class DbManger {
private static MysqliteHelper helper;
public static MysqliteHelper getInstance(Context context){
if(helper==null){
helper=new MysqliteHelper(context);
}
return helper;
}
//执行SQL语句
public static void execSQL(SQLiteDatabase db,String sql){
if(db!=null){//如果数据库不为空
if(sql!=null&&!"".equals(sql)){//如果sql语句不为空
db.execSQL(sql);//执行sql语句
}
}
}
}
最后一步:点击按钮创建数据库
我们在我们的Activity里面的oncreate()方法里面通过刚刚定义好的DbManger得到操作数据库的对象。
//拿到数据库操作对象
helper=DbManger.getInstance(MainActivity.this);
接下来我们为按钮创建一个方法,在这个方法里面通过上面得到的helper对象创建数据库
SQLiteDatabase db=helper.getWritableDatabase();
也是一句话。我们也可以使用helper.getReadableDatabase();创建数据库,两者有什么区别呢?
两者都表示:创建打开数据库。如果不存在则创建。当磁盘已满,或者是数据库本身权限的情况下getReadableDatabase打开的是只读数据库
下面我们运行一下看一下后台的输出结果,看看一下会不会创建。
创建表:
MysqliteHelper里面的onCreate里面添加创建表的代码就好了。
String sql="create table person(_id Integer primary key,name varchar(10),age Integer)";
db.execSQL(sql);
好了我们再次运行就能创建一张表了。但是呢由于我们也会经常用到_id、name、age这些属性,不如还把他放在Constant公共参数类里面吧。添加以下代码在Constant类中。以后再用到这些常亮的时候直接使用即可,上面的能看明白就好,就不改了。
public static final String _ID="_id"; //用户的ID
public static final String NAME="name"; //用户的姓名
public static final String AGE="age"; //用户的年龄
下面再次运行就能创建一张表了。打开我们dervice在里面的data里面找到我们的包名下面就有我们创建的表了。
对表的操作:增
在我们Activity里面写一个方法,在这个方法里面包含了对表的增删改查操作
public void doClick(View view){
switch (view.getId()) {
//增加数据.插入两条数据
case R.id.add_data:
SQLiteDatabase db=helper.getWritableDatabase();
String sql="insert into person value (1,'zhangsan',20)";
DbManger.execSQL(db, sql);
String sq2="insert into person value (2,'lisi',25)";
DbManger.execSQL(db, sq2);//调用上面写好的方法
db.close();//防止占用资源
break;
}
}
对表的操作:改
case R.id.update_data:
db=helper.getWritableDatabase();
String sql3="update person set name='fdd' where _id=1";
DbManger.execSQL(db, sql3);
db.close();//防止占用资源
break;
使用API库函数进行增删改查
在布局文件里面添加几个按钮,用来对表的增删改查操作
对表的操作:增
//使用API函数进行增加
case R.id.insert_api:
db=helper.getWritableDatabase();
ContentValues values=new ContentValues();
values.put("_id", 3);//第一个参数表示插入的字段名,第二个表示值
values.put("name", "xiaoming");
values.put("age", 10);
db.insert("person", null, values);
db.close();//防止占用资源
break;
对表的修改
case R.id.update_api:
db=helper.getWritableDatabase();
ContentValues values1=new ContentValues();
values1.put("_id", 3);//第一个参数表示修改的字段名,第二个修改后的值
int dd=db.update("person", values1, "_id=3", null);
//dd表示修改的SQL语句的条数
if(dd>0){
Log.i("info", "修好数据成功");
}else{
Log.i("info", "修好数据失败");
}
db.close();//防止占用资源
break;
对表的删除
case R.id.delete_api:
db=helper.getWritableDatabase();
int ss=db.delete("person", "_id=1", null);
if(ss>0){
Log.i("info", "删除数据成功");
}else{
Log.i("info", "删除数据失败");
}
db.close();//防止占用资源
break;