android jetpack Room的基本使用(java)

数据库的基本使用

添加依赖

    //room
    def room_version = "2.5.0"

    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version"

创建表
@Entity表示根据实体类创建数据表,如果有多个主键要使用primaryKeys = {}
@ColumnInfo 表示在数据表中的名字
@Ignore 表示不在数据表创建此字段
@PrimaryKey 主键


@Entity
public class Word {

    @PrimaryKey
    @ColumnInfo(name = "id")
    private int id;
    @ColumnInfo(name = "word")
    private String word;
    @ColumnInfo(name = "wordCH")
    private String wordCH;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getWord() {
        return word;
    }

    public void setWord(String word) {
        this.word = word;
    }

    public String getWordCH() {
        return wordCH;
    }

    public void setWordCH(String wordCH) {
        this.wordCH = wordCH;
    }
}

创建DAO
每一个表都对应一个dao。

@Dao
public interface WordDao {

    @Query("select * from word")
    List<Word> getAll();


    @Insert
    void insert(Word... words);


    @Query("delete from word where   wordCh = :wordCH ")
    void deleteWord(String wordCH);
}

创建数据库
创建一个抽象类,设置要创建的数据表,数据版本,数据库名称,DAO。
entities 表示数据库中有哪些表

@Database(entities = {Word.class}, version = 1)
public abstract class MyDatabase extends RoomDatabase {

    public static MyDatabase myDatabase;


    public static synchronized MyDatabase getInstence(Context context) {

        if (myDatabase == null) {

            myDatabase = Room.databaseBuilder(context, MyDatabase.class, "my.db")
                    .build();
        }

        return myDatabase;
    }


    /**
     * 声明dao
     * @return
     */
    public abstract WordDao getWordDao();
}

对数据库进行增删改查操作,必须要在子线程中。这里向数据库中插入了一条数据,又从数据库中进行了查寻并输出。代码如下:

        new Thread(new Runnable() {
            @Override
            public void run() {

                MyDatabase myDatabase = MyDatabase.getInstence(getApplicationContext());

                Word word = new Word();
                word.setId(1);
                word.setWord("hello");
                word.setWordCH("你好");
                myDatabase.getWordDao().insert(word);
                List<Word> wordList = myDatabase.getWordDao().getAll();

                for (Word word1 : wordList) {

                    Log.d("Word", word1.toString());
                }
            }
        }).start();

Room与LiveData、ViewMode结合使用

但数据发生变化时,总是需要启动一个线程去查询数据,这很麻烦,于是有了更好的处理方案。
我们将获取到的List用livedata包装起来。

@Dao
public interface WordDao {
	........
    @Query("select * from word")
    LiveData<List<Word>> getAll();
}

创建WordViewModel
AndroidViewModel 与ViewModel不同点在于有没有context。

public class WordViewModel extends AndroidViewModel {

    private MyDatabase myDatabase;

    private LiveData<List<Word>> listLiveData;

    public WordViewModel(@NonNull Application application) {
        super(application);

        WordDao wordDao = myDatabase.getWordDao();
        listLiveData = wordDao.getAll();
    }


    public LiveData<List<Word>> getListLiveData() {
        return listLiveData;
    }

}

监听数据

        wordViewModel = new ViewModelProvider(this).get(WordViewModel.class);
        wordViewModel.getListLiveData().observe(this, new Observer<List<Word>>() {
            @Override
            public void onChanged(List<Word> words) {
                
            }
        });

当对数据库进行增加、删除或者修改时,onChanged方法会被调用。

使用migration升级

当数据库添加表,或者修改字段时,需要做一些调整,对数据库进行升级。

表示数据从版本1升级到版本2
    public static Migration migration = new Migration(1, 2) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {

        }
    };

1->3这种升级,room会判断有没有从1到3的升级方案,如果有,则直接升级;如果没有则room会按照1->2,2->3升级。
写完Migration 需要添加。

@Database(entities = {Word.class}, version = 2)
public abstract class MyDatabase extends RoomDatabase {

    public static MyDatabase myDatabase;


    public static synchronized MyDatabase getInstence(Context context) {

        if (myDatabase == null) {

            myDatabase = Room.databaseBuilder(context, MyDatabase.class, "my.db")
                    .addMigrations(migration)
                    .build();
        }

        return myDatabase;
    }

    public static Migration migration = new Migration(1, 2) {
        @Override
        public void migrate(@NonNull SupportSQLiteDatabase database) {

        }
    };

	.........
}

Schema文件

每次数据库升级都会生成一个Schema文件,这是一个json文件,包含了数据库的所有信息。查看它,能清楚地知道数据库每版变更的情况。

设置Schema导出路径

class RoomSchemaArgProvider implements CommandLineArgumentProvider {

    @InputDirectory
    @PathSensitive(PathSensitivity.RELATIVE)
    File schemaDir

