Articles of android architecture components

Android会议室:订单不工作

我正在使用新的Android ORM Room。 我遇到了问题。 带参数的ORDER BY不起作用。 如果我想使用ORDER BY参数中的字段,则无效。 没有任何吸引力。 @Query(“SELECT * FROM User ORDER BY :orderBY ASC”) List sortedFind(String orderBY); 但是,当我直接将哪个字段排序然后它按预期工作。 @Query(“SELECT * FROM User ORDER BY name ASC”) List sortedFind(); 它是android Room上的bug,还是我做错了什么?

导航架构组件 – 具有CollapsingToolbar的详细信息视图

新导航组件的拟议实践在I / O中提供,具有以下模板和建议的理念: 应用程序的一个活动 活动包含工具栏和底部导航栏 典型的应用程序通常具有详细视图,其中包含CollapsingToolbar。 如何在该架构下构建它? 将工具栏移动到每个片段XML? 以编程方式实现折叠工具栏? 将细节片段移动到它自己的活动(它可能会使用它自己的深层链接)并“打破”这个哲学?

使用新的体系结构组件ViewModel在片段之间共享数据

在Last Google IO上,Google发布了一些新的Arch组件预览,其中一个是ViewModel。 在文档中, Google显示了此组件的一种可能用途: 活动中的两个或更多个片段需要彼此通信是很常见的。 这绝不是微不足道的,因为两个片段都需要定义一些接口描述,并且所有者活动必须将两者绑定在一起。 而且,两个片段必须处理尚未创建或不可见的其他片段的情况。 可以使用ViewModel对象解决这个常见的痛点。 想象一下主从细节片段的常见情况,其中我们有一个片段,其中用户从列表中选择一个项目,另一个片段显示所选项目的内容。 这些片段可以使用其活动范围共享ViewModel来处理此通信。 并显示了一个实现示例: public class SharedViewModel extends ViewModel { private final MutableLiveData selected = new MutableLiveData(); public void select(Item item) { selected.setValue(item); } public LiveData getSelected() { return selected; } } public class MasterFragment extends Fragment { private SharedViewModel model; public void onActivityCreated() { model = […]

Android Room连接的返回types

假设我想在两个实体Foo和Bar之间进行INNER JOIN : @Query(“SELECT * FROM Foo INNER JOIN Bar ON Foo.bar = Bar.id”) List findAllFooAndBar(); 是否可以强制这样的返回types? public class FooAndBar { Foo foo; Bar bar; } 当我尝试这样做时,我收到此错误: error: Cannot figure out how to read this field from a cursor. 我也尝试使表名称别名以匹配字段名称,但这也不起作用。 如果这不可能,我应该如何干净地构建包含两个实体的所有字段的兼容返回types?

为什么LiveData有一个单独的MutableLiveData子类?

看起来MutableLiveData与MutableLiveData不同之处仅在于将setValue()和postValue()方法postValue()公共,而在LiveData它们受到保护。 为此更改创建单独的类有什么理由,而不是简单地将这些方法定义为LiveData本身的公共方法? 一般来说,这种inheritanceforms(增加某些方法的可见性是唯一的变化)是一种众所周知的做法,以及它可能有用的一些场景(假设我们可以访问所有代码)?

无法解决:android.arch.lifecycle:extensions:1.0.0-alpha1 android studio 3.0

我正在android studio 3.0中使用android插件’com.android.tools.build:gradle:3.0.0-alpha1’和gradle version gradle-4.0-milestone-1-all.zip构建一个项目。 二手maven repo: maven { url ‘https://maven.google.com’ } 此外,在我的项目中使用android Room持久性和生命周期。 已经在我的应用程序gradle文件中声明了以下依赖项: compile “android.arch.lifecycle:extensions:1.0.0-alpha1” compile “android.arch.persistence.room:runtime:1.0.0-alpha1” annotationProcessor “android.arch.lifecycle:compiler:1.0.0-alpha1” annotationProcessor “android.arch.persistence.room:compiler:1.0.0-alpha1” 同步并构建项目时,它显示以下错误: Failed to resolve: android.arch.lifecycle:extensions:1.0.0-alpha1 我是否遗漏了此问题或某些其他解决方案。

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导致级联,并重新插入一行将导致其他表中的行与外键被删除。 这不是预期的行为。