【问题标题】:Skip null using @Insert annotation with Android Room在 Android Room 中使用 @Insert 注释跳过 null
【发布时间】:2019-02-06 11:16:04
【问题描述】:

我使用 DAO 将对象数组(例如 User[])插入到 Room 表中:

@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertAll(User... user);

但是,User[] 中的某些对象可能为空。在这种情况下,insertAll() 方法会抛出 NullPointerException。

是否可以以某种方式跳过空值?我更喜欢使用 @Insert 注释,而不是编写自定义插入查询或预先过滤掉空值。

【问题讨论】:

  • 为什么你不想事先过滤掉空值?
  • 我基本上是在问 Room 是否已经针对这种情况实施了一些措施

标签: java annotations sql-insert android-room


【解决方案1】:

尝试对可以具有空值的实体字段使用默认值注释,例如:@ColumnInfo(defaultValue = "CURRENT_TIMESTAMP")

同样对于可以有空值的实体字段放置@Nullable注解。

【讨论】:

    【解决方案2】:
    1. 创建另一个相同对象类型的数组
    2. 叫它临时
    3. 遍历第一个数组
    4. 如果 element[i] 为 null,则将其从 temp 中排除
    5. 传入 temp 作为方法的参数

    这里有人可能知道某种库定义的方法来做你想做的事,但我首先想到了这个解决方案。

    【讨论】:

    • 谢谢,问题是在初始化相同对象类型的数组时,需要事先声明它所持有的对象数量。
    • 我忘记了。那么我会尝试一个列表。
    【解决方案3】:

    我希望 Room 会实现一个实用程序来实现这一点,例如@Ignore(null) 之类的注释,但似乎并非如此。这是我现在的解决方案:

    调用org.apache.commons.lang3.ArrayUtils 的方法ArrayUtils.removeAllOccurences(users, null) 并将结果用作insertAll() 的参数。

    【讨论】:

      猜你喜欢
      • 2017-11-08
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-07
      • 1970-01-01
      • 1970-01-01
      • 2017-08-13
      • 1970-01-01
      相关资源
      最近更新 更多