如何将JSON数据存储到Realm中并将其显示到recyclerview中

时间:2017-08-15 15:25:14

标签: android json gson realm retrofit

在我的应用中,我实施了一个recyclerview。我在json foramt中有一个api,其中包含一个研究所的用户信息。现在我最初想要将数据存储到Realm DB中,然后用这些数据填充我的recyclerview。因此,我试图获得这个程序的一些工作文件。但我没有找到任何明确的解释。我不确定它的正确程序。我是否需要使用Httpurlconnection获取所有数据,然后将其存储到Realm。或者有任何改变的方式来做到这一点。

修改问题

在得到一些sugesstion后,我尝试了以下代码。我正在使用Retrofit 1.9。因为我无法使用Retrofit 2+版本获取数据。因为我从改造1.9获得结果。我想保留我的代码。但现在对如何根据领域设置适配器感到困惑。因为我有json api和realm的单独模型类。我想先将数据存储到域中,然后将其填充到recaclerview。在此时刻,Recyclerview将直接填入服务器数据。

从答案中获得指示后,我编辑了我的问题,如下所示

Json回复

    [
    {
    "_id": "fhfh49879787989",
    "dn": "CN=9879798789",
    "whenChanged": "20170704065349.0Z",
    "name": "Student",
    "mail": "student@mail.com",
    "updated_at": "2017-07-04T18:22:43.624Z"
  },
  {
    "_id": "595bdcf32c67a3f9ee6c2a25",
    "dn": "CN=dsfdsfsdfsf",
    "givenName": "Accounting Office",
    "whenChanged": "20170801114732.0Z",
    "name": "Accounting",
    "mail": "accounting@mail.com",
    "updated_at": "2017-07-04T18:22:43.641Z"
  },
  {
    "_id": "584ab3b4122d13e1b0d1578d",
    "dn": "CN=sfdfsfsdfl",
    "sn": "Abels",
    "title": "Student",
    "givenName": "Gardrut",
    "whenChanged": "20170807150844.0Z",
    "department": "PMO",
    "company": "Multi Lmited",
    "name": "Mike Lizz",
    "mail": "mail@yahoo.com",
    "mobile": "+1321646498",
    "updated_at": "2016-12-09T13:37:56.175Z"
  },
  {
    "_id": "584ab3b3122d13e1b0d15735",
    "dn": "CN=xdfsdfsfsdf",
    "sn": "Acsdff",
    "title": "Software Engineer",
    "givenName": "Olin",
    "whenChanged": "20170810064841.0Z",
    "department": "Head",
    "company": "Private limited",
    "name": "James Oliver",
    "mail": "mail@gmail.com",
    "mobile": "+41228",
    "updated_at": "2016-12-09T13:37:55.813Z"
  },
  ....
 ]

我的模特课

    public class ColleagueModel {

    @Expose
    private String _id;
    @Expose
    private String dn;
    @Expose
    private String givenName;
    @Expose
    private String whenChanged;
    @Expose
    private String name;
    @Expose
    private String mail;
    @Expose
    private String updatedAt;
    @Expose
    private String sn;
    @Expose
    private String title;
    @Expose
    private String department;
    @Expose
    private String company;
    @Expose
    private String mobile;

    public ColleagueModel(){

    }
    //getter and setter

   }

我使用的库

compile 'com.squareup.retrofit:retrofit:1.9.0'
compile 'com.squareup.okhttp:okhttp:2.3.0'
compile 'com.google.code.gson:gson:2.3'
compile 'com.squareup.picasso:picasso:2.5.2'

ApiService

public interface ColleagueApiService {

@GET("/api/users")

void getColleague(Callback<String> flowers);

RestManagerClass

    public class ColleagueRestManager {

    public ColleagueApiService mColleagueApi;


