diff --git a/foudations/mogo-utils/src/main/java/com/mogo/utils/sqlite/BaseDao.kt b/foudations/mogo-utils/src/main/java/com/mogo/utils/sqlite/BaseDao.kt
deleted file mode 100644
index 82b9ff529a..0000000000
--- a/foudations/mogo-utils/src/main/java/com/mogo/utils/sqlite/BaseDao.kt
+++ /dev/null
@@ -1,433 +0,0 @@
-package com.mogo.utils.sqlite
-
-import android.content.ContentValues
-import android.database.Cursor
-import android.database.sqlite.SQLiteDatabase
-import com.mogo.utils.logger.Logger
-import com.mogo.utils.sqlite.annotation.DbField
-import com.mogo.utils.sqlite.annotation.DbTable
-import java.lang.reflect.Field
-import java.util.*
-
-
-/**
- *
数据类操作实现
- *Created by donghongyu on 2019/9/6.
- */
-//T必须指明上界是Any且不为null,下面会用到反射获取对象实例,默认是Any?
-open class BaseDao : IBaseDao {
- private val TAG = "BaseDao"
-
- //数据库操作的引用
- private var sqLiteDatabase: SQLiteDatabase? = null
-
- //要操作的数据实体的引用
- private var entityClass: Class? = null
-
- //要操作的数据表名称
- private var tableName: String? = null
-
- //记录数据表是否存在
- private var isInit = false
-
- //因为反射会消耗时间,这里使用缓存,进行性能优化
- //缓存空间(key-字段名,标注的自定义注解 value-成员变量)
- private var cacheField: HashMap? = null
-
- override fun init(sqLiteDatabase: SQLiteDatabase, entityClass: Class): Boolean {
- this.sqLiteDatabase = sqLiteDatabase
- this.entityClass = entityClass
- //自动建表(只创建一次)
- if (!isInit) {
- //获取表名
- tableName = entityClass.getAnnotation(DbTable::class.java).tableName
-
- //如果数据库没有建立连接跳出操作防止异常信息
- if (!sqLiteDatabase.isOpen) {
- return false
- }
-
- //执行Sql进行自动建表
- val createTableSql = getCreateTableSql()
- Logger.d(TAG, "执行SQL:$createTableSql")
-
- sqLiteDatabase.execSQL(createTableSql)
-
- //初始化缓存空间
- cacheField = HashMap()
- initCacheField()
-
- //标记已经创建过数据表
- isInit = true
- }
-
- return isInit
- }
-
- /**
- * 初始化字段缓存
- */
- private fun initCacheField() {
- //1.取到所有的列名(查询一个空表获取表结构,不影响性能)
- if (sqLiteDatabase != null && sqLiteDatabase!!.isOpen) {
- val sqlQuery = "select * from $tableName limit 1,0"
- val cursor = sqLiteDatabase!!.rawQuery(sqlQuery, null)
- //获取所有的列名
- val columnNames = cursor.columnNames
- //关闭资源
- cursor.close()
- //2.取所有成员名
- val columnFields = entityClass!!.declaredFields
- //3.通过两层循环,进行对应关系建立
- columnNames.forEach ColumnFor@{ columnName ->
- columnFields.forEach FieldFor@{ columnField ->
- if (columnName == columnField.getAnnotation(DbField::class.java).fieldName) {
- columnField.isAccessible = true
- cacheField!![columnName] = columnField
- }
- return@FieldFor
- }
- }
- }
- }
-
- /**
- * 拼装创建数据表的SQL语句
- */
- private fun getCreateTableSql(): String? {
- //create table if not exists tb_name(_id integer,name varchar2(20))
- val sqlCreateTable = StringBuffer()
- sqlCreateTable.append("create table if not exists ")
- sqlCreateTable.append("$tableName (")
- //反射获取所有的数据对象内的成员变量
- val fields = entityClass!!.declaredFields
-
- fields.forEachIndexed { index, field ->
- //字段名称
- val columnName = field.getAnnotation(DbField::class.java).fieldName
- //获取成员变量数据类型
-
- when (val fieldType = field.type) {
- java.lang.String::class.java -> {
- sqlCreateTable.append("$columnName TEXT,")
- }
- java.lang.Integer::class.java -> {
- sqlCreateTable.append("$columnName INTEGER,")
- }
- java.lang.Long::class.java -> {
- sqlCreateTable.append("$columnName BIGINT,")
- }
- java.lang.Double::class.java -> {
- sqlCreateTable.append("$columnName DOUBLE,")
- }
- ByteArray::class.java -> {
- sqlCreateTable.append("$columnName BLOB,")
- }
- else -> {
- //未知类型
- throw UnsupportedOperationException("未定义的数据类型:fieldName= $columnName fieldType= $fieldType")
- }
- }
-
- if (index == fields.size - 1) {
- if (sqlCreateTable.endsWith(","))
- sqlCreateTable.deleteCharAt(sqlCreateTable.length - 1)
- }
- }
- sqlCreateTable.append(")")
-
- return sqlCreateTable.toString()
- }
-
- /**
- * 插入数据
- */
- override fun insert(entity: T): Long {
- //1、准备好ContentValues中的数据
- //2、设置插入的内容
- val values: ContentValues = getContentValuesForInsert(entity)
- //3、执行插入
- return if (sqLiteDatabase != null && sqLiteDatabase!!.isOpen) {
- sqLiteDatabase!!.insert(tableName, null, values)
- } else {
- -1
- }
- }
-
- /**
- * 删除数据
- */
- override fun delete(where: T): Int {
- val condition = Condition(getContentValuesForQuery(where))
-
- return if (sqLiteDatabase != null && sqLiteDatabase!!.isOpen) {
- //受影响行数
- sqLiteDatabase!!
- .delete(
- tableName,
- condition.getWhereCause(),
- condition.getWhereArgs()
- )
- } else {
- -1
- }
- }
-
- /**
- * 更新数据
- */
- override fun update(where: T, newEntity: T): Int {
- val condition = Condition(getContentValuesForQuery(where))
-
- return if (sqLiteDatabase != null && sqLiteDatabase!!.isOpen) {
- //受影响行数
- sqLiteDatabase!!
- .update(
- tableName,
- getContentValuesForInsert(newEntity),
- condition.getWhereCause(),
- condition.getWhereArgs()
- )
- } else {
- -1
- }
- }
-
- /**
- * 查询数据
- * @param where 查询条件对象,同时也用来初始化对象使用
- */
- override fun query(where: T): MutableList {
- return query(where, null, null, null)
- }
-
- /**
- * 查询数据
- * @param where 查询条件对象
- * @param orderBy 排序规则
- * @param startIndex 开始的位置
- * @param limit 限制查询得到的数据个数
- */
- fun query(where: T, orderBy: String?, startIndex: Int?, limit: Int?): MutableList {
- //拼接分页语句
- var limitString: String? = null
- if (startIndex != null && limit != null) {
- limitString = "$startIndex,$limit"
- }
-
- val condition = Condition(getContentValuesForQuery(where))
-
- var cursor: Cursor? = null
-
- //定义查询结果
- val result = mutableListOf()
- if (sqLiteDatabase != null && sqLiteDatabase!!.isOpen) {
- try {
- //查询数据库
- cursor = sqLiteDatabase!!
- .query(
- tableName,
- null,
- condition.getWhereCause(),
- condition.getWhereArgs(),
- null,
- null,
- orderBy,
- limitString
- )
- //将查到结果添加到返回集合中
- result.addAll(getQueryResult(cursor, where))
- } catch (e: Exception) {
- e.printStackTrace()
- } finally {
- cursor?.close()
- }
- }
- Logger.d(TAG, "查询结果:" + result.size + " 条")
- return result
- }
-
- /**
- * 获取查询使用的ContentValues
- */
- private fun getContentValuesForQuery(entity: T): ContentValues {
- val contentValues = ContentValues()
- try {
- cacheField!!.forEach {
- if (it.value.get(entity) == null) {
- return@forEach
- }
- contentValues.put(it.key, it.value.get(entity).toString())
- }
- } catch (e: IllegalAccessError) {
- e.printStackTrace()
- }
-
- return contentValues
- }
-
- /**
- * 条件拼接
- */
- class Condition(whereContent: ContentValues) {
- /**
- * 条件拼接
- * _id=?&&name=?
- */
- private var whereCause: String? = null
-
- private var whereArgs: Array? = null
-
- //根据传入的contentValues转换成查询条件
- init {
- //记录后面填充到查询语句“?”上的数据参数
- val argList = mutableListOf()
- //拼接查询语句
- val whereCaseSb = StringBuilder()
-
- /**
- * 是为了链接下面的查询条件条件,也或者是替换没有查询条件的语句。
- * 比如:要把检索条件作为一个参数传递给SQL,
- * 那么,当这个检索语句不存在的话就可以给它赋值为1=1.
- * 这样就避免了SQL出错,也就可以把加条件的SQL和不加条件的SQL合二为一。
- */
- whereCaseSb.append(" 1=1 ")
-
- val keys = whereContent.keySet()
- val iterator = keys.iterator()
-
- //因为使用了“1=1”,所以即便是这里没有任何数据拼接,也是可以正常
- while (iterator.hasNext()) {
- val key = iterator.next() as String
- val valueObject = whereContent.get(key)
- if (valueObject != null) {
- val value = valueObject as String
- //拼接查询条件语句
- //1:1 and _id=? and name=?
- whereCaseSb.append(" and $key =?")
-
- //记录?对应的value
- argList.add(value)
- }
- }
- //集合转成数组
- this.whereArgs = argList.toTypedArray()
- this.whereCause = whereCaseSb.toString()
- }
-
- fun getWhereCause(): String {
- return this.whereCause!!
- }
-
- fun getWhereArgs(): Array {
- return this.whereArgs!!
- }
- }
-
- /**
- * 获取查询db结果
- */
- private fun getQueryResult(cursor: Cursor, where: T): MutableList {
- //定义查询结果
- val result = mutableListOf()
- //Cursor从头读到尾
- //游标从头读到尾
- cursor.moveToFirst()
- //移动游标获取下一行数据
- while (!cursor.isAfterLast) {
- //通过反射构建一个查询结果对象
- val item = where.javaClass.newInstance()
-
- //拿到缓存的当前数据对象的成员变量与数据库的键值关系
- val fieldIterator = cacheField!!.entries.iterator()
- fieldIterator.forEach IteratorFor@{
- //获取数据库字段名称
- val columnName = it.key
- //数据库字段名对应的数据对象的成员变量
- val field = it.value
- //获取指定列名对应的索引
- val columnIndex = cursor.getColumnIndex(columnName)
- //获取成员变量数据类型
- val fieldType = field.type
-
- if (columnIndex != -1) {
- when (fieldType) {
- java.lang.String::class.java -> {
- field.set(item, cursor.getString(columnIndex))
- }
- java.lang.Integer::class.java -> {
- field.set(item, cursor.getInt(columnIndex))
- }
- java.lang.Long::class.java -> {
- field.set(item, cursor.getLong(columnIndex))
- }
- java.lang.Double::class.java -> {
- field.set(item, cursor.getDouble(columnIndex))
- }
- ByteArray::class.java -> {
- field.set(item, cursor.getBlob(columnIndex))
- }
- else -> {
- //未知类型
- throw UnsupportedOperationException("未定义的数据类型:columnName= $columnName fieldType= $fieldType")
- }
- }
- }
- }
- //添加到结果集
- result.add(item)
- //移动到下一个位置
- cursor.moveToNext()
- }
- cursor.close()
- return result
- }
-
- /**
- * 获取插入使用的ContentValues
- */
- private fun getContentValuesForInsert(entity: T): ContentValues {
- val contentValues = ContentValues()
-
- val fieldIterator = cacheField!!.entries.iterator()
-
- fieldIterator.forEach IteratorFor@{
- try {
- //获取变量的值
- val valueObject = it.value.get(entity) ?: return@IteratorFor
- //获取列名
- val columnName = it.key
- //获取成员变量数据类型
- val fieldType = it.value.type
- when (fieldType) {
- java.lang.String::class.java -> {
- contentValues.put(columnName, valueObject as String)
- }
- java.lang.Integer::class.java -> {
- contentValues.put(columnName, valueObject as Int)
- }
- java.lang.Long::class.java -> {
- contentValues.put(columnName, valueObject as Long)
- }
- java.lang.Double::class.java -> {
- contentValues.put(columnName, valueObject as Double)
- }
- ByteArray::class.java -> {
- contentValues.put(columnName, valueObject as ByteArray)
- }
- else -> {
- //未知类型
- throw UnsupportedOperationException("未定义的数据类型:columnName= $columnName fieldType= $fieldType")
- }
- }
- } catch (e: IllegalArgumentException) {
- e.printStackTrace()
- }
- }
-
- Logger.d(TAG, "contentValues:$contentValues")
-
- return contentValues
- }
-
-}
\ No newline at end of file
diff --git a/foudations/mogo-utils/src/main/java/com/mogo/utils/sqlite/IBaseDao.kt b/foudations/mogo-utils/src/main/java/com/mogo/utils/sqlite/IBaseDao.kt
deleted file mode 100644
index f3378ee1fd..0000000000
--- a/foudations/mogo-utils/src/main/java/com/mogo/utils/sqlite/IBaseDao.kt
+++ /dev/null
@@ -1,35 +0,0 @@
-package com.mogo.utils.sqlite
-
-import android.database.sqlite.SQLiteDatabase
-
-/**
- * 操作SQLite数据库的顶层接口
- * Created by donghongyu on 2019/9/6.
- */
-interface IBaseDao {
- /**
- * 初始化数据库连接
- */
- fun init(sqLiteDatabase: SQLiteDatabase, entityClass: Class): Boolean
-
- /**
- * 将 [entity] 进行数据插入
- */
- fun insert(entity: T): Long
-
- /**
- * 根据条件 [where] 进行数据删除
- */
- fun delete(where: T): Int
-
- /**
- * 根据条件 [where] 进行数据更新,如果[where]==只初始化不赋值 则代表删除所有数据
- */
- fun update(where: T, newEntity: T): Int
-
- /**
- * 根据条件 [where] 进行数据查询,如果[where]==只初始化不赋值 则代表查询所有数据
- */
- fun query(where: T): MutableList
-
-}
\ No newline at end of file
diff --git a/foudations/mogo-utils/src/main/java/com/mogo/utils/sqlite/SQLBaseDao.java b/foudations/mogo-utils/src/main/java/com/mogo/utils/sqlite/SQLBaseDao.java
index a79fad7b94..8b3ef13483 100644
--- a/foudations/mogo-utils/src/main/java/com/mogo/utils/sqlite/SQLBaseDao.java
+++ b/foudations/mogo-utils/src/main/java/com/mogo/utils/sqlite/SQLBaseDao.java
@@ -23,7 +23,7 @@ import java.util.Set;
* @param
* @author donghongyu
*/
-public class SQLBaseDao implements IBaseDao {
+public class SQLBaseDao implements SQLIDao {
private String TAG = "SQLBaseDao";
//数据库操作的引用
@@ -139,6 +139,18 @@ public class SQLBaseDao implements IBaseDao {
return query(where, null, null, null);
}
+
+ /**
+ * 查询数据
+ *
+ * @param where 查询条件对象,同时也用来初始化对象使用
+ */
+ @NotNull
+ @Override
+ public List query(T where, String orderBy) {
+ return query(where, orderBy, null, null);
+ }
+
/**
* 查询数据
*
diff --git a/foudations/mogo-utils/src/main/java/com/mogo/utils/sqlite/BaseDaoFactory.kt b/foudations/mogo-utils/src/main/java/com/mogo/utils/sqlite/SQLDaoFactory.kt
similarity index 79%
rename from foudations/mogo-utils/src/main/java/com/mogo/utils/sqlite/BaseDaoFactory.kt
rename to foudations/mogo-utils/src/main/java/com/mogo/utils/sqlite/SQLDaoFactory.kt
index b5325445c7..ad3a98da14 100644
--- a/foudations/mogo-utils/src/main/java/com/mogo/utils/sqlite/BaseDaoFactory.kt
+++ b/foudations/mogo-utils/src/main/java/com/mogo/utils/sqlite/SQLDaoFactory.kt
@@ -10,14 +10,14 @@ import com.mogo.utils.sqlite.proxy.BaseDaoProxyLog
* 数据库处理工厂
* Created by donghongyu on 2019/9/6.
*/
-open class BaseDaoFactory {
+open class SQLDaoFactory {
//默认数据库名称
private var dbName = "MoGoSQLite.db"
companion object {
//单利工厂
- private var baseDaoFactory: BaseDaoFactory? = null
+ private var sqlDaoFactory: SQLDaoFactory? = null
//数据库存储路径
private lateinit var sqLiteDatabasePath: String
@@ -25,21 +25,21 @@ open class BaseDaoFactory {
//数据库操作类
private var sqLiteDatabase: SQLiteDatabase? = null
- fun getInstance(): BaseDaoFactory {
- if (baseDaoFactory == null) {
- synchronized(BaseDaoFactory::class.java) {
- if (baseDaoFactory == null) {
- baseDaoFactory = BaseDaoFactory()
+ fun getInstance(): SQLDaoFactory {
+ if (sqlDaoFactory == null) {
+ synchronized(SQLDaoFactory::class.java) {
+ if (sqlDaoFactory == null) {
+ sqlDaoFactory = SQLDaoFactory()
}
}
}
- return baseDaoFactory!!
+ return sqlDaoFactory!!
}
}
//获取数据库操作对象
- fun getBaseDao(context: Context, entityClass: Class): IBaseDao? {
- var baseDao: IBaseDao? = null
+ fun getBaseDao(context: Context, entityClass: Class): SQLIDao? {
+ var baseDao: SQLIDao? = null
try {
//获取数据库名称,如果没有设置则使用默认名称
@@ -56,7 +56,7 @@ open class BaseDaoFactory {
// baseDao = BaseDaoProxyShow().bind(BaseDaoProxyLog().bind(BaseDao())) as IBaseDao
// baseDao = BaseDaoProxyLog().bind(SQLBaseDao()) as IBaseDao
// baseDao = BaseDao()
- baseDao = BaseDaoProxyLog().bind(BaseDao()) as IBaseDao
+ baseDao = BaseDaoProxyLog().bind(SQLBaseDao()) as SQLIDao
baseDao.init(sqLiteDatabase!!, entityClass)
} catch (e: Exception) {
diff --git a/foudations/mogo-utils/src/main/java/com/mogo/utils/sqlite/SQLIDao.java b/foudations/mogo-utils/src/main/java/com/mogo/utils/sqlite/SQLIDao.java
new file mode 100644
index 0000000000..019a7f3e39
--- /dev/null
+++ b/foudations/mogo-utils/src/main/java/com/mogo/utils/sqlite/SQLIDao.java
@@ -0,0 +1,42 @@
+package com.mogo.utils.sqlite;
+
+import android.database.sqlite.SQLiteDatabase;
+
+import java.util.List;
+
+/**
+ * 数据库操作接口
+ *
+ * @author donghongyu
+ */
+public interface SQLIDao {
+ /**
+ * 初始化数据库连接
+ */
+ boolean init(SQLiteDatabase sqLiteDatabase, Class entityClass);
+
+ /**
+ * 将 [entity] 进行数据插入
+ */
+ long insert(T entity);
+
+ /**
+ * 根据条件 [where] 进行数据删除
+ */
+ int delete(T where);
+
+ /**
+ * 根据条件 [where] 进行数据更新,如果[where]==只初始化不赋值 则代表删除所有数据
+ */
+ int update(T where, T newEntity);
+
+ /**
+ * 根据条件 [where] 进行数据查询,如果[where]==只初始化不赋值 则代表查询所有数据
+ */
+ List query(T where);
+
+ /**
+ * 根据条件 [where] 进行数据查询,如果[where]==只初始化不赋值 则代表查询所有数据
+ */
+ List query(T where, String orderBy);
+}
diff --git a/foudations/mogo-utils/src/main/java/com/mogo/utils/sqlite/proxy/BaseDaoProxy.kt b/foudations/mogo-utils/src/main/java/com/mogo/utils/sqlite/proxy/BaseDaoProxy.kt
index f48adc9f79..c0f914c280 100644
--- a/foudations/mogo-utils/src/main/java/com/mogo/utils/sqlite/proxy/BaseDaoProxy.kt
+++ b/foudations/mogo-utils/src/main/java/com/mogo/utils/sqlite/proxy/BaseDaoProxy.kt
@@ -2,13 +2,13 @@ package com.mogo.utils.sqlite.proxy
import android.database.sqlite.SQLiteDatabase
import android.util.Log
-import com.mogo.utils.sqlite.IBaseDao
+import com.mogo.utils.sqlite.SQLIDao
/**
* 静态代理数据库操作类,用来记录日志
* Created by donghongyu on 2019/9/6.
*/
-class BaseDaoProxy(var iBaseDao: IBaseDao) : IBaseDao by iBaseDao {
+class BaseDaoProxy(var iBaseDao: SQLIDao) : SQLIDao by iBaseDao {
override fun init(sqLiteDatabase: SQLiteDatabase, entityClass: Class): Boolean {
Log.i("数据库代理", "初始化数据库连接……")
val isInitSuccess = iBaseDao.init(sqLiteDatabase, entityClass)
diff --git a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/utils/V2XSQLiteUtils.java b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/utils/V2XSQLiteUtils.java
index 2cf7011f9a..a095b74273 100644
--- a/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/utils/V2XSQLiteUtils.java
+++ b/modules/mogo-module-v2x/src/main/java/com/mogo/module/v2x/utils/V2XSQLiteUtils.java
@@ -3,8 +3,8 @@ package com.mogo.module.v2x.utils;
import com.mogo.module.common.entity.V2XHistoryScenarioData;
import com.mogo.module.v2x.V2XConst;
import com.mogo.utils.logger.Logger;
-import com.mogo.utils.sqlite.BaseDaoFactory;
-import com.mogo.utils.sqlite.IBaseDao;
+import com.mogo.utils.sqlite.SQLDaoFactory;
+import com.mogo.utils.sqlite.SQLIDao;
import java.util.List;
@@ -17,16 +17,16 @@ public class V2XSQLiteUtils {
/**
* 场景数据管理
*/
- private static IBaseDao mScenarioHistoryDao;
+ private static SQLIDao mScenarioHistoryDao;
/**
* 场景数据管理
*/
- public static IBaseDao getScenarioHistoryDao() {
+ public static SQLIDao getScenarioHistoryDao() {
if (mScenarioHistoryDao == null) {
synchronized (V2XSQLiteUtils.class) {
if (mScenarioHistoryDao == null) {
- mScenarioHistoryDao = BaseDaoFactory.Companion.getInstance()
+ mScenarioHistoryDao = SQLDaoFactory.Companion.getInstance()
.getBaseDao(V2XUtils.getApp(), V2XHistoryScenarioData.class);
}
}
@@ -58,7 +58,7 @@ public class V2XSQLiteUtils {
* 查询当天的V2X数据
*/
public static List getScenarioHistoryData() {
- return getScenarioHistoryDao().query(new V2XHistoryScenarioData());
+ return getScenarioHistoryDao().query(new V2XHistoryScenarioData(), "triggerTime DESC");
}
}