1

我有一个相当复杂(尽管并非完全不寻常)的场景,它似乎与 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;}
}
4

0 回答 0