Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/200.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 存储在Room table中的设置只有一个条目,在任何参数更新时都会触发所有观察者_Android_Android Room_Android Livedata - Fatal编程技术网

Android 存储在Room table中的设置只有一个条目,在任何参数更新时都会触发所有观察者

Android 存储在Room table中的设置只有一个条目,在任何参数更新时都会触发所有观察者,android,android-room,android-livedata,Android,Android Room,Android Livedata,我使用简单的房间桌子进行设置 @Entity data class Settings(var user: String = "") { @PrimaryKey var id: Long = 1 var activeItem: Int = 0 var developerMode: Boolean = false var logoUrl: String = "" var advertisment: String = "" } 我用LiveData观

我使用简单的房间桌子进行设置

@Entity
data class Settings(var user: String = "") {
    @PrimaryKey
    var id: Long = 1

    var activeItem: Int = 0
    var developerMode: Boolean = false
    var logoUrl: String = ""
    var advertisment: String = ""
}
我用LiveData观察表中的变化。问题是,若所有数据都在一个id=1的条目中,那个么当表中的任何值被更新时,所有观察者都会被触发。有没有办法强迫LiveData仅在参数更改时观察,而不是整个条目? 我不想通过附加表来解决它,也不想将它存储在具有不同ID的条目中

以下是来自Dao的查询:

@Query("SELECT activeItem FROM Settings WHERE id = 1")
abstract fun getActiveItem(): LiveData<Int>

@Query("SELECT user FROM Settings WHERE id = 1")
abstract fun getUser(): LiveData<String>

@Query("SELECT developerMode FROM Settings WHERE id = 1")
abstract fun getDeveloperMode(): LiveData<Boolean>

@Query("SELECT logoUrl FROM Settings WHERE id = 1")
abstract fun getLogoUrl(): LiveData<String>

@Query("SELECT advertisment FROM Settings WHERE id = 1")
abstract fun getAdvertisment(): LiveData<String>
@Query(“从id=1的设置中选择activeItem”)
抽象趣味getActiveItem():LiveData
@查询(“从id=1的设置中选择用户”)
抽象fun getUser():LiveData
@查询(“从id=1的设置中选择developerMode”)
抽象有趣的getDeveloperMode():LiveData
@查询(“从id=1的设置中选择logoUrl”)
抽象趣味getLogoUrl():LiveData
@查询(“从id=1的设置中选择广告”)
抽象趣味GetAdvertisent():LiveData
您应该将其用于持久化用户首选项。您可以通过首选项更改侦听器侦听首选项更新

preferences.registerOnSharedPreferenceChangeListener { sharedPreferences, key -> 
    // handle preference update
}
或者,您可以实现自己的首选项注册表


  • 将您的首选模型定义为
    sealed class

    sealed class MyPreference
    
    data class ActiveItemPreference(val number: Int) : MyPreference()
    data class UserPreference(val name: String, val age: Int) : MyPreference()
    
  • PreferenceRegistry
    实现为类型安全的异构容器(有效Java(第三)。第33项)

  • 观察变化

    PreferencesRegistry[UserPreference::class].observe(this::getLifecycle) { userPref ->
        if (userPref == null)
            Log.w("PREFERENCES", "Unexpected nullable user preference")
        else
            Log.d("PREFERENCES", "User preference updated. New name is ${userPref.name} and new age is ${userPref.age}")
    }
    
  • 实现首选项加载并在应用程序启动时调用它

  • 您应该使用for持久化用户首选项。您可以通过首选项更改侦听器侦听首选项更新

    preferences.registerOnSharedPreferenceChangeListener { sharedPreferences, key -> 
        // handle preference update
    }
    
    或者,您可以实现自己的首选项注册表


  • 将您的首选模型定义为
    sealed class

    sealed class MyPreference
    
    data class ActiveItemPreference(val number: Int) : MyPreference()
    data class UserPreference(val name: String, val age: Int) : MyPreference()
    
  • PreferenceRegistry
    实现为类型安全的异构容器(有效Java(第三)。第33项)

  • 观察变化

    PreferencesRegistry[UserPreference::class].observe(this::getLifecycle) { userPref ->
        if (userPref == null)
            Log.w("PREFERENCES", "Unexpected nullable user preference")
        else
            Log.d("PREFERENCES", "User preference updated. New name is ${userPref.name} and new age is ${userPref.age}")
    }
    
  • 实现首选项加载并在应用程序启动时调用它


  • 我已经在使用带有大约10张桌子的房间,包括备份还原功能,我不想包括任何其他存储。我想通过LiveData观察一个设置表来解决这个问题。我已经在使用包含10个表(包括备份还原功能)的Room,我不想包括任何其他存储。我想通过LiveData观察一个设置表来解决这个问题