Android Room:是否可以在实体中使用有界类型参数?
Android Room: Is it possible to use bounded type parameters in an entity?
我目前正在将 Mike Penz Fastadapter 与 Android Room 结合使用。可扩展模型class需要这样实现:
public class MyClass<Parent extends IItem & IExpandable,
SubItem extends IItem & ISubItem>
extends AbstractExpandableItem<MyClass<Parent, SubItem>, MyClass.ViewHolder, SubItem> {
我还想将该模型用作房间实体。第一个问题很容易解决——我创建了一个自定义版本的 AbstractExpandableItem,其中的字段将用 @Ignore 标记进行注释,以免阻碍代码生成。一个更简单的 Fastadapter 实现以这种方式工作得很好。
但是,Room 似乎在实体的有界类型参数方面存在问题,因为它会在 DAO 实现中抛出这些编译错误:
- Error:(40, 115) 错误:找不到符号 class Parent
- Error:(40, 123) 错误:找不到符号 class SubItem
我的 DAO 是:
@Dao
public interface MyDAO {
@Query("Select * from Table")
LiveData<List<MyClass>> getAllStuff();
与 不同,我无法通过更新解决问题 - 我将 Room gradle 版本设为 1.1.1,但错误仍然存在。
FastAdapter 还提供了定义普通 Model
class 的可能性,它可以是一个超级简单的 POJO 和一个 Item
class。
这样您就可以在模型中拥有所有数据定义,不需要任何父 classes 或实现,Item
将执行 UI 绑定.
可以在 FastAdapter
的示例应用程序中找到一个简单的示例。
您将使用 ModelAdapter
而不是 ItemAdapter
,然后提供模型如何转换为 Item
的逻辑。
这可以很简单:
ModelAdapter<IconModel, ModelIconItem> itemAdapter = new ModelAdapter<>(new IInterceptor<IconModel, ModelIconItem>() {
@Override
public ModelIconItem intercept(IconModel iconModel) {
return new ModelIconItem(iconModel);
}
});
对于这个简单的示例,模型如下所示:
public class IconModel {
public IIcon icon;
public IconModel(IIcon icon) {
this.icon = icon;
}
}
项目看起来像这样:
public class ModelIconItem extends ModelAbstractItem<com.mikepenz.fastadapter.app.model.IconModel, ModelIconItem, ModelIconItem.ViewHolder> {
public ModelIconItem(com.mikepenz.fastadapter.app.model.IconModel icon) {
super(icon);
}
@Override
public int getType() {
return R.id.fastadapter_model_icon_item_id;
}
@Override
public int getLayoutRes() {
return R.layout.icon_item;
}
@Override
public void bindView(ViewHolder viewHolder, List<Object> payloads) {
super.bindView(viewHolder, payloads);
... bind logic
}
@Override
public ViewHolder getViewHolder(View v) {
return new ViewHolder(v);
}
protected static class ViewHolder extends RecyclerView.ViewHolder {
protected View view;
@BindView(R.id.name)
public TextView name;
@BindView(R.id.icon)
public IconicsImageView image;
public ViewHolder(View view) {
super(view);
ButterKnife.bind(this, view);
this.view = view;
}
}
}
完整的示例代码可以在这里找到:
https://github.com/mikepenz/FastAdapter/blob/develop/app/src/main/java/com/mikepenz/fastadapter/app/ModelItemActivity.java#L51
我目前正在将 Mike Penz Fastadapter 与 Android Room 结合使用。可扩展模型class需要这样实现:
public class MyClass<Parent extends IItem & IExpandable,
SubItem extends IItem & ISubItem>
extends AbstractExpandableItem<MyClass<Parent, SubItem>, MyClass.ViewHolder, SubItem> {
我还想将该模型用作房间实体。第一个问题很容易解决——我创建了一个自定义版本的 AbstractExpandableItem,其中的字段将用 @Ignore 标记进行注释,以免阻碍代码生成。一个更简单的 Fastadapter 实现以这种方式工作得很好。
但是,Room 似乎在实体的有界类型参数方面存在问题,因为它会在 DAO 实现中抛出这些编译错误:
- Error:(40, 115) 错误:找不到符号 class Parent
- Error:(40, 123) 错误:找不到符号 class SubItem
我的 DAO 是:
@Dao
public interface MyDAO {
@Query("Select * from Table")
LiveData<List<MyClass>> getAllStuff();
与
FastAdapter 还提供了定义普通 Model
class 的可能性,它可以是一个超级简单的 POJO 和一个 Item
class。
这样您就可以在模型中拥有所有数据定义,不需要任何父 classes 或实现,Item
将执行 UI 绑定.
可以在 FastAdapter
的示例应用程序中找到一个简单的示例。
您将使用 ModelAdapter
而不是 ItemAdapter
,然后提供模型如何转换为 Item
的逻辑。
这可以很简单:
ModelAdapter<IconModel, ModelIconItem> itemAdapter = new ModelAdapter<>(new IInterceptor<IconModel, ModelIconItem>() {
@Override
public ModelIconItem intercept(IconModel iconModel) {
return new ModelIconItem(iconModel);
}
});
对于这个简单的示例,模型如下所示:
public class IconModel {
public IIcon icon;
public IconModel(IIcon icon) {
this.icon = icon;
}
}
项目看起来像这样:
public class ModelIconItem extends ModelAbstractItem<com.mikepenz.fastadapter.app.model.IconModel, ModelIconItem, ModelIconItem.ViewHolder> {
public ModelIconItem(com.mikepenz.fastadapter.app.model.IconModel icon) {
super(icon);
}
@Override
public int getType() {
return R.id.fastadapter_model_icon_item_id;
}
@Override
public int getLayoutRes() {
return R.layout.icon_item;
}
@Override
public void bindView(ViewHolder viewHolder, List<Object> payloads) {
super.bindView(viewHolder, payloads);
... bind logic
}
@Override
public ViewHolder getViewHolder(View v) {
return new ViewHolder(v);
}
protected static class ViewHolder extends RecyclerView.ViewHolder {
protected View view;
@BindView(R.id.name)
public TextView name;
@BindView(R.id.icon)
public IconicsImageView image;
public ViewHolder(View view) {
super(view);
ButterKnife.bind(this, view);
this.view = view;
}
}
}
完整的示例代码可以在这里找到: https://github.com/mikepenz/FastAdapter/blob/develop/app/src/main/java/com/mikepenz/fastadapter/app/ModelItemActivity.java#L51