    public ColleagueApiService getColleagueApi() {

        if (mColleagueApi == null) {
            GsonBuilder gson = new GsonBuilder();
            gson.registerTypeAdapter( String.class, new StringDeserializer() );

            mColleagueApi = new RestAdapter.Builder()
                    .setEndpoint( Constants.HTTP.BASE_URL )
                    .setConverter( new GsonConverter( gson.create() ) )
                    .build()
                    .create( ColleagueApiService.class );
        }
        return mColleagueApi;
    }
}

适配器类

public class MyColleaguesAdapter extends RecyclerView.Adapter<MyColleaguesAdapter.ColleagueHolder>/{

public static String TAG = MyColleaguesAdapter.class.getSimpleName();

private List<ColleagueModel> mColleague;

private Context context;

public interface ColleagueListListener {
}

public MyColleaguesAdapter(List<ColleagueModel> colleagues,Context context) 
{
    this.context=context;
    mColleague = colleagues;
}
public void addColleague(ColleagueModel colleague) {
    //Log.d(TAG,colleague.name);
    mColleague.add(colleague);
    notifyDataSetChanged();
}



@Override
public ColleagueHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.colleage_row_layout,parent,false);
    return new ColleagueHolder(view);
}
@Override
public void onBindViewHolder(ColleagueHolder holder, int position) {

    final ColleagueModel currentColleague = mColleague.get(position);
    Picasso.with(holder.itemView.getContext());
    holder.colleagueName.setText(currentColleague.getName());
    holder.companyName.setText(currentColleague.getCompany());
    holder.jobTitle.setText(currentColleague.getTitle());

    holder.colleaguePicture.setImageResource( R.drawable.profile_image );
    Picasso.with(holder.itemView.getContext()).load( Constants.HTTP.PHOTO_URL + currentColleague.getMail()).into(holder.colleaguePicture);

    holder.cardView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent i=new Intent(context,DetailMyColleague.class);
            i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            i.putExtra("IMAGE_URL",Constants.HTTP.PHOTO_URL + currentColleague.getMail());
            i.putExtra("name",currentColleague.getName());
            i.putExtra("title",currentColleague.getTitle());
            i.putExtra("company",currentColleague.getCompany());
            i.putExtra("mobile",currentColleague.getMobile());
            i.putExtra("mail",currentColleague.getMail());
            i.putExtra("department",currentColleague.getDepartment());
            context.startActivity(i);
        }
    });


}

@Override
public int getItemCount() {
    return mColleague.size();
}

public class ColleagueHolder extends RecyclerView.ViewHolder{

    public CardView cardView;
    public ImageView colleaguePicture;
    public TextView  colleagueName;
    public TextView  companyName;
    public TextView  jobTitle;

    public ColleagueHolder(View itemView) {
        super(itemView);
        colleaguePicture= itemView.findViewById(R.id.colleague_picture);
        colleagueName= itemView.findViewById(R.id.colleague_name);
        companyName= itemView.findViewById(R.id.company_name);
        jobTitle= itemView.findViewById(R.id.job_title);
        cardView= itemView.findViewById(R.id.cardview_user);

      }
    }
 }

控制器类

    public class Controller {

    private static final String TAG = Controller.class.getSimpleName();
    private UserCallbackListener mListener;
    private ColleagueRestManager mApiManager;

    public Controller(UserCallbackListener listener) {
        mListener = listener;
        mApiManager = new ColleagueRestManager();
    }

    public void startFetching(){

        mApiManager.getColleagueApi().getColleague(new Callback<String>() {
            @Override
            public void success(String s, Response response) {
                Log.d(TAG, "JSON :: " + s);

                try {
                    JSONArray array = new JSONArray(s);

                    for(int i = 0; i < array.length(); i++) {
                        JSONObject object = array.getJSONObject(i);

                        ColleagueModel colleague = new ColleagueModel();
                        colleague.setName( object.optString( "name" ) );
                        colleague.setCompany(object.optString("company"));
                        colleague.setTitle(object.optString("title"));
                        colleague.setMail( object.optString("mail"));
                        colleague.setMobile(object.optString("mobile"));
                        colleague.setDepartment(object.optString("department"));

                        mListener.onFetchProgress(colleague);

                    }

                } catch (JSONException e) {
                    mListener.onFetchFailed();
                }


                mListener.onFetchComplete();
            }

            @Override
            public void failure(RetrofitError error) {
                Log.d(TAG, "Error :: " + error.getMessage());
                mListener.onFetchComplete();
            }
        });

    }
    public interface UserCallbackListener{
        void onFetchStart();
        void onFetchProgress(ColleagueModel user);
        void onFetchProgress(List<ColleagueModel> userList);
        void onFetchComplete();
        void onFetchFailed();
    }

}

主要活动

