[英]Room prepopulated database error: The columns returned by the query does not have the fields [rowid]
[英](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.