app数据存储有很多办法,一般情况下根据数据量来选择:
数据量较小可使用SharedPreferences保持,比较多使用GreenDao保存,数据量巨大可使用File流保存;
最近项目中需要保存几百组数据,正好借此结合了解下GreenDao数据库,为什么选择GreenDao?GreenDao有那些优势就不再叙述了,网上一搜一大堆,简单说下使用步骤,重点了解下查询操作;
①在Project的build.gradle中添加相关依赖
②在Module的build.gradle中添加相关依赖和配置信息
/*
* @Entity: 告诉GreenDao该对象为实体,只有被@Entity注释的Bean类才能被dao类操作()
* @Id: 对象的Id,使用Long类型作为EntityId,否则会报错。@Id(autoincrement = true)表示主键会自增,如果false就会使用旧值
* @Property: 可以自定义字段名,注意外键不能使用该属性
* @NotNull: 属性不能为空
* @Transient: 使用该注释的属性不会被存入数据库的字段中
* @Unique: 该属性值必须在数据库中是唯一值
* @Generated: 编译后自动生成的构造函数、方法等的注释,提示构造函数、方法等不能被修改
*/
@Entity
public class Person {
@Id
private Long id;
@NotNull
private String name;
@NotNull
private int age;
private String idCard;
}
Build > make Project 重构工程后会自动生成数据库辅助类
为了方便项目中操作数据库,简单封装了一个数据库工具类:
public class DaoManager {
// 数据库名称
private static final String DB_NAME = "person.db";
private static DaoManager instance;
private MyOpenHelper mHelp;
private DaoSession mDaoSession;
/**
* 使用单例模式获得操作数据库的对象
*/
public static DaoManager getInstance() {
if (instance == null)
instance = new DaoManager();
return instance;
}
// 初始化数据库
public void initGreenDao(Context mContext) {
if (mHelp != null) return;
/*
通过 DaoMaster 的内部类 DevOpenHelper,获取 SQLiteOpenHelper 对象。
注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
先使用DaoMaster.DevOpenHelper创建,下面数据库升级使用自定义的OpenHelper
*/
mHelp = new MyOpenHelper(mContext, DB_NAME, null);
SQLiteDatabase db = mHelp.getWritableDatabase();
DaoMaster daoMaster = new DaoMaster(db);
mDaoSession = daoMaster.newSession();
}
public DaoSession getDaoSession() {
return mDaoSession;
}
// 关闭数据库
public void closeGreenDao() {
if (mDaoSession != null) {
mDaoSession.clear();
mDaoSession = null;
}
if (mHelp != null) {
mHelp.close();
mHelp = null;
}
}
}
在项目启动时初始化数据库
增加数据,这里只介绍单条增加
Person p1 = new Person((long) 1, "zs", 6,"001");
DaoManager.getInstance().getDaoSession().insert(p1);
最主要的就是查询操作,这里介绍几种查询:(如果SQL语句很6,可使用SQL语句结合rawQuery方法查询)
PersonDao personDao = DaoManager.getInstance().getDaoSession().getPersonDao();
// 查询所有
List peopleList = personDao.loadAll();
// 条件查询 (查询单个对象,用eq方法)
Person unique = personDao.queryBuilder().where(PersonDao.Properties.Name.eq("zs")).unique();
// 条件查询 -- 查询非内容 notEq 返回集合 (查询Age!=6的数据)
List notEqList = personDao.queryBuilder().where(PersonDao.Properties.Age.notEq(6)).list();
// 条件查询 -- 模糊查询 (查询Name以“z”开头的数据)
List zNameList = personDao.queryBuilder().where(PersonDao.Properties.Name.like("z%")).list();
修改数据
DaoManager.getInstance().getDaoSession().getPersonDao().update(new Person((long) 1, "zl", 6,"006"));
删除数据(可结合查询操作删除部分数据)
PersonDao personDao = DaoManager.getInstance().getDaoSession().getPersonDao();
// 删除所有记录
personDao.deleteAll();
// 删除多条 -- 配合查询删除符合条件的数据 (删除名字以“z”开头的数据)
personDao.deleteInTx(personDao.queryBuilder().where(PersonDao.Properties.Name.like("z%")).list());
GreenDao很强大,这里只是简单介绍最基础的增删查改方法,入门后可根据项目需求自行研究
数据库升级也非常简单,更新表单数据后,增加scemaVersion版本即可,问题是默认会删除旧数据,在此借助GreenDaoUpgradeHelper三方库升级;
/**
* 自定义OpenHelp类,数据库升级使用
* 替代DaoMaster.DevOpenHelper初始化数据库
*/
public class MyOpenHelper extends DaoMaster.OpenHelper {
public MyOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory) {
super(context, name, factory);
}
// 在onUpgrade方法中进行数据库的迁移
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
super.onUpgrade(db, oldVersion, newVersion);
// GreenDaoUpgradeHelper 迁移数据
MigrationHelper.migrate(db, PersonDao.class, UserInfoDao.class);
}
}