From 8e9bd3bc5d4a35281f58d7d5a0a0ea5ba5f6ef38 Mon Sep 17 00:00:00 2001 From: xiaoyan Date: Mon, 24 Apr 2023 15:02:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=95=B0=E6=8D=AE=E5=AF=BC?= =?UTF-8?q?=E5=85=A5=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/omdb.config | 35 +++++++++++ .../main/java/com/navinfo/omqs/Constant.kt | 7 ++- .../com/navinfo/omqs/db/ImportOMDBHelper.kt | 61 +++++++++++++------ .../omqs/hilt/ImportOMDBHiltFactory.kt | 2 +- .../omqs/ui/activity/login/LoginViewModel.kt | 10 ++- .../personalcenter/PersonalCenterFragment.kt | 29 +++++---- .../personalcenter/PersonalCenterViewModel.kt | 36 ++--------- 7 files changed, 112 insertions(+), 68 deletions(-) create mode 100644 app/src/main/assets/omdb.config diff --git a/app/src/main/assets/omdb.config b/app/src/main/assets/omdb.config new file mode 100644 index 00000000..a6737381 --- /dev/null +++ b/app/src/main/assets/omdb.config @@ -0,0 +1,35 @@ +{ + "tables" : [ + { + "table": "OMDB_RD_LINK", + "code": 2001, + "name": "道路线" + }, + { + "table": "OMDB_RD_LINK_KIND", + "code": 2008, + "name": "道路种别" + }, + { + "table": "OMDB_RD_LINK_DIRECT", + "code": 2001, + "name": "道路方向" + }, + { + "table": "OMDB_SPEEDLIMIT_COND", + "code": 2001, + "name": "条件点限速" + }, + { + "table": "OMDB_SPEEDLIMIT_VAR", + "code": 2001, + "name": "可变点限速" + }, + { + "table": "OMDB_SPEEDLIMIT", + "code": 2001, + "name": "常规点限速" + } + + ] +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/Constant.kt b/app/src/main/java/com/navinfo/omqs/Constant.kt index 6612fdc2..bed0d809 100644 --- a/app/src/main/java/com/navinfo/omqs/Constant.kt +++ b/app/src/main/java/com/navinfo/omqs/Constant.kt @@ -19,6 +19,11 @@ class Constant { */ lateinit var DATA_PATH: String + /** + * 当前用户ID + */ + lateinit var CURRENT_USER_ID: String + /** * 离线地图目录 */ @@ -36,7 +41,7 @@ class Constant { const val message_version_right_off = "1" //立即发送 const val MESSAGE_PAGE_SIZE = 30 //消息列表一页最多数量 - lateinit var realm: Realm + const val OMDB_CONFIG = "omdb.config" } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt index adef0eaa..666679c0 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt @@ -11,11 +11,13 @@ import com.blankj.utilcode.util.ZipUtils import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.navinfo.collect.library.data.entity.RenderEntity +import com.navinfo.omqs.Constant import com.navinfo.omqs.bean.ImportConfig import com.navinfo.omqs.hilt.ImportOMDBHiltFactory import com.navinfo.omqs.hilt.OMDBDataBaseHiltFactory import dagger.assisted.Assisted import dagger.assisted.AssistedInject +import io.realm.Realm import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow @@ -28,13 +30,13 @@ import kotlin.streams.toList /** * 导入omdb数据的帮助类 * */ -class ImportOMDBHelper @AssistedInject constructor(@Assisted("context") val context: Context,@Assisted("omdbFile") val omdbFile: File,@Assisted("configFile") val configFile: File) { +class ImportOMDBHelper @AssistedInject constructor(@Assisted("context") val context: Context,@Assisted("omdbFile") val omdbFile: File) { @Inject lateinit var omdbHiltFactory: OMDBDataBaseHiltFactory @Inject lateinit var gson: Gson private val database by lazy { omdbHiltFactory.obtainOmdbDataBaseHelper(context, omdbFile.absolutePath, 1).writableDatabase } - + private val configFile: File = File("${Constant.DATA_PATH}/${Constant.CURRENT_USER_ID}", Constant.OMDB_CONFIG) /** * 读取config的配置文件 @@ -99,10 +101,10 @@ class ImportOMDBHelper @AssistedInject constructor(@Assisted("context") val cont * @param omdbZipFile omdb数据抽取生成的Zip文件 * @param configFile 对应的配置文件 * */ - suspend fun importOmdbZipFile(omdbZipFile: File): Flow>> = withContext(Dispatchers.IO) { + suspend fun importOmdbZipFile(omdbZipFile: File): Flow = withContext(Dispatchers.IO) { val importConfig = openConfigFile() val unZipFolder = File(omdbZipFile.parentFile, "result") - flow>> { + flow { if (unZipFolder.exists()) { unZipFolder.deleteRecursively() } @@ -110,26 +112,45 @@ class ImportOMDBHelper @AssistedInject constructor(@Assisted("context") val cont // 开始解压zip文件 val unZipFiles = ZipUtils.unzipFile(omdbZipFile, unZipFolder) // 遍历解压后的文件,读取该数据返回 - for (txtFile in unZipFiles) { - val listResult: MutableList> = mutableListOf() - // 根据文件名称获取对应的配置 - val currentConfig=importConfig.tables.find { - txtFile.name.substring(0, txtFile.name.lastIndexOf("."))==it.table + for ((index, currentConfig) in importConfig.tables.withIndex()) { + val txtFile = unZipFiles.find { + it.name == currentConfig.table } - val list = FileIOUtils.readFile2List(txtFile, "UTF-8") - // 将list数据转换为map - for (line in list) { - val map = gson.fromJson>(line, object : TypeToken>() {}.type) - .toMutableMap() - currentConfig?.let { - map["QItable"] = currentConfig.table - map["QIname"] = currentConfig.name - map["QIcode"] = currentConfig.code - listResult.add(map) + + val listResult: MutableList> = mutableListOf() + currentConfig?.let { + val list = FileIOUtils.readFile2List(txtFile, "UTF-8") + if (list!=null) { + // 将list数据转换为map + for (line in list) { + val map = gson.fromJson>(line, object : TypeToken>() {}.type) + .toMutableMap() + map["QItable"] = currentConfig.table + map["QIname"] = currentConfig.name + map["QIcode"] = currentConfig.code + listResult.add(map) + } } } + // 将listResult数据插入到Realm数据库中 + Realm.getDefaultInstance().beginTransaction() + for (map in listResult) { // 每一个map就是Realm的一条数据 + // 先查询这个mesh下有没有数据,如果有则跳过即可 +// val meshEntity = Realm.getDefaultInstance().where(RenderEntity::class.java).equalTo("properties['mesh']", map["mesh"].toString()).findFirst() + val renderEntity = RenderEntity() + renderEntity.code = map["QIcode"].toString().toInt() + renderEntity.name = map["QIname"].toString() + renderEntity.table = map["QItable"].toString() + // 其他数据插入到Properties中 + renderEntity.geometry = map["geometry"].toString() + for (entry in map) { + renderEntity.properties[entry.key] = entry.value.toString() + } + Realm.getDefaultInstance().insert(renderEntity) + } + Realm.getDefaultInstance().commitTransaction() // 1个文件发送一次flow流 - emit(listResult) + emit("${index+1}/${importConfig.tables.size}") } } } diff --git a/app/src/main/java/com/navinfo/omqs/hilt/ImportOMDBHiltFactory.kt b/app/src/main/java/com/navinfo/omqs/hilt/ImportOMDBHiltFactory.kt index 5f3ff4fd..a1036dc0 100644 --- a/app/src/main/java/com/navinfo/omqs/hilt/ImportOMDBHiltFactory.kt +++ b/app/src/main/java/com/navinfo/omqs/hilt/ImportOMDBHiltFactory.kt @@ -8,5 +8,5 @@ import java.io.File @AssistedFactory interface ImportOMDBHiltFactory { - fun obtainImportOMDBHelper(@Assisted("context")context: Context, @Assisted("omdbFile") omdbFile: File, @Assisted("configFile") dbVersion: File): ImportOMDBHelper + fun obtainImportOMDBHelper(@Assisted("context")context: Context, @Assisted("omdbFile") omdbFile: File): ImportOMDBHelper } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt index da6ccc0e..20bb6afb 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt @@ -7,6 +7,7 @@ import android.widget.Toast import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.blankj.utilcode.util.ResourceUtils import com.navinfo.omqs.Constant import com.navinfo.omqs.bean.LoginUserBean import com.navinfo.omqs.db.RoomAppDatabase @@ -156,19 +157,26 @@ class LoginViewModel @Inject constructor( @Throws(IOException::class) private fun createUserFolder(context: Context, userId: String) { // 在SD卡创建用户目录,解压资源等 + val userFolder = File("${Constant.DATA_PATH}/${userId}") + Constant.CURRENT_USER_ID = userId // 初始化Realm Realm.init(context.applicationContext) val password = "encryp".encodeToByteArray().copyInto(ByteArray(64)) // 656e6372797000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 Log.d("OMQSApplication", "密码是: ${byteArrayToHexString(password)}") val config = RealmConfiguration.Builder() - .directory(File("${Constant.DATA_PATH}/${userId}")) + .directory(userFolder) .name("OMQS.realm") .encryptionKey(password) // .modules(Realm.getDefaultModule(), MyRealmModule()) .schemaVersion(1) .build() Realm.setDefaultConfiguration(config) + // 拷贝配置文件到用户目录下 + val omdbConfigFile = File(userFolder.absolutePath, Constant.OMDB_CONFIG); + if (!omdbConfigFile.exists()) { + ResourceUtils.copyFileFromAssets(Constant.OMDB_CONFIG, omdbConfigFile.absolutePath) + } } /** diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt index e6c34221..b39d5cc0 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt @@ -77,15 +77,14 @@ class PersonalCenterFragment : BaseFragment(), FSAFActivityCallbacks { val file = UriUtils.uri2File(uri) // 开始导入数据 // 656e6372797000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 - val job = CoroutineUtils.launchWithLoading( + CoroutineUtils.launchWithLoading( requireContext(), loadingMessage = "生成数据..." ) { val importOMDBHelper: ImportOMDBHelper = importOMDBHiltFactory.obtainImportOMDBHelper( requireContext(), - file, - File(file.parentFile, "config.json") + file ) viewModel.obtainOMDBZipData(importOMDBHelper) } @@ -99,19 +98,19 @@ class PersonalCenterFragment : BaseFragment(), FSAFActivityCallbacks { override fun onResult(uri: Uri) { val file = UriUtils.uri2File(uri) - // 开始导入数据 - CoroutineUtils.launchWithLoading( - requireContext(), - loadingMessage = "导入数据..." - ) { - val importOMDBHelper: ImportOMDBHelper = - importOMDBHiltFactory.obtainImportOMDBHelper( - requireContext(), - file, - File(file.parentFile, "config.json") - ) + val importOMDBHelper: ImportOMDBHelper = + importOMDBHiltFactory.obtainImportOMDBHelper( + requireContext(), + file + ) viewModel.importOMDBData(importOMDBHelper) - } +// // 开始导入数据 +// CoroutineUtils.launchWithLoading( +// requireContext(), +// loadingMessage = "导入数据..." +// ) { +// +// } } }) } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterViewModel.kt index 3f1cd13c..19106b80 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterViewModel.kt @@ -136,39 +136,15 @@ class PersonalCenterViewModel @Inject constructor( /** * 导入OMDB数据 * */ - suspend fun importOMDBData(importOMDBHelper: ImportOMDBHelper) { - Log.d("OMQSApplication", "开始导入数据") -// Realm.getDefaultInstance().beginTransaction() - importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile).collect { - Realm.getDefaultInstance().beginTransaction() - for (map in it) { // 每一个map就是Realm的一条数据 - val renderEntity = RenderEntity() - renderEntity.code = map["QIcode"].toString().toInt() - renderEntity.name = map["QIname"].toString() - renderEntity.table = map["QItable"].toString() - // 其他数据插入到Properties中 - renderEntity.geometry = map["GEOMETRY"].toString() - for (entry in map) { - renderEntity.properties[entry.key] = entry.value.toString() - } - Realm.getDefaultInstance().insert(renderEntity) + fun importOMDBData(importOMDBHelper: ImportOMDBHelper) { + viewModelScope.launch(Dispatchers.IO) { + Log.d("OMQSApplication", "开始导入数据") + importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile).collect { + Log.d("importOMDBData", it) } - Realm.getDefaultInstance().commitTransaction() + Log.d("OMQSApplication", "导入数据完成") } -// Realm.getDefaultInstance().commitTransaction() -// val gson = Gson() -// // 数据导入结束后,开始生成渲染表所需的json文件,并生成压缩包 -// for (table in importOMDBHelper.openConfigFile().tables/*listOf("HAD_LINK")*/) { -// val omdbList = Realm.getDefaultInstance().where(OMDBEntity::class.java).equalTo("table", table.table).findAll() -// val outputFile = File(importOMDBHelper.omdbFile, "${table.table}.txt") -// // 将读取到的数据转换为json数据文件 -// for (omdb in omdbList) { -// FileIOUtils.writeFileFromString(outputFile, gson.toJson(omdb)) -// } -// } - - Log.d("OMQSApplication", "导入数据完成") } fun importScProblemData(uri: Uri) {