Android 学习日记----jetpack---androidx.Room

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操作:如图


work_fragment

这个界面是进行数据的查询显示和数据删除操作的。



add_fragment

这个界面是进行数据的添加的。

下面我们正式开始我门的示例了。

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传送门

当然里面也有我前面学习过的示例,谢谢。

你可能感兴趣的:(Android 学习日记----jetpack---androidx.Room)