我遇到的问题是,我的Room SQLite DB中只插入了1条记录。
当我执行getAll();
时,结果只返回1条记录。
发现问题:Genre[] genres = gson.fromJson(jsonArray.toString(), Genre[].class);
上面这一行将所有“gid”值设置为0,我不知道如何更改它。
Genre.java
@Entity(indices = {@Index(value = {"id", "name"}, unique = true)})
public class Genre {
@PrimaryKey
private int gid;
//@ColumnInfo(name = "id") By Default - No need to annotate
@NonNull
private int id;
private String name;
public int getGid() {
return gid;
}
public void setGid(int gid) {
this.gid = gid;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
GenreDao.java
@Dao
public interface GenreDao {
@Query("SELECT * FROM Genre")
LiveData<List<Genre>> getAll();
@Insert(onConflict = OnConflictStrategy.REPLACE) //If there is a conflict, replace the record.
void insertAll(Genre... genres);
}
GenreRepository.java
public class GenreRepository {
private final GenreDao genreDao;
public GenreRepository(GenreDao genreDao) {
this.genreDao = genreDao;
}
//Database Methods
public void insertAll(Genre... genres) {
AsyncTask.execute(() -> { //Same as new Runnable()
genreDao.insertAll(genres);
});
}
public LiveData<List<Genre>> getAll() {
return genreDao.getAll();
}
}
APIUtil.java - getGenres()方法
此类进行API调用,返回正确的结果,将JSONArray转换为Genre []。我可以成功遍历Genre []并确认10+结果回来。
public static void getGenres(Context context) {
APIWrapper wrapper = new APIWrapper(context, API_KEY);
Parameters params = new Parameters();
params.addFields(GENRE_FIELDS);
params.addLimit("50");
wrapper.genres(params, new onSuccessCallback() {
@Override
public void onSuccess(JSONArray jsonArray) {
Gson gson = new Gson();
Genre[] genres = gson.fromJson(jsonArray.toString(), Genre[].class);
//Insert DB
AppDatabase db = AppDatabase.getAppDatabase(context);
GenreRepository genreRepository = new GenreRepository(db.genreDao());
genreRepository.insertAll(genres);
}
@Override
public void onError(VolleyError volleyError) {
Log.e("GENRES ERROR:", volleyError.toString());
}
});
}
GenreViewModel.java
public class GenreViewModel extends ViewModel {
private GenreRepository genreRepository;
public GenreViewModel(GenreRepository genreRepository) {
this.genreRepository = genreRepository;
}
public void insertAll(Genre... genres){
genreRepository.insertAll(genres);
}
public LiveData<List<Genre>> getAll(){
return genreRepository.getAll();
}
}
SearchFragment.java
这是我检索数据库值的地方。这个for循环只返回1个结果。
AppDatabase db = AppDatabase.getAppDatabase(getActivity());
GenreRepository genreRepository = new GenreRepository(db.genreDao());
GenreViewModel genreViewModel = new GenreViewModel(genreRepository);
genreViewModel.getAll().observe(this, genres -> { //new Observer<List<Genre>>()
for(Genre g : genres){
Log.e("GENRE", g.getName());
}
});
答案 0 :(得分:0)
public void insertAll(Genre... genres){
genreRepository.insertAll(genres);
}
这是您的错误,您提供的方法定义以及您在调用时提供的内容。看你做错了什么。
解决方案
void insertAll(List<T> obj);
您可以尝试将数组转换为列表并放在上面的定义中
答案 1 :(得分:-1)
我也遇到了这个问题。 并以此方式解决了该问题。
问题是来自服务器的id
是mongoId
和String
,所以我应该创建一个int primary key
并将currentTime
作为值传递给它因此数据库可以插入所有文件,而不必替换。
但是您应该考虑使用System.nanoTime()
方法而不是System.currentTimeMillis()
,因为有时它会生成相同的值,然后在房间内替换它们,而不是插入其中的每一个。