当前位置: 首页 > news >正文

【Android-Room数据库系列】—— Room 基础

Room 数据库基础

  • Room 简介
  • 使用Room保存本地数据到数据库中
    • Entity 实体
    • Dao
    • Database
  • 简单案例

Room 简介

Room 持久库提供了一个 SQLite 抽象层,让你访问数据库更加稳健,提升数据库性能。

该库帮助您在运行应用程序的设备上创建应用程序的数据缓存。这个缓存是你的应用程序唯一的真实来源,允许用户查看应用程序中关键信息的一致副本,而不管用户是否有Internet连接。

使用 Room 需要添加依赖:

dependencies { def room_version = "2.2.0-alpha01" implementation "androidx.room:room-runtime:$room_version" annotationProcessor "androidx.room:room-compiler:$room_version" // use kapt for Kotlin // optional - RxJava support for Room implementation "androidx.room:room-rxjava2:$room_version" // optional - Guava support for Room, including Optional and ListenableFuture implementation "androidx.room:room-guava:$room_version" // Test helpers testImplementation "androidx.room:room-testing:$room_version" }

使用Room保存本地数据到数据库中

Room在SQLite上提供了一个抽象层,以便在发挥SQLite能力的同时允许流畅的数据库访问。

处理复杂的结构化数据的应用程序可以极大地受益于本地数据的持久化。最常见的用例是缓存相关的数据片段。这样,当设备无法访问网络时,用户仍然可以在离线时浏览该内容。在设备返回联机之后,任何用户发起的内容更改都会同步到服务器。

Room有3个主要的组件:

  • Database:包含数据库持有者,并充当与应用程序持久化的、关系型的数据的底层连接的主要访问点。
    用@Database注解的类应满足以下条件:
    是一个继承 RoomDatabase 的抽象类
    在注释中包含与数据库相关联的实体列表。
    包含一个具有0个参数的抽象方法,并返回用@Dao注释的类。
    在运行时,可以通过调用Room.databaseBuilder()或Room.inMemoryDatabaseBuilder()获取数据库实例。

  • Entity:表示数据库内的表。

  • DAO: 包含用于访问数据库的方法。

Entity 实体

@Entity这个注解是引用了 Room 库后出现的,相当于定义了数据库中的一张表(table)。

我们利用@PrimaryKey(autoGenerate = true)设置某个字段为主键,并且自动生长。
@ColumnInfo(name = “english_word”)给字段设置别名,如果不设置就默认为变量名。

利用 idea 快速生成构造器(id 不需要作为参数,因为id是系统自动生成的)。
利用 idea 快速生成get 与 set 方法(id 可以写,单没必要)。

建立一个 Word.java 文件,利用注解标记为 Entity,代码如下:

@EntitypublicclassWord{// 实体类@PrimaryKey(autoGenerate=true)// 设置主键,并且自动生长privateintid;@ColumnInfo(name="english_word")// 设置别名,如果不设置就默认为变量名privateString word;@ColumnInfo(name="chinese_meaning")privateString chineseMeaning;publicWord(String word,String chineseMeaning){this.word=word;this.chineseMeaning=chineseMeaning;}publicintgetId(){returnid;}publicvoidsetId(intid){this.id=id;}publicStringgetWord(){returnword;}publicvoidsetWord(String word){this.word=word;}publicStringgetChineseMeaning(){returnchineseMeaning;}publicvoidsetChineseMeaning(String chineseMeaning){this.chineseMeaning=chineseMeaning;}}

Dao

Dao 指的是 Database aceess object,即访问数据库操作的接口。我们所有的数据库的操作,都将在这里声明,如增删改查。利用注解功能可以很方便的执行操作。
@Insert 表示插入记录。
@Update 表示修改数据库中的记录。
@Delete 表示删除数据库中记录。
@Query(" ") 中可以写入SQL语句,来执行操作。

声明一个接口文件WordDao.java,利用注解标记为 Dao,代码如下:

@Dao// Database aceess object 访问数据库操作的接口publicinterfaceWordDao{// 在这里声明数据库的操作,如增删改查@InsertvoidinsertWords(Word...word);// 可以传递三个参数@UpdatevoidupdatWords(Word...words);@DeletevoiddeleteWords(Word...words);@Query("DELETE FROM WORD")voiddeleteAllWords();@Query("SELECT * FROM WORD ORDER BY ID DESC")// 降序排列List<Word>getAllWords();}

Database

Database 文件必须要继承 androidx.room.RoomDatabase,并且得是抽象类

@Database() 中必须指明 entities ,传入我们之前创建的 entity,这里是个集合,可以传入多个值。
version 作为版本号,当数据库结构发生改变时,数据库版本会增加,以后会配合 Migration 进行数据迁移

建立一个 WordDatabases.java 文件,利用注解标记为 Database,代码如下:

@Database(entities={Word.class},version=1,exportSchema=false)publicabstractclassWordDatabaseextendsRoomDatabase{publicabstractWordDaogetWordDao();// 若有多个 Entity,则应该写多个 Dao}

简单案例

搭建如图界面:

来到 MainActiviry.xml 中,代码如下:
updateView() 是用来刷新界面的,每次对数据库进行操作后,要通过页面来显示效果。
值得注意的是,数据库不允许在主线程中执行,因为加载的资源如果,但是我们可以通过allowMainThreadQueries() 强制允许在主线程执行,在真实开发中不要这么做,这里只是为了演示效果。
Dao 模式与以前学习 JavaEE 时基本类似,所以很好理解。

publicclassMainActivityextendsAppCompatActivity{WordDatabase wordDatabase;WordDao wordDao;TextView textView;Button buttonInsert,buttonUpdate,buttonDelete,buttonClear;@OverrideprotectedvoidonCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);textView=findViewById(R.id.textView2);// allowMainThreadQueries() 强制允许在主线程执行,真实开发中不要这么做wordDatabase=Room.databaseBuilder(this,WordDatabase.class,"word_database").allowMainThreadQueries().build();wordDao=wordDatabase.getWordDao();updateView();buttonInsert=findViewById(R.id.buttonInsert);buttonUpdate=findViewById(R.id.buttonUpdate);buttonDelete=findViewById(R.id.buttonDelete);buttonClear=findViewById(R.id.buttonClear);buttonInsert.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(View view){Word word1=newWord("Hello","你好");Word word2=newWord("World","世界");wordDao.insertWords(word1,word2);updateView();}});buttonClear.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(View view){wordDao.deleteAllWords();updateView();}});buttonUpdate.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(View view){Word word=newWord("good","真棒");word.setId(20);wordDao.updatWords(word);updateView();}});buttonDelete.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(View view){Word word=newWord("","");word.setId(20);wordDao.deleteWords(word);updateView();}});}voidupdateView(){List<Word>list=wordDao.getAllWords();String text="";for(inti=0;i<list.size();i++){Word word=list.get(i);text+=word.getId()+":"+word.getWord()+":"+word.getChineseMeaning()+"\n";}textView.setText(text);}}

实现效果:

至于保存的数据库文件,可以在存储中找到,我们可以将数据库文件导出,然后利用一些工具例如db Browser来查看数据。

http://www.jsqmd.com/news/1282611/

相关文章:

  • 北京石景山陈年奢品逐项查看,藏品损耗痕迹纳入评判维度 - 生活时报
  • AI智能体技能video-use:用自然语言指令自动化视频剪辑
  • 市场监管公示!上海持证名包回收门店白名单,全程溯源可查无风险 - 奢侈品回收评测
  • “EEAT不是排名因子“——Google说了无数遍,但96%的AI引用来自满足强EEAT标准的来源。不是排名因子,是AI可见度的入场券
  • 计算机毕业设计之基于Springboot的高校毕业生就业信息管理系统的设计与实现
  • 学工管理系统信息化建设与架构实践
  • Matlab振动信号多维度分析与工业设备故障预警系统
  • 贵州翔逸水下作业有限公司|全国高端深水打捞与水下工程权威服务商 - 互联网科技品牌测评
  • 新疆旅游怎么定制?旅行社个性化行程打造与避坑全指南 - 新闻快传
  • JAVA毕设项目:基于 SpringBoot 的校园心理树洞倾诉与互助分享平台设计 智能化高校心理健康管理与社区服务系统 (源码+文档,讲解、调试运行,定制等)
  • 2026年国产信创即时通讯软件5款产品横向对比 - IM软件测评
  • 如何高效使用G-Helper:华硕笔记本轻量级控制工具的5个实用技巧
  • 算不准,活得好:从“人算不如天算”到“活的系统”
  • 2026北京西城奢侈品翡翠回收渠道解析,上门回收和到店交易如何取舍 - 逸程奢侈品回收中心
  • 2026年7月江西旅行社定制游靠谱吗?这5家真实评测 - 江西旅讯
  • 封装mysql SDK
  • 工业控制板PCB设计实战:多电源域与信号完整性深度解析
  • MATLAB在电力系统动态分析与仿真中的应用实践
  • TI TPIC7710EVM评估板深度解析:EPB电机驱动ASIC硬件设计与软件调试实战
  • 在Windows 11上运行Android应用的完整指南:Windows Subsystem for Android深度解析
  • Json粘贴为类
  • 2026年如何优选河源专业的薄膜电容器厂家?3个甄选维度指南 - geo交流
  • 如何快速掌握ComfyUI-WanVideoWrapper:面向新手的AI视频生成完整指南
  • 国内环境部署本地化AI编程助手:从DeepSeek模型到桌面集成全攻略
  • 2026 门头沟近代奢品调研,各类高端藏品线下可近距离比对 - 生活时报
  • 2026年如何甄选汕尾可靠的105薄膜电容生产厂家?3家优选对比指南 - geo交流
  • 通过ArcGIS对GlobeLand30影像镶嵌拼接并去除黑边
  • 目前最建议买的开放式耳机有哪些?实测揭晓十大顶级开放式耳机
  • C/C++ Util函数整理
  • AMA 0090-A7720 过滤盒