Articles of android architecture components

Android Room:使用Room插入关系实体

我在Room使用Relation添加了一对多的关系 。 我在这篇文章中提到了在Room中为关系编写以下代码。 该post讲述了如何从数据库读取值但将实体存储到数据库中导致userId为空,这意味着2个表之间没有关系。 我不确定在具有userId值的情况下insert User和List of Pet插入数据库的理想方式是什么。 1)用户实体: @Entity public class User { @PrimaryKey public int id; // User id } 2)宠物实体: @Entity public class Pet { @PrimaryKey public int id; // Pet id public int userId; // User id public String name; } 3)UserWithPets POJO: // Note: No annotation required at this class […]

房间持久性:错误:实体和Pojos必须具有可用的公共构造函数

我正在将一个项目转换为Kotlin,我正在尝试使我的模型(也是我的实体)成为一个数据类,我打算使用Moshi转换来自API的JSON响应 @Entity(tableName = “movies”) data class MovieKt( @PrimaryKey var id : Int, var title: String, var overview: String, var poster_path: String, var backdrop_path: String, var release_date: String, var vote_average: Double, var isFavorite: Int ) 我无法构建应用程序导致以下错误 实体和Pojos必须具有可用的公共构造函数。 您可以拥有一个空构造函数或其参数与字段匹配的构造函数(按名称和types)。 找不到字段的setter。 我发现的例子离此不远 关于如何解决它的想法?

我怎样才能代表Android Room的多对多关系?

我怎样才能代表与房间的多对多关系? 例如,我有“访客”和“预订”。 预订可以有许多客人,并且客人可以参加许多预订。 这是我的实体定义: @Entity data class Reservation( @PrimaryKey val id: Long, val table: String, val guests: List ) @Entity data class Guest( @PrimaryKey val id: Long, val name: String, val email: String ) 在查看文档时,我遇到了@Relation 。 我发现它真的很混乱。 根据这个,我想创建一个POJO并在那里添加关系。 所以,通过我的例子,我做了以下几点 data class ReservationForGuest( @Embedded val reservation: Reservation, @Relation( parentColumn = “reservation.id”, entityColumn = “id”, entity = […]

Android Room Persistence Library:Upsert

Android的Room持久性库慷慨地包含适用于对象或集合的@Insert和@Update注释。 然而,我有一个用例(包含模型的推送通知)需要UPSERT,因为数据可能存在或可能不存在于数据库中。 Sqlite本身没有upsert,并且在这个SO问题中描述了变通方法。 鉴于那里的解决方案,如何将它们应用于房间? 更具体地说,如何在Room中实现不会破坏任何外键约束的插入或更新? 使用带onConflict = REPLACE的insert将导致onDelete调用该行的任何外键。 在我的情况下,onDelete导致级联,并重新插入一行将导致其他表中的行与外键被删除。 这不是预期的行为。

分页库 – 带有API获取页面和大小的网络+数据库的边界回调

简短的问题 : 使用使用页面+大小加载新页面的API和BoundaryCallback类,从Architecture组件处理Paging库上的数据库+网络的正确方法是什么? 研究和解释 目前,在用于体系结构组件的分页库中使用的类BoundaryCallback接收列表中元素的实例作为参数,而没有该元素所在的实际上下文。 它发生在onItemAtFrontLoaded和onItemAtEndLoaded 。 我的Api应该接收页面和页面大小以加载下一个数据块。 作为分页列表构建器的一部分添加的边界回调应该告诉您何时根据预取距离和页面大小加载下一页数据。 由于Api需要提供页面编号和页面大小,因此我没有看到通过接收onItemAtFrontLoaded和onItemAtEndLoaded提供的列表中的一个元素将其发送到Api的onItemAtEndLoaded 。 检查此链接中的Google示例,他们使用最后一个元素的名称来获取下一个元素,但这不适合具有页面+大小的Api。 他们还有另一个例子,只有使用PagedKeyedDatasource网络,但是没有关于如何将它与数据库和BoundaryCallback混合的样本或线索。 编辑 :到目前为止我find的解决方案只是将最后加载的页面存储在共享首选项上,但这听起来像是一个肮脏的技巧。 有关其官方输入,请参阅https://github.com/googlesamples/android-architecture-components/issues/252#issuecomment-392119468 。

Android室错误:types转换器无法识别列表的枚举

房间库不识别我为枚举List创build的TypeConverter 。 但是,当我将其更改为枚举的ArrayList它工作正常。 任何人有任何想法,为什么和我能做些什么来使这个工作与List ? (在Kotlin中使用列表更容易,我真的不希望只是因为这个原因转换回ArrayList )。 这是我的代码: 我的模特: @Entity data class Example(@PrimaryKey val id: String?, val name: String, var days: List<DayOfWeek>?) DayOfWeek是一个枚举: enum class DayOfWeek { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; val value: Int get() = ordinal + 1 companion object { private val ENUMS = DayOfWeek.values() fun of(dayOfWeek: Int): DayOfWeek { […]

Android室:顺序不工作

我正在使用新的android ORM房间。 我面临着问题。 ORDER BY与参数不起作用。 如果我想使用ORDER BY参数中的字段,这是行不通的。 没有任何东西。 @Query("SELECT * FROM User ORDER BY :orderBY ASC") List<User> sortedFind(String orderBY); 但是,当我把这个领域直接sorting,那么它是按预期工作。 @Query("SELECT * FROM User ORDER BY name ASC") List<User> sortedFind(); 是android房间的bug,还是我做错了什么?

了解Android架构组件示例GithubBrowserSample:ViewModelModule,ViewModel参数

Android架构组件最新的样本之一是Google提供的GithubBrowserSample 。 我审查了代码,出现了一些问题: 我注意到, ViewModelModule包含在AppModule中 。 这意味着所有的视图模型都被添加到DI图中。 为什么这样做,而不是为每个活动/片段提供单独的Module ,将只提供特定的活动/片段所需的ViewModel ? 在这个具体的例子中,哪里viewmodels使用GithubViewModelFactory实例化有没有办法将parameter passing给特定的ViewModel ? 或者更好的解决scheme是在ViewModel创build一个setter,并通过setter设置需要的参数?

Android空间可重复使用的通用基类DAO

有没有什么办法用Android的房间创build可重用的通用基类DAO? public interface BaseDao<T> { @Insert void insert(T object); @Update void update(T object); @Query("SELECT * FROM #{T} WHERE id = :id") void findAll(int id); @Delete void delete(T object); } public interface FooDao extends BaseDao<FooObject> { … } public interface BarDao extends BaseDao<BarEntity> { … } 我一直无法find任何方法来实现这一点,而不必声明相同的接口成员,并为每个子类编写查询。 当处理大量类似的DAO时,这变得非常单调乏味。

由于缺less方法而导致启动前报告失败(在com.google.android.apps.mtaas.crawler-1 / base.apk中)

由于最近我的应用程序开始在启动前报告中包含奇怪的错误消息(上传到Play商店后自动生成)。 这些报告包含以下例外情况: Exception java.lang.NoSuchMethodError: No interface method a(Landroid/arch/lifecycle/e;Landroid/arch/lifecycle/b$a;)V in class Landroid/arch/lifecycle/GenericLifecycleObserver; or its super classes (declaration of 'android.arch.lifecycle.GenericLifecycleObserver' appears in /data/app/com.google.android.apps.mtaas.crawler-1/base.apk) android.arch.lifecycle.f$aa (f.java:326) android.arch.lifecycle.fa (f.java:159) com.firebase.ui.database.FirebaseRecyclerAdapter.<init> (FirebaseRecyclerAdapter.java:40) 和: Exception java.lang.NoSuchMethodError: No static method a(Landroid/app/Activity;)V in class Landroid/arch/lifecycle/ReportFragment; or its super classes (declaration of 'android.arch.lifecycle.ReportFragment' appears in /data/app/com.google.android.apps.mtaas.crawler-1/base.apk) android.arch.lifecycle.LifecycleDispatcher$DispatcherActivityCallback.onActivityCreated (LifecycleDispatcher.java:77) android.app.Application.dispatchActivityCreated (Application.java:219) android.app.Activity.onCreate (Activity.java:1040) android.support.v4.app.SupportActivity.onCreate (SupportActivity.java:66) […]