参考资料:
https://blog.csdn.net/qq_24442769/article/details/79412408
https://blog.csdn.net/yu75567218/article/details/79151855
一、引入依赖库
1、添加google的maven库,在project的gradle文件:
allprojects {
repositories {
google() // 添加谷歌maven库 -- 新建工程一般默认
jcenter()
}
}
2、在app.gradle中添加 ROOM 依赖库:
implementation "android.arch.persistence.room:runtime:1.1.0-beta2"
annotationProcessor "android.arch.persistence.room:compiler:1.1.0-beta2"
二、创建Entity 实体类
@Entity(tableName = "Users") 标注实体类 tableName属性表示数据库中的表名
@ColumnInfo(name = "UserId") 字段名称,可修改数据表中显示的字段名称,默认为属性名
@NonNull 设置非空
@PrimaryKey 标注为主键(主键一般为非空属性)
@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;
}
}
三、创建Dao
这个组件代表了一个用来操作表增删改查的dao。被注解@Database的类必须包含一个没有参数的且返回注解为@Dao的类的抽象方法。在编译时,Room创建一个这个类的实现。
一个Dao中可以操作 多个表
可以通过一个Dao来操作所有的表,也可以一个表对应一个Dao(将Dao与Entity一一对应)
对数据库的具体操作:
@Dao 注解必须添加
@Dao
public interface UserDao {
/* User */
@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);
/* Fruit */
@Insert
void addFruit(Fruit fruit);
@Insert
void addAllFruit(List<Fruit> fruitList);
@Query("SELECT * FROM Fruit")
List<Fruit> getFruits();
}
四、创建 数据库
@Database(entities = {User.class}, version = 1)
entities -- 数据库中的表
version -- 数据库的版本号
/升级数据库的方法 后面再讲/
@Database(entities = {User.class}, version = 1)
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) {
// 因为表没有发生变化,所以这里什么也不做
database.execSQL("CREATE TABLE `Fruit` (`FruitId` INTEGER NOT NULL, "
+ "`FruitName` TEXT, PRIMARY KEY(`FruitId`))");
}
}
public abstract UserDao getUserDao();
}
五、在应用中使用
初始化数据库:
public class AppContext extends Application {
public static MyDataBase myDataBase;
@Override
public void onCreate() {
super.onCreate();
initDataBase();
}
/* 初始化 数据库 */
private void initDataBase() {
myDataBase = Room.databaseBuilder(getApplicationContext(), MyDataBase.class, "User.db").build();
}
}
在具体使用时:
通过database获取UserDao来执行具体的数据库操作(注意:需要在工作线程中执行)
User user = new User("zzx");
AppContext.myDataBase.getUserDao().addUser(user);
如果想在主线程中执行操作需要在初始化时添加:
/* 初始化 数据库 */
private void initDataBase() {
myDataBase = Room.databaseBuilder(getApplicationContext(), MyDataBase.class, "User.db").addMigrations(MyDataBase.MIGRATION_1_2)
.allowMainThreadQueries()//允许在主线程查询数据
.build();
}
六、升级数据库
添加新表
1、在Database类中 添加新增的表对应的实体类entities = {User.class , BookInfo.class}
并增加版本号
2、在Migration 类的具体实现中添加语句增加表
注意:主键的非空属性,否则会报异常
@Database(entities = {User.class , Fruit.class}, version = 2)
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) {
// 因为表没有发生变化,所以这里什么也不做
database.execSQL("CREATE TABLE `Fruit` (`FruitId` INTEGER NOT NULL, "
+ "`FruitName` TEXT, PRIMARY KEY(`FruitId`))");
}
};
public abstract UserDao getUserDao();
}
3、在初始化数据库时添加addMigrations方法:
public class AppContext extends Application {
public static MyDataBase myDataBase;
@Override
public void onCreate() {
super.onCreate();
initDataBase();
}
/* 初始化 数据库 */
private void initDataBase() {
myDataBase = Room.databaseBuilder(getApplicationContext(), MyDataBase.class, "User.db").addMigrations(MyDataBase.MIGRATION_1_2).build();
}
}
再次感谢网友们的无私分享!
参考资料:
https://blog.csdn.net/qq_24442769/article/details/79412408
https://blog.csdn.net/yu75567218/article/details/79151855