Почему база данных по-прежнему не может сохранить данные с помощью моего текущего TypeConverter? - PullRequest
0 голосов
/ 13 июля 2020

Я застрял в реализации TypeConverter в моей базе данных. Я добавил TypeConverters, но он по-прежнему говорит, что не может понять, как сохранить поле в базе данных. А может я что-то упустил? Я следил за этой статьей, чтобы создать TypeConverters (https://android.jlelse.eu/room-persistence-library-typeconverters-and-database-migration-3a7d68837d6c), что, насколько мне известно, пока что немного сложно понять. Любая помощь будет оценена!

MyGame. java:

package com.riceplant.capstoneproject.room;

import androidx.room.Entity;
import androidx.room.Ignore;
import androidx.room.PrimaryKey;

import com.riceplant.capstoneproject.data.Cover;
import com.riceplant.capstoneproject.data.Genre;
import com.riceplant.capstoneproject.data.Platform;
import com.riceplant.capstoneproject.data.ReleaseDate;
import com.riceplant.capstoneproject.data.Video;

import java.util.List;

@Entity(tableName = "game")
public class MyGame {

    @PrimaryKey(autoGenerate = true)
    private Integer mId;
    private Cover mCover;
    private String mName;
    private Double mPopularity;
    private String mSummary;
    private List<Genre> mGenres;
    private List<Platform> mPlatform;
    private Double mRating;
    private List<ReleaseDate> mReleaseDate;
    private List<Video> mVideos;

    @Ignore
    public MyGame() {
    }

    public MyGame(Integer id,
                  Cover cover,
                  String name,
                  Double popularity,
                  String summary,
                  List<Genre> genres,
                  List<Platform> platform,
                  Double rating,
                  List<ReleaseDate> releaseDate,
                  List<Video> videos) {
        mId = id;
        mCover = cover;
        mName = name;
        mPopularity = popularity;
        mSummary = summary;
        mGenres = genres;
        mPlatform = platform;
        mRating = rating;
        mReleaseDate = releaseDate;
        mVideos = videos;
    }

    public Integer getId() {
        return mId;
    }

    public void setId(Integer id) {
        id = mId;
    }

    public Cover getCover() {
        return mCover;
    }

    public void setCover(Cover cover) {
        cover = mCover;
    }

    public String getName() {
        return mName;
    }

    public void setName(String name) {
        name = mName;
    }

    public Double getPopularity() {
        return mPopularity;
    }

    public void setPopularity(Double popularity) {
        popularity = mPopularity;
    }

    public String getSummary() {
        return mSummary;
    }

    public void setSummary(String summary) {
        summary = mSummary;
    }

    public List<Genre> getGenres() {
        return mGenres;
    }

    public void setGenres(List<Genre> genres) {
        genres = mGenres;
    }

    public List<Platform> getPlatform() {
        return mPlatform;
    }

    public void setPlatform(List<Platform> platform) {
        platform = mPlatform;
    }

    public Double getRating() {
        return mRating;
    }

    public void setRating(Double rating) {
        rating = mRating;
    }

    public List<ReleaseDate> getReleaseDate() {
        return mReleaseDate;
    }

    public void setReleaseDate(List<ReleaseDate> releaseDate) {
        releaseDate = mReleaseDate;
    }

    public List<Video> getVideos() {
        return mVideos;
    }

    public void setVideos(List<Video> videos) {
        videos = mVideos;
    }
}

Конвертеры. java

package com.riceplant.capstoneproject.room;

import androidx.room.TypeConverter;

import com.riceplant.capstoneproject.data.Cover;
import com.riceplant.capstoneproject.data.Genre;
import com.riceplant.capstoneproject.data.Platform;
import com.riceplant.capstoneproject.data.Video;

public class Converters {
    @TypeConverter
    public static Cover toCover(String value) {
        return value == null ? null : new Cover();
    }

    @TypeConverter
    public static String toString(Cover value) {
        return value == null ? null : value.getUrl();
    }

    @TypeConverter
    public static Genre toGenre(String value) {
        return value == null ? null : new Genre();
    }

    @TypeConverter
    public static String toString(Genre value) {
        return value == null ? null : value.getName();
    }

    @TypeConverter
    public static Platform toPlatform(String value) {
        return value == null ? null : new Platform();
    }

    @TypeConverter
    public static String toString(Platform value) {
        return value == null ? null : value.getName();
    }

    @TypeConverter
    public static Video toString(String value) {
        return value == null ? null : new Video();
    }

    @TypeConverter
    public static String toVideo(Video value) {
        return value == null ? null : value.getVideoId();
    }
}

GameRoomDatabase. java

package com.riceplant.capstoneproject.room;

import android.content.Context;

import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;
import androidx.room.TypeConverters;

@Database(entities = {MyGame.class}, version = 3, exportSchema = false)
@TypeConverters({Converters.class})
public abstract class GameRoomDatabase extends RoomDatabase {
    private static final String LOG_TAG = GameRoomDatabase.class.getSimpleName();
    private static final Object LOCK = new Object();
    private static final String DATABASE_NAME = "gameslist";
    private static GameRoomDatabase sInstance;

    public static GameRoomDatabase getInstance(Context context) {
        if (sInstance == null) {
            synchronized (LOCK) {
                sInstance = Room.databaseBuilder(context.getApplicationContext(),
                        GameRoomDatabase.class, GameRoomDatabase.DATABASE_NAME)
                        .fallbackToDestructiveMigration()
                        .build();
            }
        }
        return sInstance;
    }

    public abstract GameDao gameDao();
}

GameDao. java

package com.riceplant.capstoneproject.room;

import androidx.lifecycle.LiveData;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Query;
import androidx.room.Update;

import java.util.List;

@Dao
public interface GameDao {

    @Query("SELECT * FROM game ORDER BY mId")
    LiveData<List<MyGame>> loadAllGames();

    @Insert
    void insertGame(MyGame myGame);

    @Update(onConflict = OnConflictStrategy.REPLACE)
    void updateGame(MyGame myGame);

    @Delete
    void deleteGame(MyGame myGame);

    @Query("SELECT * FROM game WHERE mId = :id")
    MyGame loadGameById(int id);
}

GameViewModel

package com.riceplant.capstoneproject.room;

import android.app.Application;

import androidx.annotation.NonNull;
import androidx.lifecycle.AndroidViewModel;
import androidx.lifecycle.LiveData;

import java.util.List;

public class GameViewModel extends AndroidViewModel {

    private LiveData<List<MyGame>> games;

    public GameViewModel(@NonNull Application application) {
        super(application);
        GameRoomDatabase database = GameRoomDatabase.getInstance(this.getApplication());
        games = database.gameDao().loadAllGames();
    }

    public LiveData<List<MyGame>> getGames() {
        return games;
    }
}

1 Ответ

2 голосов
/ 13 июля 2020

Ваша БД содержит списки Genre, Platform, ReleaseDate и Video. SQLite поддерживает типы столбцов INTEGER, REAL, TEXT и BLOB. Вы должны предоставить методы для преобразования ваших типов списков в / из String (TEXT) или одного из других поддерживаемых типов SQLite.

Например:

@TypeConverter
public static List<Genre> toGenreList(String value) {
    // TODO conversion code
}

@TypeConverter
public static String toString(List<Genre> value) {
    // TODO conversion code
}
...