Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法将Android数据存储IOException重命名为_Android_Ioexception_Android Jetpack_Datastore - Fatal编程技术网

无法将Android数据存储IOException重命名为

无法将Android数据存储IOException重命名为,android,ioexception,android-jetpack,datastore,Android,Ioexception,Android Jetpack,Datastore,我试图在我的项目中实现Jetpack数据存储。我使用的是apha-01版本,代码运行良好。然后我在Gradle文件中看到有一个新版本,所以我将其更新为alpha-03 启动应用程序后,我遇到了另一个问题。我发现在alpha-03版本中找不到Proto库,所以我回滚到版本alpha-01。此外,我还尝试了alpha-02。从那时起,我有以下错误: Process: com.montymobile.sands, PID: 19928 java.io.IOException: /data/u

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

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

 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)
我注意到发生这种情况是因为我一个接一个地保存了两个不同的键,每个键都在一个协程中。当我评论第二个动作时,它是有效的。 有人能解释为什么会这样吗?以及如何保存尽可能多的值

任何帮助都将不胜感激。

请检查以下代码

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)}"
        }
    }
}
class数据存储类(私有val上下文:上下文){
private fun dataStore():dataStore=context.createDataStore(“设置”)
暂停乐趣保存(键:首选项。键,值:T){
dataStore().edit{
它[键]=值
}
}
暂停趣味阅读(键:首选项。键,默认值:T):T{
val pre=dataStore().data.first()
返回前置[键]?:默认值
}
}
打开类BaseActivity:AppCompativity(){
内联fun getSavedValue(键:String,默认值:T):任意{
var savedValue=Any()
运行阻塞{
val操作=异步{
val savedStr=数据存储类(this@BaseActivity).读(优先顺序键),
默认值!!)。让我们{
信息技术
}
savedValue=savedStr
}
操作。等待()
}
返回savedValue
}
趣味saveDesiredValue(键:首选项。键,值:T){
运行阻塞{
协同路由示波器(Dispatchers.IO)。启动{
数据存储类(this@BaseActivity).保存(键、值)
}.join()
}
}
}
类MainActivity:BaseActivity(){
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val bnt=findViewById(R.id.btnSave)
val btnRead=findviewbyd(R.id.btnRead)
val key=findviewbyd(R.id.key)
val etValue=findViewById(R.id.etValue)
val值=findViewById(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(“测试”,0)}
}
}
}

我认为这个问题是由于最新数据存储保存文件的重命名版本造成的。 您可以尝试卸载应用程序并重新安装,这将删除所有相关数据存储文件并创建新文件

或者,您可以执行一个按钮来清除应用程序中的缓存(存储),然后拨打电话

dataStore.edit {
        it.clear()
    }

点击按钮。这将删除应用程序的所有预存数据,您可以在下次启动时重新创建这些数据。

我们如何清除数据存储?如果您的应用程序是基于登录/注销的应用程序,则删除文件/数据存储/您的数据存储\u file.preferences.pb文件。或者,如果您想更新调用saveDesiredValue(键“”),我的应用程序无法找到数据存储文件,我也有同样的问题。调用
clear
方法后,我会遇到此异常。你找到解决办法了吗?