我有一个相当复杂(尽管并非完全不寻常)的场景,它似乎与 Android Room 版本2.4.0
(特别是2.4.0-beta01
. 它适用于2.4.0-alpha05
)中断了。
我将把代码放在下面,但我现在会尝试用简单的英语描述我的情况。
基本上,我有两个引用同一个表/实体的数据库。该实体是使用 AutoValue 创建的,直到 为止,它与注释2.4.0-alpha05
一起工作得很好。@AutoValue.CopyAnnotations
但是,一旦我升级到2.4.0-beta01
,就不再检测到歌曲表名称:
There is a problem with the query: [SQLITE_ERROR] SQL error or missing database (no such table: word_table)
事不宜迟,这里是相同的示例代码(改编自开发人员说明)
@AutoValue
@Entity(tableName = "word_table")
public abstract class Word {
@AutoValue.CopyAnnotations
@PrimaryKey
@NonNull
@ColumnInfo(name = "word")
public abstract String word();
@NonNull
public static Word create(@NonNull String word) {
return new AutoValue_Word.Builder().word(word).build();
}
@AutoValue.Builder
public abstract static class Builder {
abstract Builder word(String word);
public abstract Word build();
}
}
@Dao
@TypeConverters(Converters.class)
public interface WordDao {
@Query("SELECT * FROM word_table")
LiveData<List<Word>> getAlphabetizedWords();
}
@Dao
@TypeConverters(Converters.class)
public interface WordDao2 {
@Query("SELECT * FROM word_table")
LiveData<List<Word>> getAlphabetizedWords();
}
@Database(entities = {Word.class}, version = 1)
public abstract class WordRoomDatabase extends RoomDatabase {
public abstract WordDao wordDao();
public static WordRoomDatabase createDatabase(final Context context) {
return Room.databaseBuilder(context.getApplicationContext(), WordRoomDatabase.class, "word_database").build();
}
}
@Database(entities = {Word.class}, version = 1)
public abstract class WordRoomDatabase2 extends RoomDatabase {
public abstract WordDao2 wordDao2();
public static WordRoomDatabase2 createDatabase(final Context context) {
return Room.databaseBuilder(context.getApplicationContext(), WordRoomDatabase2.class, "word_database").build();
}
}
更新:
当我查看生成的模式时,只有WordRoomDatabase1
填充,虽然很混乱:
{
"formatVersion": 1,
"database": {
"version": 1,
"identityHash": "a67e5757cf2fc0be1d7cee0b7192312f",
"entities": [
{
"tableName": "word_table",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` ()",
"fields": [],
"primaryKey": {
"columnNames": [],
"autoGenerate": false
},
"indices": [],
"foreignKeys": []
}
],
"views": [],
"setupQueries": [
"CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
"INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'a67e5757cf2fc0be1d7cee0b7192312f')"
]
}
}
更新 2:
我更改Word.java
为不使用 AutoValue,效果很好:
@Entity(tableName = "word_table")
public class Word {
@PrimaryKey
@NonNull
@ColumnInfo(name = "word")
private String word;
public Word(@NonNull String word) {this.word = word;}
public String getWord(){return this.word;}
}