1、导包:
implementation "androidx.room:room-runtime:2.2.3" annotationProcessor 'android.arch.persistence.room:compiler:1.1.1'
2、添加数据库
@Database(entities = {User.class}, version = 1, exportSchema = false) public abstract class MyDataBase extends RoomDatabase { public abstract UserDao getUserDao(); }
3、Application里面初始化
public class AppContext extends Application { public static MyDataBase myDataBase; @Override public void onCreate() { super.onCreate(); initDataBase(); } /* 初始化 数据库 */ private void initDataBase() { Log.v("fwling", "初始化数据库"); myDataBase = Room.databaseBuilder(getApplicationContext(), MyDataBase.class, "User.db") .build(); } }
4、建立实体类(get和set方法一定要加上)
@Entity(tableName = "Users") public class User { @NonNull @PrimaryKey @ColumnInfo(name = "UserId") private String uuid; @ColumnInfo(name = "UserName") private String userName; @ColumnInfo(name = "Date") private String date; @Ignore public User(String userName) { this.uuid = UUID.randomUUID().toString(); this.userName = userName; this.date = SimpleDateFormat.getDateInstance().format(new Date(System.currentTimeMillis())); } public User(String uuid, String userName, String date) { this.uuid = uuid; this.userName = userName; this.date = date; } public String getUuid() { return uuid; } public void setUuid(String uuid) { this.uuid = uuid; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } }
5、添加UserDao
@Dao public interface UserDao { @Query("SELECT * FROM Users") List<User> getUsers(); @Insert void addUser(User user); @Insert void addAll(List<User> userList); @Delete int deleteUser(User user); @Update int updateUser(User user); }
6、使用
获取数据 List<Fruit> users = AppContext.myDataBase.getFruitDao().getFruits(); 插入数据 User user = new User(et.getText().toString()); AppContext.myDataBase.getUserDao().addUser(user); 需要注意的是:数数据库所有的操作都需要在子线程种运行。这里可以配合RxJava来使用
数据库的操作就到这里,结束了。
下面来看一下数据库的升级管理
此次升级,增加了一张Fruit表
1、添加
@Database(entities = {User.class, Fruit.class}, version = 2, exportSchema = false) public abstract class MyDataBase extends RoomDatabase { /* 升级数据库的方法 -- 当前为从 版本1 升级到 版本2 */ public static final Migration MIGRATION_1_2 = new Migration(1, 2) { @Override public void migrate(SupportSQLiteDatabase database) { // 这里新创建一个Fruit表 database.execSQL("CREATE TABLE `Fruit` (`FruitId` INTEGER NOT NULL, " + "`FruitName` TEXT, PRIMARY KEY(`FruitId`))"); } }; public abstract UserDao getUserDao(); public abstract FruitDao getFruitDao(); } 需要变化的点: 1、表,entities 的注解里面多了一个Fruit表 2、版本号+1 =2 3、添加了一个Migration 、MIGRATION_1_2表示从1升到2的时候需要做的所有操作 4、添加了一个新表对应的FruitDao
2、添加实体类和相应的Dao
实体类: @Entity(tableName = "Fruit") public class Fruit { @NonNull @PrimaryKey @ColumnInfo(name = "FruitId") private Integer FruitId; @ColumnInfo(name = "FruitName") private String FruitName; public Fruit() { this.FruitName = "default_Fruit_Name"; } @Ignore public Fruit(String FruitName) { this.FruitName = FruitName; } @NonNull public Integer getFruitId() { return FruitId; } public void setFruitId(@NonNull Integer fruitId) { FruitId = fruitId; } public String getFruitName() { return FruitName; } public void setFruitName(String fruitName) { FruitName = fruitName; } } DAO: @Dao public interface FruitDao { @Query("SELECT * FROM Fruit") List<Fruit> getFruits(); @Insert void addFruit(Fruit fruit); }
3、添加升级操作
public class AppContext extends Application { public static MyDataBase myDataBase; @Override public void onCreate() { super.onCreate(); initDataBase(); } /* 初始化 数据库 */ private void initDataBase() { Log.v("fwling", "初始化数据库"); myDataBase = Room.databaseBuilder(getApplicationContext(), MyDataBase.class, "User.db") .addMigrations(MyDataBase.MIGRATION_1_2) .build(); } } 多了一行:.addMigrations(MyDataBase.MIGRATION_1_2)