Room简述:
Room 在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。
处理大量结构化数据的应用可极大地受益于在本地保留这些数据。最常见的用例是缓存相关数据。这样,当设备无法访问网络时,用户仍可在离线状态下浏览相应内容。设备之后重新连接到网络后,用户发起的所有内容更改都会同步到服务器。
由于 Room 负责为您处理这些问题,因此我们强烈建议您使用 Room(而不是 SQLite)。不过,如果您想直接使用 SQLite API,请参阅使用 SQLite 保存数据。
Room 包含 3 个主要组件:
数据库:包含数据库持有者,并作为应用已保留的持久关系型数据的底层连接的主要接入点。
使用 @Database 注释的类应满足以下条件:
是扩展 RoomDatabase 的抽象类。
在注释中添加与数据库关联的实体列表。
包含具有 0 个参数且返回使用 @Dao 注释的类的抽象方法。
在运行时,您可以通过调用 Room.databaseBuilder() 或 Room.inMemoryDatabaseBuilder() 获取 Database 的实例。
Entity:表示数据库中的表。
DAO:包含用于访问数据库的方法。
应用使用 Room 数据库来获取与该数据库关联的数据访问对象 (DAO)。然后,应用使用每个 DAO 从数据库中获取实体,然后再将对这些实体的所有更改保存回数据库中。最后,应用使用实体来获取和设置与数据库中的表列相对应的值。
room关系图
这些是room的一些简单简介:当然童鞋门也可以到官网去阅读,传送门
接下来就开始我们的实战操作吧!
当然开始之前我已经做了一些前期的准备工作,创建了两个fragment界面,并添加了一些简单的布局文件,来实现我们的room操作:如图
这个界面是进行数据的查询显示和数据删除操作的。
这个界面是进行数据的添加的。
下面我们正式开始我门的示例了。
1:首先创建我门的entity类:代码如下:
@androidx.room.Entity(tableName ="works")//设置数据库表单名
public class WorkEntity {
@PrimaryKey(autoGenerate =true)//设置数据条目自增模式
private int id;
@ColumnInfo(name ="acount")
private String acount;
@ColumnInfo(name ="name")//设置表单字段名,不设置自动以属性名作为字段名
private String name;
public WorkEntity(String acount, String name) {
this.acount =acount;
this.name =name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id =id;
}
public String getAcount() {
return acount;
}
public void setAcount(String acount) {
this.acount =acount;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name =name;
}
@Override
public String toString() {
return "WorkEntity{" +
"id=" +id +
", acount='" +acount +'\'' +
", name='" +name +'\'' +
'}';
}
}
2:创建好了entity之后我门开始第二步的Dao类的创建并写上增删改查方法,具体代码如下:
@Dao
public interface WorkDao {
@Insert
void insert(WorkEntity...workEntities);//三个...表示可以多个添加
@Update
void update(WorkEntity...workEntities);
@Delete
void delete(WorkEntity...workEntities);
@Query("select *from works")
Listgeworks();
@Query("delete from works")
void deleteAll();
}
3:第二部创建好了Dao类之后我们开始创建Databese类,具体代码如下:
@Database(entities = {WorkEntity.class},version =1,exportSchema =false)//entityties表示类,//version 数据库的版本,exportSchema 提供导出目录
public abstract class WorkDatabase extends RoomDatabase {
public abstract WorkDao getWorkDao();
}
4:进行到这里我们的room的准备工作基本就算完成了,接下来就是怎样来使用了。现在我门创建Repository层,具体的代码如下:
public class WorkRepository {
public static volatile WorkRepository instance;
private WorkDao workDao;
private WorkDatabase workDatabase;
public WorkRepository(Context context){
//一般数据查询是一直用耗时操作,都在子线程中进行,我这里为了方便,所以添加了allowMainThreadQueries()允许在主线程中操作。
workDatabase=Room.databaseBuilder(context,WorkDatabase.class,"work_db").allowMainThreadQueries().build();
workDao=workDatabase.getWorkDao();
}
//单例模式
public static WorkRepository getInstance(Context context){
if(null==instance){
synchronized (WorkRepository.class){
if(null==instance){
instance=new WorkRepository(context);
}
}
}
return instance;
}
public WorkDao getWorkDao(){
return workDao;
}
}
创建好Repository层之后就正式使用了,我门先到add_fragment中写添加数据的逻辑。具体的代码如下:
public class AddFragment extends Fragment {
private AddViewModel mViewModel;
public static AddFragment newInstance() {
return new AddFragment();
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.add_fragment, container, false);
}
private EditText acount_et, name_et;
private String acount, name;
private Button coomit;
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mViewModel =ViewModelProviders.of(this).get(AddViewModel.class);
acount_et= getView().findViewById(R.id.acount_et);
name_et= getView().findViewById(R.id.name_et);
coomit= getView().findViewById(R.id.coomit);
// TODO: Use the ViewModel
coomit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
acount=acount_et.getText().toString();
name=name_et.getText().toString();
insert();
final NavController navController=Navigation.findNavController(getView());
navController.navigate(R.id.action_addFragment2_to_workFragment2);
}
});
}
private void insert() {
WorkRepository.getInstance(getContext()).getWorkDao().insert(new WorkEntity(acount,name));
}
}
然后我们到work_frament中添加查询数据的逻辑,具体的代码如下:
public class WorkFragment extends Fragment {
private WorkViewModel mViewModel;
public static WorkFragment newInstance() {
return new WorkFragment();
}
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
@Nullable Bundle savedInstanceState) {
return inflater.inflate(R.layout.work_fragment, container, false);
}
private Button search,delete_all;
private TextView xiansi;
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
mViewModel =ViewModelProviders.of(this).get(WorkViewModel.class);
final NavController navController=Navigation.findNavController(getView());
// TODO: Use the ViewModel
search= getView().findViewById(R.id.search_all);
delete_all= getView().findViewById(R.id.delete_all);
xiansi= getView().findViewById(R.id.xianshi_tv);
getView().findViewById(R.id.add_btn).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
navController.navigate(R.id.action_workFragment2_to_addFragment2);
}
});
search.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
searcha();
}
});
delete_all.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
WorkRepository.getInstance(getContext()).getWorkDao().deleteAll();
}
});
}
private void searcha() {
Listgeworks =WorkRepository.getInstance(getContext()).getWorkDao().geworks();
xiansi.setText(geworks.toString());
}
}
到这里一个简单的Room使用示例就算基本完成了。我们来看看效果吧!
首先是添加数据
然后是查询显示数据:
我门看到已经成功查询出来了,然后是删除数据:
删除之后我们再一次查询可以看到已经没有了数据,说明删除成功,到这里我们Room的基本使用示例基本就算完了,当然想要这个demo的同学也可以到github上面去下载:github传送门
当然里面也有我前面学习过的示例,谢谢。