【问题标题】:Room Database distinct value房间数据库的独特价值
【发布时间】:2019-05-22 10:07:11
【问题描述】:

我正在尝试将房间数据库集成到我的 android 应用程序中。 现在我想从数据库中查询不同的结果,但我收到了这个错误:

error: The columns returned by the query does not have the fields [id] in com.abc.def.model.User even though they are annotated as non-null or primitive. 
    Columns returned by the query: [user_name]

我的实体(Getter 和 Setter 没有在这里复制):

@Entity
public class User {
     @PrimaryKey(autoGenerate = true)
        @NonNull
        @ColumnInfo(name = "id")
        private Integer id;
    
        @ColumnInfo(name = "user_name")
        @NonNull
        private String name;
    
        @ColumnInfo(name = "email")
        private String email;
    
        public User(String name, String email) {
            this.name = name;
            this.email = email;
        }
    }

我的道:

@Dao
public interface UserDao {
    @Insert
    void insertAll(User... users);

    // Not working
    @Query("SELECT DISTINCT user_name FROM User")
    List<User> fetchDistinctUser();
    
    // Working
    @Query("SELECT * FROM User")
    List<User> fetchAllUser();
}

如果我遗漏了什么,请告诉我。

如果我将List&lt;User&gt; 更改为List&lt;String&gt;,它可以工作,但如果我们还需要其他详细信息怎么办。

原文:

// Not working
  @Query("SELECT DISTINCT user_name FROM User")
  List<User> fetchDistinctUser();

已更改:

// Working
  @Query("SELECT DISTINCT user_name FROM User")
  List<String> fetchDistinctUser();

但是,问题仍然存在如何获取其他详细信息?

【问题讨论】:

  • 您的查询是正确的。但为什么不工作我不明白。您也可以在插入数据时进行检查。 @Insert(onConflict = OnConflictStrategy.REPLACE) void insertAll(User... users);或 @Insert(onConflict = OnConflictStrategy.IGNORE) void insertAll(User... users);
  • @ShohelRana,谢谢我会试试这个
  • @ShohelRana 如答案中所建议,如果我将 List 更改为 List 它正在工作,但如果我们想要其他详细信息以及
  • 如果你没有得到完整的列表对象。您在插入期间重复数据检查。已经对你说过了。然后使用选择查询获取所有数据。你可以用它来替代

标签: android android-room android-database


【解决方案1】:

您可以使用Group By解决此问题

@Query("SELECT user_name FROM User group by userID")
List<User> fetchDistinctUser();

与上面的示例一样,您将获得不同的用户。

【讨论】:

  • OP 问题中的 userID 在哪里?
  • 是用户实体中的id。
  • 问题不是关于选择用户 ID,而是关于 SELECT DISTINCT 用户名,这个解决方案没有解决!!!!
【解决方案2】:

您正在获取一个已经不同的空洞记录集,因为您的 id 是不同的主要 ID。

您只需删除 id 作为主要的或使用可以为不包含 id 字段的记录集采用另一个类。

例如。

  @Query("SELECT name,email FROM User where name in(select distinct name from User)")
    List<UserNew> fetchDistinctUser();

【讨论】:

    【解决方案3】:

    使用来自User的属性:

    @Query("SELECT DISTINCT name FROM User")
    List<String> fetchDistinctUser();
    

    【讨论】:

    • 可以复制日志吗?
    • 对不起,我已经更新了答案。如果您想要不同的名称,则结果应该是 List 而不是 List
    • 它正在工作,但是这个有什么用我想要所有其他信息以及名称。你知道如何实现吗?
    • 例如,您有一个表 (id, user, city),其中包含数据 (1,john,london) 和 (2,john,tokio)。您对伦敦或东京的查询有何期望?如果不重要,您可以使用 group by。
    • 我需要 id...即(1 和 2)基于其余的功能需要 id
    【解决方案4】:

    对于来到这里遇到同样问题的任何人,Select distinct in room 不适用于 LiveData。我不知道为什么,但这可能是一个错误。

    【讨论】:

      【解决方案5】:

      如果您想从不同的用户名中获取其他详细信息,您可以通过以下方式进行:

      第一种方式:

        @Query("SELECT * FROM User where user_name in (SELECT DISTINCT user_name FROM User)")
        List<User> fetchDistinctUser();
      

      第二种方式:

      第 1 步:首先获取不同的用户名:

        @Query("SELECT DISTINCT user_name FROM User")
        List<String> fetchDistinctUser();
      

      第 2 步:在您的活动或任何类\函数中获得不同的用户名后,再次将其传递给 Dao 以获取所有数据:

        @Query("SELECT * FROM User WHERE user_name LIKE :name")
        List<User> fetchAllDataOfDistinctUser(String name);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-13
        • 2021-01-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多