如何映射来自不同数据源的两个模型?

时间:2018-07-26 08:10:18

标签: java android mapping retrofit android-room

我正在开发的项目中遇到一个问题。

我一直按照功能结构对软件包进行分组,这基本上就是我所拥有的结构

 - data 
 - local 
  - model 
   - LocalModel.java
 - remote 
  - model
   - RemoteModel.java  
 - ui 
  - features 

两个模型都包含完全相同的属性, 即:

RemoteModel.java

public class RemoteModel implements Parcelable {
   private String name; //has getter and setter
   ...
}

LocalModel.java

public class LocalModel implements Parcelable {
   private String name; //has getter and setter
   ...
}

在功能部件包中,我有一个活动,用于显示模型的详细信息。事实是,可以启动Activity来保存RemoteModel或LocalModel对象。但是,作为该Activity属性的一部分,它只有一个RemoteModel属性,如下所示:

public class DetailsActivity extends AppCompartActivity {
   ...
   private TextView mName;
   private RemoteModel mRemoteModel;
   ...

   public void onCreate(Bundle savedInstanceState) {
      ...
      mRemoteModel = getIntent().getExtras().getParcelable(EXTRA_RESULT_TITLE);
      ...
      mName.setText(mRemoteModel.getName());
   }
}

这样,在我运行该应用程序之前,它工作正常,然后点击“查看详细信息”按钮,然后出现以下美丽错误:

java.lang.ClassCastException: com.carlosparra.myApp.data.local.model.LocalModel cannot be cast to com.carlosparra.moviestvtracker.moviesandtvshowstracker.data.remote.model.RemoteModel

我知道错误的含义,所以这就是为什么我想知道如何将来自不同数据源的这两个类映射到共享对象中,然后将其传递给详细信息Activity。

1 个答案:

答案 0 :(得分:0)

您可以在界面Parcelable中定义必要的获取和设置器:

public interface Parcelable {

    String getName();

}

然后,您得到一个RemoteModel对象,而不是在活动中得到一个Parcelable

public class DetailsActivity extends AppCompartActivity {
   ...
   private TextView mName;
   private Parcelable mParcelable;
   ...

   public void onCreate(Bundle savedInstanceState) {
      ...
      mParcelable = getIntent().getExtras().getParcelable(EXTRA_RESULT_TITLE);
      ...
      mName.setText(mParcelable.getName());
   }
}