我的编程空间,编程开发者的网络收藏夹
学习永远不晚

【Android】Jetpack全组件实战开发短视频应用App(六)

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

【Android】Jetpack全组件实战开发短视频应用App(六)

前言

这一篇我们主要介绍下

Room
数据库的创建以及简单使用

Room
介绍

Room
是Google为了简化
SQLite
推出的

拥有
SQLite
所有的操作功能; 使用简单,通过注解方式实现功能,类似
Retrofit
,编译时自动生成实现类 与
LiveData
,
LifeCycle
,
Paging
天然融合
Room
使用
添加依赖
 implementation "android.arch.persistence.room:runtime:1.1.1"
 annotationProcessor 'android.arch.persistence.room:compiler:1.1.1'
使用

我们先新建一个类

CacheDatabase
,同时继承
RoomDatabase

public class CacheDatabase extends RoomDatabase {
}

在这里插入图片描述
这里我们看见AS提示我们需要实现

RoomDatabase
的一些方法,但是我们可以把这个类声明为
abstract
类型,为啥呢?因为我们刚才介绍过
Room
是通过注解实现功能,编译时用通过
annotationProcessor
来帮我们实现实现类,所以在我们编译的时候会生成
CacheDatabase
的实现类,这样我们就不用复写
RoomDatabase
几个默认的方法了

public abstract class CacheDatabase extends RoomDatabase {
}

接着我们对我们这个

Database
进行初始化,我们还是在静态代码块中实现
创建数据库有两种
第一种:

 //创建一个内存数据库
 //但是这种数据库的数据只存在于内存中,也就是进程被杀之后,数据随之丢失
Room.inMemoryDatabaseBuilder()

这种我们一般不会使用,所以我们一般都是用下面这种方式

 Room.databaseBuilder(AppGlobals.getApplication(), CacheDatabase.class, "joke_video_cache")

我们看下这个方法源码

 
    @SuppressWarnings("WeakerAccess")
    @NonNull
    public static  RoomDatabase.Builder databaseBuilder(
            @NonNull Context context, @NonNull Class klass, @NonNull String name) {
        //noinspection ConstantConditions
        if (name == null || name.trim().length() == 0) {
            throw new IllegalArgumentException("Cannot build a database with null or empty name."
                    + " If you are trying to create an in memory database, use Room"
                    + ".inMemoryDatabaseBuilder");
        }
        return new RoomDatabase.Builder(context, klass, name);
    }

第一个参数是上下文;第二个参数是使用

Database
注解标记并且继承
RoomDatabase
的类;第三个是数据库名字
所以我们还需要把我们这个类用
Database
标记下
在这里插入图片描述
我们需要配置三个属性,第一个就是我们要操作的类,可以是多个;第二个是数据库的版本号;第三个是存储展示数据库的结构信息,默认是true,如果设置为true,我们需要设置 Schema 的位置

android {
    compileSdkVersion 29
    buildToolsVersion "29.0.3"
    defaultConfig {
       //......
        javaCompileOptions{
            annotationProcessorOptions{
                arguments=["room.schemaLocation":"$projectDir/schemas".toString()]
            }
        }
    }
 		//......
}

因为我们还没有

Entity
类,所以我们创建一个

@Entity(tableName = "cache")
public class Cache implements Serializable {
    @PrimaryKey(autoGenerate = false)
    public String key;
    @ColumnInfo(name = "data")
    public byte[] data;
}

这里需要使用

Entity
注解标记,可以给他指定表名,也可以使用默认;
PrimaryKey
注解的变量为主键,
autoGenerate
表示主键的值是否由
Room
自动生成,默认
false
;
ColumnInfo
表示数据控存这个属性的名字,同时我们给它指定两个属性
key
data
,
key
是我们以后查询缓存要使用的,
data
表示我们要缓存的数据,因为我们不确定缓存什么类型,所以统一使用二进制数组

接着我们回到我们刚才的

CacheDatabase
,我们完善下它头部的注解

