【问题标题】:Why can't the database still not save the data with my current TypeConverter?为什么数据库还是不能用我当前的 TypeConverter 保存数据?
【发布时间】:2020-07-13 15:33:32
【问题描述】:

我坚持在我的数据库中实现 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;
    }
}

Converters.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);
}

游戏视图模型

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;
    }
}

【问题讨论】:

    标签: java android android-room typeconverter


    【解决方案1】:

    您的数据库包含GenrePlatformReleaseDateVideo 的列表。 SQLite 支持 INTEGER、REAL、TEXT 和 BLOB 的列类型。您必须提供将 List 类型转换为 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
    }
    

    【讨论】:

    • 非常感谢,我会努力解决的:)
    猜你喜欢
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    • 2012-07-05
    • 2012-02-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多