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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350