簡體   English   中英

(房間數據庫)查詢錯誤未返回的字段

[英](Room Database)fields which are not returned by the query error

這是我的代碼:

類實體.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;
}

道.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);
}

數據庫.java

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

public abstract class Database extends RoomDatabase {

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

應用程序.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;
        }
    }

您試圖告訴 Room 從單個字符串(針對每個查詢)構建一個 ClassEntity 對象。 據說它不能安全地做到這一點。

解決方法是將List<String>作為 oppsed 返回到List<calssEntity>

當您想要基於 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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM