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

2024-01-02

我正在尝试在我的项目中实现 Jetpack Datastore。我当时用的是apha-01版本和代码工作正常。然后我在Gradle文件中看到有新版本所以我将其更新为alpha-03.

启动我的应用程序后,我遇到了另一个问题。我发现Proto库中没有找到alpha-03版本所以我回滚到版本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)

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

任何帮助,将不胜感激。


同一 UI 的屏幕截图 https://i.stack.imgur.com/Sysyr.jpg检查以下代码。

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)}"
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 数据存储 IOException 无法重命名为 的相关文章

随机推荐

  • 如何在 PWA 中更改 Android 导航栏颜色?

    当我在 Android 主屏幕 渐进式 Web 应用程序 上添加页面时 我想更改 Web 上 Android 导航栏的颜色 但是当我打开 PWA 时 Android 导航栏的颜色为黑色 我想要更改颜色为白色 在清单中 您可以更改主题的颜色
  • 无法使用 MPMusicPlayerMediaItemQueueDescriptor 设置 MPMusicPlayerController 队列

    此代码导致沉默 let query MPMediaQuery songs let result query items guard let items result items count gt 0 else return let song
  • React 组件交互和全局状态变化

    我对 React 很陌生 只是尝试一下 我想知道有哪些常见模式或用于处理组件之间通信的内置库 例如 我有一个输入组件和一个 列表 组件 该组件根据输入控制器中的内容从服务器进行更新 想想一个自动完成框 既然组件有表示逻辑 那么如果两者不能
  • 错误消息“操作正在进行中”是什么意思?

    当尝试使用以下命令打开文件时 fd fopen majestic files majestic record txt w 我收到以下错误消息 b Warning b fopen majestic files majestic record
  • 发生数据库错误错误号:1062

    我尝试使用 sql 为我的 CI 执行一次更新三个表的选项 但为什么它仍然错误 这是错误警告 A Database Error Occurred Error Number 1062 Duplicate entry 0 for key 1 U
  • 如何在java中重复播放音频文件

    我怎样才能让音频文件连续重复 现在音乐只播放一次 仅此而已 我试图让声音一遍又一遍地重复 我必须以其他方式获取音频文件还是有更简单的方法 Code import java io File import java io FileInputSt
  • Python 的 itertools.repeat 的目的是什么?

    对于我能想到的 Python 的每一种用途itertools repeat http docs python org py3k library itertools html highlight repeat itertools repeat
  • 如何让 Eclipse Oxygen 在 Java 9 上运行

    我拼命尝试让 Eclipse Oxygen 在 Mac OSX 上运行 Java 9 但似乎失败了 到目前为止我已经完成的步骤 在 Library Java JavaVirtualMachines jdk 9 jdk 中安装了 Java 9
  • Firebase 更新正在制作新的,除了最后一个字符外具有相同的 id

    我正在使用此代码来更新 Firebase 上的数据 但它会生成新的数据 我尝试了很多代码 除了最后一个字符之外 它使用相同的密钥制作新的代码 我按照 Firebase 网站的推荐使用了这个 但它不起作用 我创建了一个新的 下次更新时 Map
  • 检查 Bash 列表中是否存在变量

    我正在尝试在 bash 中编写一个脚本来检查用户输入的有效性 我想匹配输入 比如变量x 到有效值列表 我现在想出的是 for item in list do if x item then echo In the list exit fi d
  • iPad Safari (iOS 5.0.1) 上的 iframe CSS3 缩放问题

    我需要放大 iframe 以使其更大 我无法控制 iframe 内容的源代码 我正在尝试通过以下方式实现它 webkit transform scale 1 3 CSS 属性 iframe 的内容已正确放大 但是当我尝试触摸 iframe
  • Azure Functions DocumentClient 无法从程序集异常加载类型

    我有一个 Azure Function v2 它调用一个实用程序库 该库又实例化一个DocumentClient 当在本地运行我的函数时 它会在此行引发异常 client new DocumentClient new Uri cosmosD
  • 响应开头额外的未定义字符[重复]

    这个问题在这里已经有答案了 这阻止了我使用 JSON 也阻止了使用 React 或 Ember 使用 AJAX 向服务器发送请求时 我收到一个额外的未定义 unicode 字符 这会导致解析器错误 因为它破坏了 JSON 我已经检查了我拥有
  • 自动将公共更改为私有(Java)

    我正在对从其他语言翻译成 Java 的代码进行重构 我想自动完成它 我的问题是 我有很多不是私有的方法 但只是在声明它们的同一个类中调用 并且我想将它们设为私有 我有很多课程 我想是否有什么可以帮助我半自动地完成它 我想知道 你知道我是否可
  • .NET 中的并行抓取

    我工作的公司运营着数百个非常活跃的网站 它决定建立一个搜索引擎 我的任务是编写爬虫 一些网站在旧硬件上运行 无法承受太多惩罚 而另一些网站则可以处理大量并发用户 我需要能够说对站点 A 使用 5 个并行请求 对站点 B 使用 2 个并行请求
  • vtkRenderer 错误

    我是 vtk 的新手 所以我首先使用 CMake 和 Visual Studio 2017 构建 vtk 8 1 1 并使用默认选项和示例 许多示例运行良好 但其中一些会出现错误 这是 CreateTree 示例 但 HelloWorld
  • 无法使用 Gradle 6.1.1 解析 junit-jupiter-params:5.6.2 和 junit-jupiter-engine:5.6.2

    我有一个 Android 项目 其中包含 2 个 Android 模块和 1 个纯 Java 模块 将 android 构建工具更新为 com android tools build gradle 4 0 0 并将 gradle 包装器更新
  • 使用 OAuth2 将 JHipster 中的前端和 API 服务器分开不起作用

    我使用 OAuth2 创建了一个简单的 JHipster 6 2 0 Angular 应用程序 并且还单独生成了一个客户端应用程序 此外 我使用 keycloak yml 为 Keycloak 创建了一个 docker JHipster 附
  • 使用 for 循环在 ggplot2 中添加图层

    我想这很容易 但我不明白 它与 ggplots 上 for 循环的使用有关 问题是 为什么下面这两个代码给出不同的结果 看起来好像在带有循环的代码上 只考虑了第二次迭代 但我不知道为什么 根本问题是 是否可以使用 ggplot2 对象运行此
  • Android 数据存储 IOException 无法重命名为

    我正在尝试在我的项目中实现 Jetpack Datastore 我当时用的是apha 01版本和代码工作正常 然后我在Gradle文件中看到有新版本所以我将其更新为alpha 03 启动我的应用程序后 我遇到了另一个问题 我发现Proto库