赞
踩
Room是Google提供的ORM(对象关系映射)库,简单介绍一下ORM,我们使用的编程语言是面向对象语言,而使用的数据库是关系型数据库,将面向对象的语言和面向关系的数据库之间建立一种映射关系,就是ORM。
Room提供了三个重要的部分:
@Entity:用于定义封装实际数据的实体类,每个实体类都会在数据库中有一张对应的表,并且表中的列是根据实体类中的字段自动生成的。
@Dao:Dao是访问对象的意思,通常在这对数据库的各项操作进行封装,在实际编程时,逻辑层就不需要和底层数据库打交道了,数据库操作直接在Dao层进行交互即可。(类似三层解耦)
@Database:用于定义数据库中的关键信息,包括数据库的版本号、包含哪些实体类以及提供Dao层的访问实例。
implementation("androidx.room:room-runtime:2.6.1")
annotationProcessor("androidx.room:room-compiler:2.6.1")
在类上使用@Entity注解,表示将它声明成一个实体类。Room会利用使用到@Entity注解的类的所有字段来创建表的列,如果存在不希望存储的字段,在其上面添加@Ingore注解即可。
@Entity
class User {
@PrimaryKey
public int id;
public String firstName;
public String lastName;
@Ignore
Bitmap picture;
//getter/setter方法
}
默认情况下Room使用类名作为表名,使用字段名作为列名,但Room允许我们使用@Entity的tableName属性来指定表名,使用@ColumnInfo的name属性来指定列名
@Entity(tableName = "users")//将表名指定为users class User { @PrimaryKey public int id; @ColumnInfo(name = "first_name") public String firstName; @ColumnInfo(name = "last_name") public String lastName; @Ignore Bitmap picture; //getter、setter方法 }
每个Room实体都必须定义一个主键,用于表示相应数据库表中的每一行,Room给我们提供了一个@PrimaryKey来定义主键
@PrimaryKey(autoGenerate = true)//设置为true,表示让SQlite生成唯一的ID,从1开始(即添加一个主键)
public int id;
Dao层是用来专门与数据库进行交互的,里面都是关于操作数据库的代码,所有访问数据库的操作都在这里进行封装。
@Dao
interface UserDao{
@Insert
public Long insertUser(User user);
@Update
public void updateUser(User user);
@Delete
public void deleteUser(User user);
@Query("select * from users")
public List<User> queryUser();
}
Room提供了@Insert、@Delete、@Update、@Query注解,分别表示增删改查。
其中@Insert、@Delete、@Update是不需要我们编写SQL语句的:
关于@Query注解,因为Room具体无法知道我们想从数据库中查询哪些数据,所以必须编写SQL语句
注意:在Room中引用查询条件的格式是字段名称=:引用值,例如根据id查询User
@Query("select * from users where id=:id")
public void queryById(int id);
另外需要我们注意的是要根据非实体类内的数据(表示@Entity注解标识的类中的字段)进行数据库操作时,只能使用@Query且必须编写SQL语句,如我们要根据非实体类中的state删除User
@Query("delete from users where state=:state")
public void deleteByState(int state);
最后:Room支持编译时动态检查SQL语句语法,如果SQL语句写错了,编译就会直接报错,不会将错误隐藏到运行之后才发现。
数据库类必须满足的条件:
如下定义了一个用于保存数据库的AppDatabase类。
@Database(entities={User.class},version=1)
public abstract class AppDatabse extend RoomDatabase{
public abstract UserDao userDao();
}
使用:创建数据库实例并获取Dao对象调用其方法
AppDatabase db=Room.databaseBuilder(getApplicationContext(),AppDatabase.class,"数据库名称").build();
UserDao userDao=db.userDao;
//调用UserDao的方法
@Entity(tableName = "users") public class User { @PrimaryKey(autoGenerate = true) private int id; private int age; private String name; private String gender; public int getId() {return id;} public void setId(int id) {this.id = id;} public int getAge() {return age;} public void setAge(int age) {this.age = age;} public String getName() {return name;} public void setName(String name) {this.name = name;} public String getGender() {return gender;} public void setGender(String gender) {this.gender = gender;} }
@Dao
public interface UserDao{
//添加数据
@Insert
Long insertUser(User user);
@Query("select * from users")
List<User> queryUser();
//根据id查询数据
@Query("select * from users where id=:id")
User queryById(int id);
}
@Database(entities = {User.class},version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
public class MainActivity extends AppCompatActivity { AppDatabase db; UserDao userDao; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); db= Room.databaseBuilder(getApplicationContext(),AppDatabase.class,"test") .allowMainThreadQueries() .build(); userDao= db.userDao(); Button create=(Button) findViewById(R.id.cerate); create.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { User user=new User(); user.setAge(18); user.setName("zhangsan"); user.setGender("男"); Long id=userDao.insertUser(user); Log.d("MainActivity", String.valueOf(id)); } }); Button look=(Button) findViewById(R.id.look); look.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { User user=userDao.queryById(1); Log.d("MainActivity", user.getName()); Log.d("MainActivity", String.valueOf(user.getAge())); Log.d("MainActivity", user.getGender()); } }); Button update=(Button) findViewById(R.id.update); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。