【问题标题】:(Room Database)fields which are not returned by the query error(房间数据库)查询错误未返回的字段
【发布时间】:2020-01-06 21:03:40
【问题描述】:

这是我的代码:

ClassEntity.java

@Entity

public class ClassEntity {

    @NonNull
    @PrimaryKey
    public String id_of_a_group;
    public String monday;
    public String tuesday;
    public String wednesday;
    public String thursday;    
    public String friday;
}

Dao.java

@androidx.room.Dao    
public interface Dao {

    @Query("SELECT monday FROM  ClassEntity WHERE id_of_a_group = :id")
    List<ClassEntity> findFromMonday(String id);

    @Query("SELECT tuesday FROM  ClassEntity WHERE id_of_a_group = :id")
    List<ClassEntity> findFromTuesday(String id);

    @Query("SELECT wednesday FROM  ClassEntity WHERE id_of_a_group = :id")   
    List<ClassEntity> findFromWednesday(String id);

    @Query("SELECT thursday FROM  ClassEntity WHERE id_of_a_group = :id")
    List<ClassEntity> findFromThursday(String id);

    @Query("SELECT friday FROM  ClassEntity WHERE id_of_a_group = :id")
    List<ClassEntity> findFromFriday(String id);

    @Query("SELECT id_of_a_group FROM  ClassEntity")
    List<ClassEntity> getIdOfAllGroups();

    @Insert
    void insert(Class group);

    @Update
    void update(Class group);

    @Delete
    void delete(Class group);
}

Database.java

@androidx.room.Database(entities = {ClassEntity.class},version=1)

public abstract class Database extends RoomDatabase {

    public abstract Dao classDao();   
    public abstract Array[] getIdOfAllGroups();
}

App.java

public class App extends Application {

    public static App instance;    
    private Database database;

    @Override
    public void onCreate() {

        super.onCreate();
        instance = this;
        database = Room.databaseBuilder(this, Database.class, "database")
                .build();
    }

    public static App getInstance() {
        return instance;
    }

    public Database getDatabase() {
        return database;
    }
}

编译器给了我这个错误:

ClassEntity has some fields [id_of_a_group, tuesday, wednesday, thursday, friday] which are not returned by the query. If they are not supposed to be read from the result, you can mark them with @Ignore annotation. You can suppress this warning by annotating the method with @SuppressWarnings(RoomWarnings.CURSOR_MISMATCH). Columns returned by the query: monday. Fields in com.example.schedule.ClassEntity: id_of_a_group, monday, tuesday, wednesday, thursday, friday.

我不知道解决方案,因为我是新手。 顺便说一句,我需要检查数据库中是否有该项目。

这是我的猜测,如果我错了,请告诉我

    Others2 activity=(Others2)getActivity();
    getData=activity.sendData();
    Database db = App.getInstance().getDatabase();
    String[] ids_of_all_groups=db.getIdOfAllGroups();
    boolean test=false;

    for( String elem: ids_of_all_groups){
        if(getData==elem){
            test=true;
            break;
        }
    }

【问题讨论】:

    标签: java android-room


    【解决方案1】:

    您正试图告诉 Room 从单个字符串(对于每个查询)构建一个 ClassEntity 对象。它是说它不能安全地做到这一点。

    解决方法是将List&lt;String&gt;List&lt;calssEntity&gt; 相对应。

    当您想要基于 ClassEntity 对象插入/更新/删除时,您还尝试使用 Class 对象插入/删除/更新。所以你的道应该/可以是:-

    @androidx.room.Dao
    public interface Dao {
    
        @Query("SELECT monday FROM  ClassEntity WHERE id_of_a_group = :id")
        List<String> findFromMonday(String id);
    
        @Query("SELECT tuesday FROM  ClassEntity WHERE id_of_a_group = :id")
        List<String> findFromTuesday(String id);
    
        @Query("SELECT wednesday FROM  ClassEntity WHERE id_of_a_group = :id")
        List<String> findFromWednesday(String id);
    
        @Query("SELECT thursday FROM  ClassEntity WHERE id_of_a_group = :id")
        List<String> findFromThursday(String id);
    
        @Query("SELECT friday FROM  ClassEntity WHERE id_of_a_group = :id")
        List<String> findFromFriday(String id);
    
        @Query("SELECT id_of_a_group FROM  ClassEntity")
        List<String> getIdOfAllGroups();
    
        @Insert
        void insert(ClassEntity group);
    
        @Update
        void update(ClassEntity group);
    
        @Delete
        void delete(ClassEntity group);
    }
    

    您还应该注释掉或删除该行(在 Database.java 中)

    public abstract Array[] getIdOfAllGroups();
    

    我相信以上的改动将允许编译。

    至于检查数据库中的项目,您可以通过将以下内容添加到 Dao.java 来添加查询以检查 ClassEntity 表中是否有任何行

    @Query("SELECT count() FROM ClassEntity")
    int getItemsInDatabase();
    

    使用上述更改,然后在活动中使用以下更改:-

        database = Room.databaseBuilder(this, Database.class, "database")
                .allowMainThreadQueries()
                .build();
        Log.d("ITEMSINDB",String.valueOf(database.classDao().getItemsInDatabase()));
        if (database.classDao().getItemsInDatabase() < 1) {
            ClassEntity myClassEntity = new ClassEntity();
            myClassEntity.id_of_a_group = "myfirstid";
            myClassEntity.monday = "something on Monday";
            myClassEntity.tuesday = "on Tuesday";
            myClassEntity.wednesday = "another on Wed";
            myClassEntity.thursday = "this on Thurs";
            myClassEntity.friday = "TGIF";
            database.classDao().insert(myClassEntity);
        }
        Log.d("ITEMSINDB",String.valueOf(database.classDao().getItemsInDatabase()));
    

    结果:-

    2020-01-07 09:48:30.251 D/ITEMSINDB: 0
    2020-01-07 09:48:30.254 D/ITEMSINDB: 1
    

    如果重新运行,则由于数据存在,结果是(行已经存在,因此没有添加新行)

    2020-01-07 09:57:03.217 D/ITEMSINDB: 1
    2020-01-07 09:57:03.218 D/ITEMSINDB: 1
    

    关于public abstract Array[] getIdOfAllGroups();,您将使用(在应用活动中):-

    List<String> mygroups = database.classDao().getIdOfAllGroups();
    

    如果你想根据它的 id_of_a_group 检查一个组是否存在,那么你可以有

    @Query("SELECT count() > 0  FROM ClassEntity WHERE id_of_a_group = :id")
    boolean doesGroupExist(String id);
    

    你可以使用类似的东西:-

        String test1 = "this group doesn not exists";
        if (!database.classDao().doesGroupExist(test1)) {
            Log.d("GROUPLOOKUPRESULT","Group " + test1 + " Not located.");
        } else {
            Log.d("GROUPLOOKUPRESULT","Group " + test1 + " Located.");
        }
        String test2 = "myfirstid";
        if (database.classDao().doesGroupExist(test2)) {
            Log.d("GROUPLOOKUPRESULT","Group " + test2 + " Located.");
        } else {
            Log.d("GROUPLOOKUPRESULT","Group " + test2 + " Not Located.");
        }
    

    这会导致:-

    2020-01-07 10:17:49.201 D/GROUPLOOKUPRESULT: Group this group doesn not exists Not located.
    2020-01-07 10:17:49.201 D/GROUPLOOKUPRESULT: Group myfirstid Located.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-21
      • 2014-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多