@Database(entities = {Cache.class},version = 1,exportSchema = true)
public abstract class CacheDatabase extends RoomDatabase {
}

我们通过

Room.databaseBuilder
创建出一个
RoomDatabase.Builder
对象,接下来我们就简单说下它的配置

	 Room.databaseBuilder(AppGlobals.getApplication(), CacheDatabase.class, "joke_video_cache")
                //是否允许在主线程进行查询
                //.allowMainThreadQueries()
                //数据库创建和打开后的回调
                //.addCallback()
                //设置查询的线程池
                //.setQueryExecutor()
                //.openHelperFactory()
                //room的日志模式
                //.setJournalMode()
                //数据库升级异常之后的回滚
                //.fallbackToDestructiveMigration()
                //数据库升级异常后根据指定版本进行回滚
                //.fallbackToDestructiveMigrationFrom()
数据库升级

如果我们需要进行数据库的升级,需要在配置数据库的时候调用

addMigrations
方法,我们先看下源码

 
        @NonNull
        public Builder addMigrations(@NonNull  Migration... migrations) {
            if (mMigrationStartAndEndVersions == null) {
                mMigrationStartAndEndVersions = new HashSet();
            }
            for (Migration migration: migrations) {
                mMigrationStartAndEndVersions.add(migration.startVersion);
                mMigrationStartAndEndVersions.add(migration.endVersion);
            }
            mMigrationContainer.addMigrations(migrations);
            return this;
        }

入参是多个

Migration
对象,我们看下
Migration
的构造方法
在这里插入图片描述
也就是说我们指定多个版本升级的操作,例如
在这里插入图片描述

数据库操作

数据库操作我们需要使用

Dao
这个注解,这里我们新建一个
CacheDao
类,同时实现增,删,改,查方法,因为只有查比较麻烦,所以我们可以写一个基类
BaseDao
,里面含有增,删,改方法,然后我们的
CacheDao
,继承
BaseDao

@Dao
public interface BaseDao {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertItem(T item);//插入单条数据
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertItems(List items);//插入list数据
    @Delete
    void deleteItem(T item);//删除item
    @Update(onConflict = OnConflictStrategy.REPLACE)
    void updateItem(T item);//更新item
}
@Dao
public interface CacheDao extends BaseDao{
    //如果是一对多,这里可以写List
    @Query("select *from cache where `key`=:key")
    Cache getCache(String key);
}

作者:Greathfs


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

【Android】Jetpack全组件实战开发短视频应用App(六)

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

【Android】Jetpack全组件实战开发短视频应用App(六)

前言 这一篇我们主要介绍下Room数据库的创建以及简单使用 Room介绍 Room是Google为了简化SQLite推出的 拥有SQLite所有的操作功能; 使用简单,通过注解方式实现功能,类似Retrofit,编译时自动生成实现类 与Li
2022-06-06

【Android】Jetpack全组件实战开发短视频应用App(四)

前言 我们在上一篇基本上已经实现我们要的效果了,但是还遗留了几个问题,这一篇我们就来解决下 自定义解析器 我们上一篇介绍过NavDestination是通过解析xml生成的,我们不想在xml中写死,通过注解的方式实现,我们接下来就自定义注解
2022-06-06

【Android】Jetpack全组件实战开发短视频应用App(三)

前言 这一篇我们将使用Navigation搭建我们App的基础架构,我们先看下效果Navigation介绍 官网地址 快速入门 导航组件由以下三个关键部分组成: 导航图:在一个集中位置包含所有导航相关信息的 XML 资源。这包括应用内所有单
2022-06-06

【Android】Jetpack全组件实战开发短视频应用App(十)

前言 我们已经把首页列表的Item布局完成,接下来我们就开始加载首页数据,我们这一篇主要是做封装,具体网络请求放在下一篇 引入依赖 //刷新分页组件 api 'com.scwang.smartrefresh:SmartRefreshLayo
2022-06-06

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录