小编Ant*_*nit的帖子

带有延迟外键的 Android Room

我有几个定期从服务器更新的表 ( Benefit, Branch, Coupon) 和另外两个仅本地的表 ( FavoriteBenefit, UsedCoupon)。ER图如下所示: ER图

每当Benefit在服务器上删除a 时,我还想从FavoriteBenefit. 为此,我可以使用onDelete = ForeignKey.CASCADE,每当Benefit数据库中不再存在父级时,它FavoriteBenefit也会被删除。听起来不错。

每当我@Insert(onConflict = OnConflictStrategy.REPLACE)用来更新数据库中的好处时就会出现问题 。REPLACE实际上是一个执行DELETEINSERT,但DELETE在内部触发onDeleteFavoriteBenefit,因此,在该表中的所有数据被删除。

CouponUsedCoupon表也会出现类似的问题。)


我正在寻找一种方法来暂时禁用外键约束,直到事务结束。也就是说,不要在事务期间验证外键,而只在事务结束时验证。我仍然希望 Room 自动删除没有有效父级的实体。


似乎通过在定义上设置将外键标记为延迟应该完全符合我想要实现的目标。deferred = true@ForeignKey

布尔延迟 ()

外键约束可以推迟到事务完成。如果您在单个事务中对数据库进行批量插入,这将非常有用。默认情况下,外键约束是即时的,但您可以通过将此字段设置为 true 来更改它。

但即使我设置了deferred标志,它似乎也没有效果,因为FavoriteBenefit每次仍然被删除。

我是否deferred错误地理解了标志?

android foreign-keys deferred android-room

8
推荐指数
1
解决办法
1572
查看次数

Android Compose setupWithNavController

我正在寻找setupWithNavController(Toolbar, NavController)AppBar的 Compose 变体,以便在导航目的地发生变化时自动更新向上按钮。到目前为止我还没有发现任何有用的东西。

Compose 中是否认为这是一个糟糕的设计?或者是否有一些简单的方法可以实现我没有看到的相同目标?

android android-navigation android-jetpack-compose

7
推荐指数
1
解决办法
2248
查看次数

仅返回更快协程的值

如何并行运行多个协程并仅返回最先完成的协程的值?

在现实生活中,我有两个数据源- 数据库API服务。我不在乎数据从哪里来,我只需要快速。完成查询后,如何查询数据库API服务并取消另一个请求?

在RxJava世界中,这等于Amb运算符。如何使用协程实现类似的行为?

kotlin kotlin-coroutines

5
推荐指数
2
解决办法
87
查看次数

具有通用类型的 Moshi JSON 适配器

我想使用通用类型的 Moshi 适配器。

\n

这是我的通用类型适配器代码,

\n
fun <T> getObjectFromJson(typeOfObject: Class<T>, jsonString: String): T? {\n    val moshi = Moshi.Builder().build()\n    val jsonAdapter: JsonAdapter<T> = moshi.adapter<T>(\n        typeOfObject::class.java\n    )\n    return jsonAdapter.fromJson(jsonString)!!\n}\n
Run Code Online (Sandbox Code Playgroud)\n

该代码不起作用。它抛出一个错误,

\n
\n

平台类 java.lang.Class 需要显式注册 JsonAdapter

\n
\n

但是,如果我不\xe2\x80\x99t 使用这样的泛型类型,

\n
fun getObjectFromJson(jsonString: String): UserProfile? {\n    val moshi = Moshi.Builder().build()\n    val jsonAdapter: JsonAdapter<UserProfile> = moshi.adapter<UserProfile>(\n        UserProfile::class.java\n    )\n    return jsonAdapter.fromJson(jsonString)!!\n}\n
Run Code Online (Sandbox Code Playgroud)\n

然后代码就可以正常工作了。

\n

这是UserProfile类,

\n
 @Parcelize\n@JsonClass(generateAdapter = true)\ndata class UserProfile(\n    @get:Json(name = "p_contact")\n    val pContact: String? = null,\n\n    @get:Json(name = …
Run Code Online (Sandbox Code Playgroud)

android kotlin moshi

3
推荐指数
1
解决办法
2449
查看次数

带有加载指示器的 TextInputLayout

使用Material Design 库中的TextInputLayout,我们可以使用各种结束图标模式进行密码编辑、文本清除和自定义模式。此外,如果我们使用任何样式,它将自动应用显示打开和关闭 V 形的特殊结束图标模式。Widget.MaterialComponents.TextInputLayout.*.ExposedDropdownMenu

各种图标模式示例:

结束图标模式

鉴于结束图标的各种用例,我们决定在 中使用加载指示器InputTextLayout,使其看起来像这样:

加载指示模式

应该如何着手实施呢?

android loading android-progressbar progress-bar material-components-android

2
推荐指数
2
解决办法
2805
查看次数