Room @Insert не вставляет все записи - PullRequest
0 голосов
/ 16 мая 2018

У меня проблема с вставкой только 1 записи в мою базу данных SQLite.

Когда я выполняю 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 в жанр [].Я могу успешно выполнить цикл по жанру [] и подтвердить, что результаты возвращаются более 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());
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...