@Insert会议室不会插入所有记录

时间:2018-05-16 03:28:36

标签: java android android-room

我遇到的问题是,我的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());
    }
});

2 个答案:

答案 0 :(得分:0)

public void insertAll(Genre... genres){
    genreRepository.insertAll(genres);
}

这是您的错误,您提供的方法定义以及您在调用时提供的内容。看你做错了什么。

解决方案

 void insertAll(List<T> obj);

您可以尝试将数组转换为列表并放在上面的定义中

答案 1 :(得分:-1)

我也遇到了这个问题。 并以此方式解决了该问题。

问题是来自服务器的idmongoIdString,所以我应该创建一个int primary key并将currentTime作为值传递给它因此数据库可以插入所有文件,而不必替换。 但是您应该考虑使用System.nanoTime()方法而不是System.currentTimeMillis(),因为有时它会生成相同的值,然后在房间内替换它们,而不是插入其中的每一个。