如何在从服务器获取数据后将数据存储在Room数据库中

6
我正在使用 Retrofit2 和 Rxjava2 作为我的 Android 应用程序的网络库,以及 NodeJS 和 MongoDB 作为后端服务。我想从服务器获取数据并将数据存储在 Room 数据库中,以便用户再次打开应用程序时从 Room 而不是从服务器获取数据,直到服务器上添加了一些新数据。
到目前为止,我已经成功地从服务器获取了数据,并在 RecyclerView 中显示了它。
我的目标是:
1)在从服务器获取数据后将其存储在 Room 数据库中。
2)在服务器更新一些新数据之前,从 Room 数据库中显示数据。
以下是我的代码:
ApiService.java
public interface ApiService {

@POST("retrofitUsers")
@FormUrlEncoded
Observable<String> saveData(@Field("name") String name,
                             @Field("age") String age);

@GET("getUsers")
Observable<List<BioData>> getData();

}

RetrofitClient.java

public class RetrofitClient {

private static Retrofit retrofit = null;

public static Retrofit getInstance(){

    if(retrofit == null)
        retrofit = new Retrofit.Builder()
                .baseUrl("https://bookbudiapp.herokuapp.com/")
                .addConverterFactory(GsonConverterFactory.create(new GsonBuilder().setLenient().create()))
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
                .build();

    return retrofit;

}

private RetrofitClient(){

}
}

BioData.java

public class BioData {

@SerializedName("name")
@Expose
private String name;

@SerializedName("age")
@Expose
private String age;

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getAge() {
    return age;
}

public void setAge(String age) {
    this.age = age;
}
}

MainActivity.java

public class Users extends AppCompatActivity {

RecyclerView recycle;
UserAdapter adapter;
List<BioData> list;
CompositeDisposable compositeDisposable;

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

    recycle = findViewById(R.id.recycle);
    recycle.setHasFixedSize(true);
    recycle.setLayoutManager(new LinearLayoutManager(this));

    list  = new ArrayList<>();

    compositeDisposable = new CompositeDisposable();

    fetchData();
}

    private void fetchData(){

    Retrofit retrofit  = RetrofitClient.getInstance();
    ApiService myApi = retrofit.create(ApiService.class);

    Disposable disposable = myApi.getData().subscribeOn(Schedulers.io())
                                           .observeOn(AndroidSchedulers.mainThread())
                                           .subscribe(new Consumer<List<BioData>>() {
                                               @Override
                                               public void accept(List<BioData> bioData) throws Exception {

                                                   adapter = new UserAdapter(bioData,getApplicationContext());
                                                   recycle.setAdapter(adapter);
                                               }
                                           });


    compositeDisposable.add(disposable);

}

@Override
protected void onStop() {
    super.onStop();

   compositeDisposable.clear();

  }
}

我该如何在我的应用中添加Room数据库,请告诉我,我对此一无所知,任何帮助将不胜感激。

谢谢!


你有没有查看官方文档和代码示例?https://developer.android.com/topic/libraries/architecture/ 从那里,你可以访问各种样本。即使是基本示例(https://github.com/googlesamples/android-architecture-components/tree/master/BasicSample)也谈到了这一点,并且在从Room提供结果之前_模拟_人工延迟(网络)。 - Martin Marconcini
请检查以下链接:https://codelabs.developers.google.com/codelabs/android-room-with-a-view-kotlin/index.html?index=..%2F..index#0 - Basi
1个回答

1

Android开发者为Room提供了一个很好的入门教程:https://developer.android.com/training/data-storage/room/index.html

对于您想要添加的功能,使用仓库模式会很好。简单来说,仓库模式就像是应用程序和服务器之间的一个类,在这个类中您可以请求一些数据(例如用户名),而应用程序不知道这些数据来自哪里(数据库或服务器)。然后仓库会做出类似以下操作:

class UserRepository {

  public User getUser() {
     User user = db.userDao().getUser() //Room sintax
      if(user==null){
         //access to server and get user object
         db.userDao().insert(user)
      }
      return db.userDao().getUser()
  }
}

这使得应用程序可以解耦,例如,如果您将来想要更改服务器,则只需更改存储库类,其余应用程序将保持不变。我建议您进行调查。您还应该使用存储库应实现的接口,这样可以进一步解耦。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接