第8天:数据存储-补充材料——MainActivity.kt解读

下面是对“第8天:数据存储”该文学习的更深层次的补充材料,对 MainActivity.kt 文件的理解。
下面对`MainActivity.kt’ 文件中每一行进行详细解释:

package com.example.datastoragedemo

这行指定了代码的包名,通常对应于项目的目录结构。

import android.content.SharedPreferences
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.room.Room
import androidx.viewbinding.ViewBinding
import com.example.datastoragedemo.databinding.ActivityMainBinding // 导入生成的Binding类
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking

这里导入了需要的类和库,包括SharedPreferences(用于存储偏好设置)、Bundle(用于活动状态)、AppCompatActivity(支持兼容的活动)、Room(用于数据库操作)以及ViewBinding(简化视图访问)。还导入了协程库,用于处理异步任务。

class MainActivity : AppCompatActivity() {

定义了一个MainActivity类,继承自AppCompatActivity,这是Android活动的基础类。

    private lateinit var binding: ActivityMainBinding // 声明View Binding变量

声明一个ActivityMainBinding类型的变量binding,使用lateinit,表示稍后初始化。

    private lateinit var sharedPreferences: SharedPreferences
    private lateinit var userDao: UserDao

声明SharedPreferencesUserDao的变量,分别用于访问用户偏好设置和数据库操作。

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

重写onCreate方法,这是活动创建时调用的方法。调用super.onCreate以确保父类正确初始化。

        // 使用View Binding
        binding = ActivityMainBinding.inflate(layoutInflater)
        setContentView(binding.root)

通过ActivityMainBinding.inflate方法初始化binding,然后将布局设置为binding.root,这使得可以通过binding直接访问视图。

        sharedPreferences = getSharedPreferences("user_prefs", MODE_PRIVATE)

初始化sharedPreferences,以获取名为user_prefs的共享偏好设置,使用私有模式存储。

        userDao = UserDatabase.getDatabase(applicationContext).userDao()

通过UserDatabase获取数据库实例,并获取userDao以执行数据库操作。

        binding.buttonSave.setOnClickListener { // 使用Binding访问视图
            saveToSharedPreferences()
        }

buttonSave设置点击事件监听器,点击时调用saveToSharedPreferences方法。

        binding.buttonRoom.setOnClickListener {
            saveToRoom()
        }

buttonRoom设置点击事件监听器,点击时调用saveToRoom方法。

    private fun saveToSharedPreferences() {
        val username = binding.editTextUsername.text.toString()
        val age = binding.editTextAge.text.toString().toIntOrNull() ?: 0

定义saveToSharedPreferences方法,从EditText中获取用户名和年龄。toIntOrNull()将字符串转换为整数,如果转换失败则使用默认值0。

        val editor = sharedPreferences.edit()
        editor.putString("username", username)
        editor.putInt("age", age)
        editor.apply()

获取SharedPreferences.Editor实例,通过putStringputInt方法保存用户名和年龄,最后调用apply()异步保存数据。

        displayData()
    }

调用displayData方法,显示已存储的数据。

    private fun saveToRoom() {
        val username = binding.editTextUsername.text.toString()
        val age = binding.editTextAge.text.toString().toIntOrNull() ?: 0

定义saveToRoom方法,同样从EditText中获取用户名和年龄。

        CoroutineScope(Dispatchers.IO).launch {
            userDao.insert(User(name = username, age = age))
            displayDataFromRoom()
        }

使用CoroutineScope在IO线程中启动协程,插入用户数据到数据库,并调用displayDataFromRoom方法。

    private fun displayData() {
        // 获取所有存储的数据
        val allPrefs = sharedPreferences.all
        val userText = StringBuilder()

定义displayData方法,获取所有存储的共享偏好设置,并初始化一个StringBuilder用于格式化输出。

        allPrefs.forEach { (key, value) ->
            userText.append("$key: $value\n") // 格式化输出
        }

遍历所有偏好设置,通过append方法将每对键值对格式化为字符串并添加到userText中。

        binding.textViewOutput.text = "SharedPreferences:\n$userText"
    }

将格式化后的字符串显示在textViewOutput中。

    private fun displayDataFromRoom() {
        CoroutineScope(Dispatchers.IO).launch {
            val users = userDao.getAllUsers()
            val userText = users.joinToString { "${it.name}, Age: ${it.age}" }

定义displayDataFromRoom方法,在IO线程中启动协程,获取所有用户数据,并使用joinToString将用户名称和年龄格式化为字符串。

            runOnUiThread {
                binding.textViewOutput.text = "Room Data:\n$userText"
            }
        }
    }
}

使用runOnUiThread将结果更新到UI线程中,显示Room中的用户数据在textViewOutput中。

这个代码实现了通过SharedPreferencesRoom来存储和展示用户数据的功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值