Я считаю, что ваша проблема с: -
for (int k = 0; k < genresArray.length(); k++) {
insertValues.put(Movie.GENRE, genres.get(k));
}
Это приведет к тому, что будет вставлено только последнее значение в цикле, поскольку имя ключа / столбца (первый параметр позиции) не изменится (и, вероятно, не сможет, поскольку у вас есть только один столбец).
Вы можете использовать: -
StringBuilder sb = new StringBuilder();
for (int k = 0; k < genresArray.length(); k++) {
if (k > 0) {
sb.append(",");
}
sb.append(genres.get(k));
}
insertValues.put(Movie.GENRE, sb.toString());
- Обратите внимание, что приведенный выше код является принципиальным кодом. Он не был протестирован или запущен и поэтому может содержать ошибки.
Это вставит все данные в виде CSV в столбец GENRE.
НО это не очень хороший способ использования баз данных. Было бы намного лучше, если бы жанр был отдельной таблицей и, вероятно, использовалась таблица сопоставления (но это должен быть другой вопрос).
Это также вызовет у вас проблемы: -
if (cursor.moveToFirst()) {
do {
Movie movie = new Movie();
movie.setMovieId(Integer.parseInt(cursor.getString(cursor.getColumnIndex(Movie.ID))));
movie.setTitle(cursor.getString(cursor.getColumnIndex(Movie.TITLE)));
movie.setImageUrl(cursor.getString(cursor.getColumnIndex(Movie.IMAGE_URL)));
movie.setRating(cursor.getDouble(cursor.getColumnIndex(Movie.RATING)));
movie.setReleaseYear(cursor.getInt(cursor.getColumnIndex(Movie.RELEASE_YEAR)));
List<String> genreArray = new ArrayList<>();
while(cursor.moveToNext()){
String genre = cursor.getString(cursor.getColumnIndex(Movie.GENRE));
genreArray.add(genre);
}
movie.setGenre(Collections.singletonList(String.valueOf(genreArray)));
// Adding a movie to the list
moviesList.add(movie);
} while (cursor.moveToNext());
То есть вы перемещаетесь в первую строку курсора, извлекаете некоторые данные MoveieId, Title ... ReleaseYear.
Тогда
a) если есть какие-либо другие строки, которые вы перемещаете к следующей (что будет для другого фильма) и к следующей, пока вы, наконец, не достигнете последней строки, добавляя элементы в genreArray.
или
b) Если в Cursor есть только одна строка, то в GenreArray массив пуст.
Затем вы добавляете единственный фильм в список movieList и возвращаетесь.
1 ход (строка) в Курсоре будет существовать для каждого фильма, и в каждом фильме будет только 1 столбец ЖАНР. Вы должны извлечь данные из этого столбца, а затем разбить данные в genreArray без перемещения (см. Предыдущее исправление, которое создаст CSV (обратите внимание, что это может привести к ошибкам, если данные содержат запятые)).
ЕСЛИ вы использовали предыдущее исправление и сохранили несколько жанров в формате CSV, то вы можете использовать: -
if (cursor.moveToFirst()) {
do {
Movie movie = new Movie();
movie.setMovieId(Integer.parseInt(cursor.getString(cursor.getColumnIndex(Movie.ID))));
movie.setTitle(cursor.getString(cursor.getColumnIndex(Movie.TITLE)));
movie.setImageUrl(cursor.getString(cursor.getColumnIndex(Movie.IMAGE_URL)));
movie.setRating(cursor.getDouble(cursor.getColumnIndex(Movie.RATING)));
movie.setReleaseYear(cursor.getInt(cursor.getColumnIndex(Movie.RELEASE_YEAR)));
List<String> genreArray = new List<>(Arrays.asList((cursor.getString(cursor.getColumnIndex(Movie.GENRE))).split(",",0)));
movie.setGenre(Collections.singletonList(String.valueOf(genreArray)));
// Adding a movie to the list
moviesList.add(movie);
} while (cursor.moveToNext());
- Обратите внимание, что приведенный выше код является принципиальным кодом. Он не был протестирован или запущен и поэтому может содержать ошибки.