    RoomSchemaArgProvider(File schemaDir) {
        this.schemaDir = schemaDir
    }

    @Override
    Iterable<String> asArguments() {
        // Note: If you're using KSP, you should change the line below to return
        // ["room.schemaLocation=${schemaDir.path}"]
        return ["-Aroom.schemaLocation=${schemaDir.path}"]
    }
}

android {
  
    defaultConfig {
    
		.......
        /*room数据库需要*/
        javaCompileOptions {
            annotationProcessorOptions {
                compilerArgumentProviders(
                        new RoomSchemaArgProvider(new File(projectDir, "schemas"))
                )
            }
        }
    }

}

在这里插入图片描述

预填充数据库createFromAsset、createFromFile

createFromFile用来作用域目录中的路径。
createFromAsset用来传输Asset中的路径

根据数据库表创建数据库,添加数据,导出db文件,存放与Asset文件中。

在这里插入图片描述

@Database(entities = {Word.class}, version = 2)
public abstract class MyDatabase extends RoomDatabase {

    public static MyDatabase myDatabase;


    public static synchronized MyDatabase getInstence(Context context) {

        if (myDatabase == null) {

            myDatabase = Room.databaseBuilder(context, MyDatabase.class, "my.db")
                    .addMigrations(migration)
                    .createFromAsset("my.db")//预填充数据库
                    .build();
        }

        return myDatabase;
    }
 	......
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/32230.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

发送图文并茂的html格式的邮件

本文介绍如何生成和发送包含图表和表格的邮件&#xff0c;涉及echarts图表转换为图片、图片内嵌到html邮件内容中、html邮件内容生成、邮件发送方法等 一、图表处理 因为html格式的邮件不支持echarts,也不支持js执行&#xff0c;所以图表需要转换为图片内嵌在邮件内容中 因为平…

【Java】Java核心 73:XML (中)

文章目录 5 XML的组成&#xff1a;字符区(了解)**6** **DTD约束(能够看懂即可)****1** **什么是DTD****2** **DTD约束的实现和语法规则&#xff08;看懂dtd约束&#xff0c;书写符合规范的xml文件&#xff09;** 5 XML的组成&#xff1a;字符区(了解) 当大量的转义字符出现在x…

ansible实训-Day1(Liunx基础问题总结及ansible安装环境前置部署)

一、前言 该篇是对本学期Ansible实训第一天内容的原理性总结&#xff0c;主要包括Liunx相关问题等基础性的问题总结以及ansible安装环境的前置部署。 二、Liunx是什么 Linux是一种自由和开放源代码的Unix操作系统&#xff0c;最初由芬兰人Linus Torvalds于1991年创建。与其他许…

浅谈Spring Cloud Gateway

网关:用户和微服务的桥梁 网关的核心是一组过滤器&#xff0c;按照先后顺序执行过滤操作。 Spring Cloud Gateway是基于webFlux框架实现&#xff0c;而webFlux框架底层则使用了高性能的Reactor模式通信框架的Netty Spring Cloud Gateway是Spring Cloud生态系统中的一个API网…

图解transformer中的自注意力机制

本文将将介绍注意力的概念从何而来&#xff0c;它是如何工作的以及它的简单的实现。 注意力机制 在整个注意力过程中&#xff0c;模型会学习了三个权重:查询、键和值。查询、键和值的思想来源于信息检索系统。所以我们先理解数据库查询的思想。 假设有一个数据库&#xff0c…

使用Servlet完成单表的增删改查功能以及使用模板方法设计模式解决类爆炸问题(重写service模板方法)

使用Servlet做一个单表的CRUD操作 开发前的准备 导入sql脚本创建一张部门表 drop table if exists dept; create table dept(deptno int primary key,dname varchar(255),loc varchar(255) ); insert into dept(deptno, dname, loc) values(10, XiaoShouBu, BeiJing); inser…

Python小游戏集合(开源、开源、免费下载)

Python小游戏集合 0. 前言1. 为什么用Python做游戏2. 小游戏集合及源代码&#xff08;整理不易&#xff0c;一键三连&#xff09;2.1 外星人小游戏2.2 塔防小游戏2.3 三国小游戏2.4 打飞机游戏2.5 飞机大战小游戏2.6 玛丽快跑小游戏2.7 涂鸦跳跃小游戏2.8 猜数字小游戏2.9 坦克…

吃透JAVA的Stream流操作,多年实践总结

在JAVA中&#xff0c;涉及到对数组、Collection等集合类中的元素进行操作的时候&#xff0c;通常会通过循环的方式进行逐个处理&#xff0c;或者使用Stream的方式进行处理。 例如&#xff0c;现在有这么一个需求&#xff1a; 从给定句子中返回单词长度大于5的单词列表&#xf…

求解矩阵行列式因子、不变因子、初等因子、Jordan标准形

首先&#xff0c;我们先来简要了解一下行列式因子、不变因子和初等因子的概念。 下面举例说明。 例1 首先&#xff0c;我们要求 λ I − A λI-A λI−A 然后&#xff0c;我们先求行列式因子。 D 2 ( λ ) D_2(λ) D2​(λ)的求法如下&#xff1a; 然后&#xff0c;我们再求…

Linux文件系统论述

目录 前言 一.磁盘 1.1定义 1.2结构 1.3磁盘的寻找方式 1.4磁盘的逻辑/线性结构 1.5磁盘访问的基本单位 1.6磁盘的管理 二.Linux文件系统 2.1系统结构 2.2属性解析&#xff1a; 2.3inode相关块的解析&#xff1a; 2.4数据块的解析&#xff1a; 前言 学了一段时间的Linux操…

基于Python垃圾短信识别程序(KNN、逻辑回归、随机森林、决策树和多项式分布朴素贝叶斯、伯努利分布朴素贝叶斯等算法进行融合)—含python工程全源码

目录 前言总体设计系统整体结构图请求流程图系统流程图 运行环境Python 环境jieba分词库Scikit-learn 库nginxphp 模块实现1. 前端模块2. 后端模块 系统测试1. 测试结果2. 结果对比3. 可视化部分 工程源代码下载其它资料下载 前言 本项目以Python为基础&#xff0c;旨在开发一…

Docker 安全及日志管理

目录 前言一、Docker 容器与虚拟机的区别1. 隔离与共享2. 性能与损耗 二、Docker 存在的安全问题1.Docker 自身漏洞2.Docker 源码问题 三、Docker 架构缺陷与安全机制四、Docker 安全基线标准五、容器相关的常用安全配置方法六、限制流量流向七、镜像安全八、避免Docker 容器中…

rust 集合、错误处理、泛型、Trait、生命周期、包

集合组织特性相同的数据&#xff1b;泛型可以定义任何抽象数据类型&#xff1b;生命周期限制所有权的作用域范围&#xff1b;错误处理使程序更健壮。 集合 一组特性相同的数据集合&#xff0c;除了基本数据类型的元组、数组。rust 标准库提供了一些非常有用的数据结构。 Vec…

短视频seo源码开发部署技术解析

短视频seo开发需要哪些技术 应用程序优化技术&#xff1a;包括应用程序的各种元素&#xff08;如标题、描述、关键字、图标等&#xff09;的优化和设置&#xff0c;以及应用程序内部链接和导航的合理布局和设置。 视频内容优化技术&#xff1a;包括视频标题、描述、标签、封面…

互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景

多线程访问共享资源的时候&#xff0c;避免不了资源竞争而导致数据错乱的问题&#xff0c;所以我们通常为了解决这一问题&#xff0c;都会在访问共享资源之前加锁。 最常用的就是互斥锁&#xff0c;当然还有很多种不同的锁&#xff0c;比如自旋锁、读写锁、乐观锁等&#xff0…

django中发送get post请求并获得数据

django中发送get post请求并获得数据 项目结构如下注册路由 urls.py在处理函数中处理请求 views.py进行 get的请求01浏览器 get请求传参数02服务器django get参数解析获取01浏览器 post的发送浏览器get 请求 获取页面返回的 form 发送post请求 带参数 02服务器django的post请求…

【嵌入式Qt开发入门】在Ubuntu下编写C++

在 Ubuntu 上面编写 C&#xff0c;本文内容主要介绍在 Ubuntu 在终端窗口下使用 vi/vim 编辑一 个 C源文件。通过编写最简单的示例“Hello,World&#xff01;”。带领大家学习如何在 Ubuntu 终端下编辑和编译 C。这里要求大家会在 Ubuntu 上使用 vi/vim&#xff0c;也就是要求大…

Git分支使用方法

目录 前言 一、查看可用分支 二、创建新分支 三、切换到新分支 四、在新分支上进行工作 五、提交更改 六、切换回主分支 七、删除分支 八、合并分支 前言 分支是指在同一个代码仓库中的不同版本线。它们可以被用来同时开展不同的开发任务、修复bug或实现新功能&#…

【面试题12】HTTP协议三次握手和四次挥手分别是什么

文章目录 一、概览二、三次握手2.1 第一步&#xff1a;客户端向服务端发送 SYN&#xff08;同步&#xff09;包2.2 第二步&#xff1a;服务端返回 ACK&#xff08;确认&#xff09;包和 SYN 包2.3 第三步&#xff1a;客户端返回 ACK&#xff08;确认&#xff09;包 三、四次挥手…

【AudioCaps数据集】windows10下载AudioCaps数据集,附百度网盘下载链接

&#x1f525; AudioCaps是从AudioSet数据集中筛选再加工得到的数据集。 AudioCaps数据集的下载使用python的第三方库 audiocaps-download&#xff0c;根据README.md的提示&#xff0c;先进行配置下载环境&#xff1a; &#x1f4e3; AudioCaps的下载环境配置分为四步&#x…