存储当前数据

问题描述 投票:0回答:1

所有数据均来自服务器批量。我无法影响它的音量。因此,为了减少请求数量,我将此数据存储在单个 ViewModel 中,并在所有屏幕上共享。我知道这不是很有效。但我还没有其他想法。展望未来,我想警告您,由于可能会从其他设备更改这些数据,因此将这些数据存储在 DataStore 或 Room 中是没有意义的。因此,当在屏幕之间切换时,我会创建数据的副本并过滤数据以将其显示在屏幕上。

rooms.filter { it.id == roomId }

也许使用 Room 作为缓存?每次启动时都更新其中的数据吗?忘记添加 - 目标操作系统是 WearOS。

android kotlin viewmodel android-viewmodel
1个回答
0
投票

无需使用

DataStore
Room
。您可以使用
Repository pattern

在此,您只需将数据存储在存储库中,然后您就可以在整个应用程序中使用它,但是当您终止应用程序时,它不会保留数据,您必须在每次应用程序启动时获取数据。

这是解释存储库模式的图像。

enter image description here

这是一个实现它的简短示例,您可以根据您的要求使用它。

存储库:

class UserRepository {
    private val users = mutableListOf<User>()

    fun addUser(user: User) {
        users.add(user)
    }

    fun addAllUsers(userList: List<User>) {
        users.clear() // Clear existing data if needed
        users.addAll(userList)
    }

    fun getAllUsers(): List<User> = users
}

视图模型:

class UserViewModel(private val repository: UserRepository) : ViewModel() {
    private val _users = MutableLiveData<List<User>>()
    val users: LiveData<List<User>> get() = _users

    fun loadUsers() {
        _users.value = repository.getAllUsers()
    }

    fun addUser(user: User) {
        repository.addUser(user)
        loadUsers()  // Refresh the user list
    }

    fun storeFetchedUsers(fetchedUsers: List<User>) {
        repository.addAllUsers(fetchedUsers)
        loadUsers()  // Refresh the user list
    }
}

在Activity/Fragment中的用法:

class MainActivity : AppCompatActivity() {
    private val userRepository = UserRepository()
    private val viewModel: UserViewModel by viewModels { ViewModelFactory(userRepository) }

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

        // Simulate fetching data from an API
        val fetchedUsers = listOf(User(1, "John Doe"), User(2, "Jane Smith"))
        viewModel.storeFetchedUsers(fetchedUsers)  // Store the fetched users

        viewModel.users.observe(this) { users -> 
            // Update UI with user data
        }
    }
}

© www.soinside.com 2019 - 2024. All rights reserved.