DBUtil是XUtil框架的核心类之一,那么既然是核心类,那么就会有很多问题需要去探究。
1、DBUtil所涉及到的数据库的增删改查以及底层的代码到底是怎么实现的呢?
2、关会使用DBUtil是不够的,要知道DBUtil到底哪些地方方便了我们操作数据库,是怎样做到的?
3、学习XUtil的思维方式,书写规范等。
废话一堆,我们就正式进入DBUtil的学习吧!
打开DBUtil的类,先从总体来看,作者给我们把这个拥有800多行代码的类,分为了7部分,分别是
1、create instance(创建实例)
2、operations(操作部分)
3、config(配置)
4、private operations with out transaction(无业务的操作)
5、tools(工具)
6、exec sql(sql执行)
7、temp cache(临时缓存)
我们一次开始学习
一、create instance
1、作者首先实现了一个带参的构造方法,需要传入DaoConfig,代码如下:
private DbUtils(DaoConfig config) {
if (config == null) {
throw new IllegalArgumentException("daoConfig may not be null");
}
this.database = createDatabase(config);
this.daoConfig = config;
}
其中,DaoConfig是数据库的配置类,即全文的第三部分–config(配置),这块会在config(配置)里具体讲解。
2、作者提供了几种创建数据库的方式
(1)上文使用的是通过DaoConfig创建,具体代码如下:
private SQLiteDatabase createDatabase(DaoConfig config) {
SQLiteDatabase result = null;
String dbDir = config.getDbDir();
if (!TextUtils.isEmpty(dbDir)) {
File dir = new File(dbDir);
if (dir.exists() || dir.mkdirs()) {
File dbFile = new File(dbDir, config.getDbName());
result = SQLiteDatabase.openOrCreateDatabase(dbFile, null);
}
} else {
result = config.getContext().openOrCreateDatabase(config.getDbName(), 0, null);
}
return result;
}
配置中 包括以下4个属性,用于配置数据库
private Context context;
private String dbName = “xUtils.db”; // default db name
private int dbVersion = 1;
private DbUpgradeListener dbUpgradeListener;
(2)通过传入上下文创建DB,这种情况下使用的是系统默认的配置
dbName = xUtils.db, dbVersion = 1;
public static DbUtils create(Context context) {
DaoConfig config = new DaoConfig(context);
return getInstance(config);
}
(3)通过传入上下文和dbName,根据用户指定的dbName生成数据库
public static DbUtils create(Context context, String dbName) {
DaoConfig config = new DaoConfig(context);
config.setDbName(dbName);
return getInstance(config);
}
(4) 通过传入上下文 、dbDir、dbName,根据用户指定的dbName在dbDir位置生成数据库
public static DbUtils create(Context context, String dbDir, String dbName) {
DaoConfig config = new DaoConfig(context);
config.setDbDir(dbDir);
config.setDbName(dbName);
return getInstance(config);
}
(5) 通过传入上下文 、dbName,dbVersion、dbUpgradeListener根据用户指定的dbName生成dbVersion版的数据库
public static DbUtils create(Context context, String dbName, int dbVersion, DbUpgradeListener dbUpgradeListener) {
DaoConfig config = new DaoConfig(context);
config.setDbName(dbName);
config.setDbVersion(dbVersion);
config.setDbUpgradeListener(dbUpgradeListener);
return getInstance(config);
}
(6) 通过传入上下文 、dbName,dbVersion、dbUpgradeListener,根据用户指定的dbName生成dbVersion的数据库 ,指定监听器
public static DbUtils create(Context context, String dbDir, String dbName, int dbVersion, DbUpgradeListener dbUpgradeListener) {
DaoConfig config = new DaoConfig(context);
config.setDbDir(dbDir);
config.setDbName(dbName);
config.setDbVersion(dbVersion);
config.setDbUpgradeListener(dbUpgradeListener);
return getInstance(config);
}
3、获取DbUtils的getInstance方法
private synchronized static DbUtils getInstance(DaoConfig daoConfig) {
DbUtils dao = daoMap.get(daoConfig.getDbName());
if (dao == null) {
dao = new DbUtils(daoConfig);
daoMap.put(daoConfig.getDbName(), dao);
} else {
dao.daoConfig = daoConfig;
}
// update the database if needed
SQLiteDatabase database = dao.database;
int oldVersion = database.getVersion();
int newVersion = daoConfig.getDbVersion();
if (oldVersion != newVersion) {
if (oldVersion != 0) {
DbUpgradeListener upgradeListener = daoConfig.getDbUpgradeListener();
if (upgradeListener != null) {
upgradeListener.onUpgrade(dao, oldVersion, newVersion);
} else {
try {
dao.dropDb();
} catch (DbException e) {
LogUtils.e(e.getMessage(), e);
}
}
}
database.setVersion(newVersion);
}
return dao;
}
4、设置configDebug调试
public DbUtils configDebug(boolean debug) {
this.debug = debug;
return this;
}
5、配置是否configAllowTransaction
public DbUtils configAllowTransaction(boolean allowTransaction) {
this.allowTransaction = allowTransaction;
return this;
}
6、获取当前数据库 getDatabase()
public SQLiteDatabase getDatabase() {
return database;
}
7、获取DaoConfig
public DaoConfig getDaoConfig() {
return daoConfig;
}