修改数据导入功能

This commit is contained in:
xiaoyan 2023-04-24 15:02:48 +08:00
parent e3a9b09aa2
commit 8e9bd3bc5d
7 changed files with 112 additions and 68 deletions

View File

@ -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": "常规点限速"
}
]
}

View File

@ -19,6 +19,11 @@ class Constant {
*/ */
lateinit var DATA_PATH: String 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_version_right_off = "1" //立即发送
const val MESSAGE_PAGE_SIZE = 30 //消息列表一页最多数量 const val MESSAGE_PAGE_SIZE = 30 //消息列表一页最多数量
lateinit var realm: Realm const val OMDB_CONFIG = "omdb.config"
} }
} }

View File

@ -11,11 +11,13 @@ import com.blankj.utilcode.util.ZipUtils
import com.google.gson.Gson import com.google.gson.Gson
import com.google.gson.reflect.TypeToken import com.google.gson.reflect.TypeToken
import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.collect.library.data.entity.RenderEntity
import com.navinfo.omqs.Constant
import com.navinfo.omqs.bean.ImportConfig import com.navinfo.omqs.bean.ImportConfig
import com.navinfo.omqs.hilt.ImportOMDBHiltFactory import com.navinfo.omqs.hilt.ImportOMDBHiltFactory
import com.navinfo.omqs.hilt.OMDBDataBaseHiltFactory import com.navinfo.omqs.hilt.OMDBDataBaseHiltFactory
import dagger.assisted.Assisted import dagger.assisted.Assisted
import dagger.assisted.AssistedInject import dagger.assisted.AssistedInject
import io.realm.Realm
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flow
@ -28,13 +30,13 @@ import kotlin.streams.toList
/** /**
* 导入omdb数据的帮助类 * 导入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 @Inject
lateinit var omdbHiltFactory: OMDBDataBaseHiltFactory lateinit var omdbHiltFactory: OMDBDataBaseHiltFactory
@Inject @Inject
lateinit var gson: Gson lateinit var gson: Gson
private val database by lazy { omdbHiltFactory.obtainOmdbDataBaseHelper(context, omdbFile.absolutePath, 1).writableDatabase } 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的配置文件 * 读取config的配置文件
@ -99,10 +101,10 @@ class ImportOMDBHelper @AssistedInject constructor(@Assisted("context") val cont
* @param omdbZipFile omdb数据抽取生成的Zip文件 * @param omdbZipFile omdb数据抽取生成的Zip文件
* @param configFile 对应的配置文件 * @param configFile 对应的配置文件
* */ * */
suspend fun importOmdbZipFile(omdbZipFile: File): Flow<List<Map<String, Any>>> = withContext(Dispatchers.IO) { suspend fun importOmdbZipFile(omdbZipFile: File): Flow<String> = withContext(Dispatchers.IO) {
val importConfig = openConfigFile() val importConfig = openConfigFile()
val unZipFolder = File(omdbZipFile.parentFile, "result") val unZipFolder = File(omdbZipFile.parentFile, "result")
flow<List<Map<String, Any>>> { flow<String> {
if (unZipFolder.exists()) { if (unZipFolder.exists()) {
unZipFolder.deleteRecursively() unZipFolder.deleteRecursively()
} }
@ -110,26 +112,45 @@ class ImportOMDBHelper @AssistedInject constructor(@Assisted("context") val cont
// 开始解压zip文件 // 开始解压zip文件
val unZipFiles = ZipUtils.unzipFile(omdbZipFile, unZipFolder) val unZipFiles = ZipUtils.unzipFile(omdbZipFile, unZipFolder)
// 遍历解压后的文件,读取该数据返回 // 遍历解压后的文件,读取该数据返回
for (txtFile in unZipFiles) { for ((index, currentConfig) in importConfig.tables.withIndex()) {
val listResult: MutableList<Map<String, Any>> = mutableListOf() val txtFile = unZipFiles.find {
// 根据文件名称获取对应的配置 it.name == currentConfig.table
val currentConfig=importConfig.tables.find {
txtFile.name.substring(0, txtFile.name.lastIndexOf("."))==it.table
} }
val listResult: MutableList<Map<String, Any>> = mutableListOf()
currentConfig?.let {
val list = FileIOUtils.readFile2List(txtFile, "UTF-8") val list = FileIOUtils.readFile2List(txtFile, "UTF-8")
if (list!=null) {
// 将list数据转换为map // 将list数据转换为map
for (line in list) { for (line in list) {
val map = gson.fromJson<Map<String, Any>>(line, object : TypeToken<MutableMap<String, Any>>() {}.type) val map = gson.fromJson<Map<String, Any>>(line, object : TypeToken<MutableMap<String, Any>>() {}.type)
.toMutableMap() .toMutableMap()
currentConfig?.let {
map["QItable"] = currentConfig.table map["QItable"] = currentConfig.table
map["QIname"] = currentConfig.name map["QIname"] = currentConfig.name
map["QIcode"] = currentConfig.code map["QIcode"] = currentConfig.code
listResult.add(map) 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流 // 1个文件发送一次flow流
emit(listResult) emit("${index+1}/${importConfig.tables.size}")
} }
} }
} }

View File

@ -8,5 +8,5 @@ import java.io.File
@AssistedFactory @AssistedFactory
interface ImportOMDBHiltFactory { 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
} }

View File

@ -7,6 +7,7 @@ import android.widget.Toast
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.blankj.utilcode.util.ResourceUtils
import com.navinfo.omqs.Constant import com.navinfo.omqs.Constant
import com.navinfo.omqs.bean.LoginUserBean import com.navinfo.omqs.bean.LoginUserBean
import com.navinfo.omqs.db.RoomAppDatabase import com.navinfo.omqs.db.RoomAppDatabase
@ -156,19 +157,26 @@ class LoginViewModel @Inject constructor(
@Throws(IOException::class) @Throws(IOException::class)
private fun createUserFolder(context: Context, userId: String) { private fun createUserFolder(context: Context, userId: String) {
// 在SD卡创建用户目录解压资源等 // 在SD卡创建用户目录解压资源等
val userFolder = File("${Constant.DATA_PATH}/${userId}")
Constant.CURRENT_USER_ID = userId
// 初始化Realm // 初始化Realm
Realm.init(context.applicationContext) Realm.init(context.applicationContext)
val password = "encryp".encodeToByteArray().copyInto(ByteArray(64)) val password = "encryp".encodeToByteArray().copyInto(ByteArray(64))
// 656e6372797000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 // 656e6372797000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
Log.d("OMQSApplication", "密码是: ${byteArrayToHexString(password)}") Log.d("OMQSApplication", "密码是: ${byteArrayToHexString(password)}")
val config = RealmConfiguration.Builder() val config = RealmConfiguration.Builder()
.directory(File("${Constant.DATA_PATH}/${userId}")) .directory(userFolder)
.name("OMQS.realm") .name("OMQS.realm")
.encryptionKey(password) .encryptionKey(password)
// .modules(Realm.getDefaultModule(), MyRealmModule()) // .modules(Realm.getDefaultModule(), MyRealmModule())
.schemaVersion(1) .schemaVersion(1)
.build() .build()
Realm.setDefaultConfiguration(config) Realm.setDefaultConfiguration(config)
// 拷贝配置文件到用户目录下
val omdbConfigFile = File(userFolder.absolutePath, Constant.OMDB_CONFIG);
if (!omdbConfigFile.exists()) {
ResourceUtils.copyFileFromAssets(Constant.OMDB_CONFIG, omdbConfigFile.absolutePath)
}
} }
/** /**

View File

@ -77,15 +77,14 @@ class PersonalCenterFragment : BaseFragment(), FSAFActivityCallbacks {
val file = UriUtils.uri2File(uri) val file = UriUtils.uri2File(uri)
// 开始导入数据 // 开始导入数据
// 656e6372797000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 // 656e6372797000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
val job = CoroutineUtils.launchWithLoading( CoroutineUtils.launchWithLoading(
requireContext(), requireContext(),
loadingMessage = "生成数据..." loadingMessage = "生成数据..."
) { ) {
val importOMDBHelper: ImportOMDBHelper = val importOMDBHelper: ImportOMDBHelper =
importOMDBHiltFactory.obtainImportOMDBHelper( importOMDBHiltFactory.obtainImportOMDBHelper(
requireContext(), requireContext(),
file, file
File(file.parentFile, "config.json")
) )
viewModel.obtainOMDBZipData(importOMDBHelper) viewModel.obtainOMDBZipData(importOMDBHelper)
} }
@ -99,19 +98,19 @@ class PersonalCenterFragment : BaseFragment(), FSAFActivityCallbacks {
override fun onResult(uri: Uri) { override fun onResult(uri: Uri) {
val file = UriUtils.uri2File(uri) val file = UriUtils.uri2File(uri)
// 开始导入数据
CoroutineUtils.launchWithLoading(
requireContext(),
loadingMessage = "导入数据..."
) {
val importOMDBHelper: ImportOMDBHelper = val importOMDBHelper: ImportOMDBHelper =
importOMDBHiltFactory.obtainImportOMDBHelper( importOMDBHiltFactory.obtainImportOMDBHelper(
requireContext(), requireContext(),
file, file
File(file.parentFile, "config.json")
) )
viewModel.importOMDBData(importOMDBHelper) viewModel.importOMDBData(importOMDBHelper)
} // // 开始导入数据
// CoroutineUtils.launchWithLoading(
// requireContext(),
// loadingMessage = "导入数据..."
// ) {
//
// }
} }
}) })
} }

View File

@ -136,41 +136,17 @@ class PersonalCenterViewModel @Inject constructor(
/** /**
* 导入OMDB数据 * 导入OMDB数据
* */ * */
suspend fun importOMDBData(importOMDBHelper: ImportOMDBHelper) { fun importOMDBData(importOMDBHelper: ImportOMDBHelper) {
viewModelScope.launch(Dispatchers.IO) {
Log.d("OMQSApplication", "开始导入数据") Log.d("OMQSApplication", "开始导入数据")
// Realm.getDefaultInstance().beginTransaction()
importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile).collect { importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile).collect {
Realm.getDefaultInstance().beginTransaction() Log.d("importOMDBData", it)
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)
}
Realm.getDefaultInstance().commitTransaction()
}
// Realm.getDefaultInstance().commitTransaction()
// val gson = Gson()
// // 数据导入结束后开始生成渲染表所需的json文件并生成压缩包
// for (table in importOMDBHelper.openConfigFile().tables/*listOf<String>("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", "导入数据完成") Log.d("OMQSApplication", "导入数据完成")
} }
}
fun importScProblemData(uri: Uri) { fun importScProblemData(uri: Uri) {
viewModelScope.launch(Dispatchers.IO) { viewModelScope.launch(Dispatchers.IO) {
try { try {