public class MyColleaguesPage extends AppCompatActivity implements Controller.UserCallbackListener/*MyColleaguesAdapter.ColleagueListListener*/ {

private RecyclerView recyclerView;
private MyColleaguesAdapter adapter;
private List<ColleagueModel> mColleagueList = new ArrayList<>();
private Controller mController;

private Realm colleagueRealm;

private LinearLayoutManager layoutManager;

private RealmResults<MyColleagueModel> colleagueResult;

private List<MyColleagueModel> filteredModelList;
private RealmChangeListener realmListener;
private static final String DIALOG_TAG = "EmployeeDialog";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.mycolleagues_layout);

    configViews();

    mController = new Controller(MyColleaguesPage.this);
    mController.startFetching();

    colleagueRealm = Realm.getDefaultInstance();


}

private void configViews() {
    recyclerView = this.findViewById(R.id.colleagues_recycler);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(MyColleaguesPage.this));
    recyclerView.setRecycledViewPool(new RecyclerView.RecycledViewPool());

    adapter = new MyColleaguesAdapter(mColleagueList,getApplicationContext());
    recyclerView.setAdapter(adapter);
}

}

RealmApplication Class

public class Application extends Application {

@Override
public void onCreate() {
    super.onCreate();

    Realm.init(this);
    RealmConfiguration realmConfiguration = new RealmConfiguration.Builder()
            .deleteRealmIfMigrationNeeded()
            .build();
    Realm.setDefaultConfiguration(realmConfiguration);
  }

领域模型

public class RealmUserModel extends RealmObject{
public static final String ID = "id";

private String id;
private String dn;
private String givenName;
private String whenChanged;
private String name;
private String mail;
private String updatedAt;
private String sn;
private String title;
private String department;
private String company;
private String mobile;

//getter and setter
}

1 个答案:

答案 0 :(得分:6)

1。)使用jsonschema2pojo.org

为json生成API响应类
public class EmployeeResponse {
    @SerializedName("_id")
    @Expose
    private String id;
    @SerializedName("dn")
    @Expose
    private String dn;
    @SerializedName("sn")
    @Expose
    private String sn;
    @SerializedName("title")
    @Expose
    private String title;
    @SerializedName("givenName")
    @Expose
    private String givenName;
    @SerializedName("whenChanged")
    @Expose
    private String whenChanged;
    @SerializedName("department")
    @Expose
    private String department;
    @SerializedName("company")
    @Expose
    private String company;
    @SerializedName("name")
    @Expose
    private String name;
    @SerializedName("mail")
    @Expose
    private String mail;
    @SerializedName("mobile")
    @Expose
    private String mobile;
    @SerializedName("updated_at")
    @Expose
    private String updatedAt;
       ....
}

2。)从http://square.github.io/retrofit/向您的项目添加Retrofit,这样您甚至不会考虑使用HttpUrlConnection

compile 'com.squareup.retrofit2:retrofit:2.3.0'
compile 'com.squareup.retrofit2:converter-gson:2.3.0'
compile 'com.google.code.gson:gson:2.8.1'

3.。)您定义了Retrofit界面

public interface ApiService {
    @GET("api/users")
    Call<List<User>> getUsers();
}

4。)通过Retrofit

创建ApiService实现
public class CustomApplication extends Application {
    // add to manifest ofc
    Retrofit retrofit;

    ApiService service;

    @Override
    public void onCreate() {
        super.onCreate();
        retrofit = new Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create())
            .baseUrl("https://app.com/")
            .build();

        service = retrofit.create(ApiService.class);
    }

    // get, get...
}

5.。)创建你的RealmObject

public class Employee extends RealmObject {
    private String id ;
    private String dn ;
    private String givenName ;
    private String whenChanged ;
    private String name ;
    private String mail ;
    private String updatedAt ; // maybe Date?
    private String sn ;
    private String title;
    private String department;
    private String company;
    private String mobile;

    //getter and setter method    
}

6。)创建映射来自api响应类

的数据的类
public class EmployeeMapper {
    Employee toEmployee(EmployeeResponse response) {
        // ...
       return employee;
    }
}

7。)将员工写入领域

try(Realm r = Realm.getDefaultInstance()) {
    r.executeTransaction((realm) -> {
        realm.insertOrUpdate(employees);
    });
}

8。)根据文档https://realm.io/docs/java/latest/#adapters

,通过RealmRecyclerViewAdapter收听Realm的更改
public class EmployeeAdapter extends RealmRecyclerViewAdapter<...