我正在使用Room来设置包含3个表的数据库。我正在尝试从“文章”表中为2个表(标题和多媒体)设置外键,而不是主键。
请参见下面的代码。我认为我正确使用了批注,但是它仍然给我以下错误:
错误:com.articlesregistry.data.Multimedia具有引用com.articlesregistry.data.Article(original_id)的外键(article_original_id),但com.articlesregistry.data.Article在这些列上没有唯一索引,也不是其列首要的关键。SQLite要求对引用的父列具有唯一约束,因此您必须向具有(original_id)列的com.articlesregistry.data.Article添加唯一索引。
和类:
文章:
@Entity(tableName = "article",
indices={
@Index(value="uid"),
@Index(value="original_id")
})
public class Article {
@Ignore
ArrayList<Multimedia> multimediaArrayList;
@Ignore
ArrayList<Headline> headlineArrayList;
@Expose(deserialize = false)
@NonNull
@PrimaryKey(autoGenerate = true)
private int uid;
@Expose(deserialize = false)
@ColumnInfo(name = "favourite")
private Boolean favourite;
// Json - API
@SerializedName("web_url")
@ColumnInfo(name = "web_url")
private String web_url;
@SerializedName("snippet")
@ColumnInfo(name = "snippet")
private String snippet;
@SerializedName("source")
@ColumnInfo(name = "source")
private String source;
@SerializedName("pub_date")
@ColumnInfo(name = "pub_date")
private String pub_date;
@SerializedName("document_type")
@ColumnInfo(name = "document_type")
private String document_type; …Run Code Online (Sandbox Code Playgroud) 我正在构建一个使用ArticleBoundaryCallback初始化对API的调用并将响应存储在Room中的应用。我还使用LiveData收听该表,并在PagedListAdapter中显示项目。
问题在于,每次将新数据插入到Room(Article)表中时,整个列表都会刷新。
同样,在配置更改时,似乎再次获取了整个数据(ViewModel不保留它,RecyclerView被重新创建)。
每次插入时,RecyclerView都会跳转(如果插入的是新数据,则跳转几行;如果将新数据替换为旧数据,则跳转到开头)。
整个代码在此GitHub存储库中。
我的课程是:
文章:
@Entity(tableName = "article",
indices={@Index(value="id")})public class Article {
@PrimaryKey(autoGenerate = false)
@SerializedName("_id")
@Expose
@NonNull
private String id;
@SerializedName("web_url")
@Expose
private String webUrl;
@SerializedName("snippet")
@Expose
private String snippet;
@SerializedName("print_page")
@Expose
private String printPage;
@SerializedName("source")
@Expose
private String source;
@SerializedName("multimedia")
@Expose
@Ignore
private List<Multimedium> multimedia = null;
Run Code Online (Sandbox Code Playgroud)
第DAO条:
@Dao
public interface ArticleDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
long insert(Article article);
@Insert(onConflict = OnConflictStrategy.REPLACE)
void update(Article... repos);
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insertArticles(List<Article> articles);
@Delete
void delete(Article... …Run Code Online (Sandbox Code Playgroud) android-livedata android-viewmodel android-paging mutablelivedata