Android数据存储区IOException无法重命名为 [英] Android Datastore IOException could not be renamed to

查看:100
本文介绍了Android数据存储区IOException无法重命名为的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在我的项目中实现Jetpack数据存储.我使用的是 apha-01 版本,该代码运行正常.然后我在Gradle文件中看到有一个新版本,所以我将其更新为 alpha-03 .

I am trying to implement Jetpack Datastore in my project. I was using the apha-01 version and the code was working fine. Then I saw in the Gradle file that there is a new version so I updated it to alpha-03.

启动我的应用程序后,我遇到了另一个问题.我发现在 alpha-03 版本中找不到Proto库,因此我回滚到了 alpha-01 版本.另外,我尝试了 alpha-02 .从那以后,我遇到了以下错误:

After starting my app, I encountered another issue. I found that Proto library is not found in the alpha-03 version so I rolled back to version alpha-01. Also, I tried alpha-02. Since then I am having the error below:

 Process: com.montymobile.sands, PID: 19928
    java.io.IOException: /data/user/0/com.montymobile.sands/files/datastore/sns_preferences.preferences_pb.tmp could not be renamed to /data/user/0/com.montymobile.sands/files/datastore/sns_preferences.preferences_pb
        at androidx.datastore.SingleProcessDataStore.writeData$datastore_core_release(SingleProcessDataStore.kt:304)
        at androidx.datastore.SingleProcessDataStore.transformAndWrite(SingleProcessDataStore.kt:282)
        at androidx.datastore.SingleProcessDataStore$actor$1.invokeSuspend(SingleProcessDataStore.kt:165)
        at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33)
        at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:56)
        at kotlinx.coroutines.scheduling.CoroutineScheduler.runSafely(CoroutineScheduler.kt:571)
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.executeTask(CoroutineScheduler.kt:738)
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.runWorker(CoroutineScheduler.kt:678)
        at kotlinx.coroutines.scheduling.CoroutineScheduler$Worker.run(CoroutineScheduler.kt:665)

我注意到发生这种情况是因为我要一个接一个地保存两个不同的密钥,每个密钥都存储在一个协程中.当我评论第二项操作时,它会起作用.谁能解释为什么会这样?以及如何保存尽可能多的值?

I noticed that this happens because I was saving two different key one after another, each in a coroutine. When i comment the 2nd action, it works. Can anyone explain why this happens? and how to save as many values as I Want?

任何帮助将不胜感激.

推荐答案

sime UI的屏幕截图检查以下代码.

class DataStoreClass(private val context: Context) {

    private fun dataStore(): DataStore<Preferences> = context.createDataStore("settings")

    suspend  fun <T> save(key: Preferences.Key<T>, value: T) {
        dataStore().edit {
            it[key] = value
        }
    }

    suspend fun <T> read(key: Preferences.Key<T>, defaultValue: T): T {
        val pre = dataStore().data.first()
        return pre[key] ?: defaultValue
    }

}

open class BaseActivity : AppCompatActivity() {

    inline fun <reified T> getSavedValue(key: String, defaultValue:T): Any {
         var savedValue = Any()
         runBlocking {
             val operation = async {
                 val savedStr = DataStoreClass(this@BaseActivity).read(preferencesKey(key),
                     defaultValue!!).let {
                     it
                 }
                 savedValue = savedStr
             }
             operation.await()
         }
         return savedValue
     }

    fun <T> saveDesiredValue(key: Preferences.Key<T>, value: T) {
        runBlocking {
            CoroutineScope(Dispatchers.IO).launch {
                DataStoreClass(this@BaseActivity).save(key, value)
            }.join()
        }
    }
}

class MainActivity : BaseActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val bnt = findViewById<Button>(R.id.btnSave)
        val btnRead = findViewById<Button>(R.id.btnRead)
        val key = findViewById<EditText>(R.id.key)
        val etValue = findViewById<EditText>(R.id.etValue)
        val value = findViewById<TextView>(R.id.value)

        bnt.setOnClickListener {
            saveDesiredValue(preferencesKey(key.text.toString()),etValue.text.toString())
            saveDesiredValue(preferencesKey("test"), Random.nextInt(100))

        }

        btnRead.setOnClickListener {
            value.text = "${getSavedValue(key.text.toString(),"")} " +
                    "${getSavedValue("test",0)}"
        }
    }
}

这篇关于Android数据存储区IOException无法重命名为的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