依赖
"androidx.room:room-runtime:2.2.6" "androidx.room:room-compiler:2.2.6"
1.实体类
实体类需要保存到数据库的新类用@Entity注解表示
tableName是数据库中表的名字,my_advert可以根据自己需要自定义
@PrimaryKey,@NonNull主键不能为空
@Entity(tableName = "my_advert") public class MyAdvertBean { /** * 素材id, */ @PrimaryKey @NonNull private String moduleId; /** * 广告日期,一天一重置 */ private String date; /** * 存储广告的 */ private String message; @NonNull public String getModuleId() { return moduleId; } public void setModuleId(@NonNull String moduleId) { this.moduleId = moduleId; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; } }
2.定义数据库增删改查
关键注解:@Insert增,@Delete删,@Update改,@Query查
@Dao public interface MyAdvertDao { /** * 根据id查询保存的广告 * @param moduleId 模块id * @return */ @Query("select * from my_advert where moduleId = :moduleId LIMIT 1") MyAdvertBean queryMyAdvert(String moduleId); /** * 删除本地广告 * @param myAdvertBean 广告 */ @Delete void deleteAdvert(MyAdvertBean myAdvertBean); /** * 广告保存本地 * @param myAdvertBean 广告 */ @Insert(onConflict = OnConflictStrategy.REPLACE) void insertAdvert(MyAdvertBean myAdvertBean); /** * 更新本地广告信息 * @param myAdvertBean 广告 */ @Update void updateAdvert(MyAdvertBean myAdvertBean); }
3.数据库升级等操作Base,继承RoomDataBase
@Database注解用来标注数据库中有哪几张表,自己新加的MyAdvertBean加入里面 ,然后version增加版本1,从5到6
@TypeConverters是用来list数据存储
数据库版本原来是5,我需要插入新的表,执行MIGRATION_5_6,版本需要加1
@Database(entities = {UserEntity.class, BrowseRecordEntity.class, MyAdvertBean.class}, version = 6) @TypeConverters({BaseObjDataConvert.class}) public abstract class UserDatabase extends BaseDatabase { public abstract UserDao getUserDao(); public abstract BrowseRecordDao getRecordDao(); public abstract MyAdvertDao getMyAdvertDao(); private static UserDatabase instance; public static UserDatabase getInstance() { if (instance == null) { synchronized (UserDatabase.class) { if (instance == null) { instance = Room.databaseBuilder(Utils.getApp(), UserDatabase.class, "shandian") .addMigrations(MIGRATION_2_3, MIGRATION_3_4, MIGRATION_4_5,MIGRATION_5_6) .allowMainThreadQueries().build(); } } } return instance; } static final Migration MIGRATION_2_3 = new Migration(2, 3) { @Override public void migrate(@NonNull SupportSQLiteDatabase database) { database.execSQL("alter table user add column sex TEXT"); database.execSQL("alter table user add column birthday TEXT"); database.execSQL("alter table user add column signature TEXT"); database.execSQL("alter table user add column totalScore Text"); database.execSQL("alter table user add column score Text"); } }; static final Migration MIGRATION_3_4 = new Migration(3, 4) { @Override public void migrate(@NonNull SupportSQLiteDatabase database) { database.execSQL("CREATE TABLE IF NOT EXISTS browse_record (type TEXT, articleId TEXT PRIMARY KEY NOT NULL,opentype TEXT," + "param TEXT,title TEXT,publish_at_time INTEGER NOT NULL DEFAULT 0)"); } }; static final Migration MIGRATION_4_5 = new Migration(4, 5) { @Override public void migrate(@NonNull SupportSQLiteDatabase database) { database.execSQL("alter table browse_record add column browse_time INTEGER NOT NULL DEFAULT 0"); } }; /** * 广告数据库表 */ static final Migration MIGRATION_5_6 = new Migration(5, 6) { @Override public void migrate(@NonNull SupportSQLiteDatabase database) { database.execSQL("CREATE TABLE IF NOT EXISTS my_advert (date TEXT, moduleId TEXT PRIMARY KEY NOT NULL,message TEXT)"); } }; }
public class BaseObjDataConvert{ @TypeConverter public NavconfigBean revert(String data) { try { return GsonUtils.fromJson(data, NavconfigBean.class); } catch (Exception e) { e.printStackTrace(); } return null; } @TypeConverter public String convert(NavconfigBean data) { return GsonUtils.toJson(data); } }