android_Room数据库中的一对多关系

简介: android_Room数据库中的一对多关系

android_Room数据库中的一对多关系

先看一遍 带有翻译的官方的Room数据库讲解 看完官方小姐姐的讲解的在看下面的就简单了很多


主要的点就是一定要有关联键 关联键的值一定要一样  其他的就没有啥重要的了基本都是CURD(如果你不了解Room的基础,请先去看看基础用法)最后有DEMO


image.png


1、开始创建Entity

1、创建一个人的实体

import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity
data class Owner(
    val name: String
) {
//关联键
    @PrimaryKey
    var ownerId: Long = 2
}

2、创建一个狗狗类用于对应

@Entity
data class Dog(
    val name: String,
    val cuteness: Int,
    val barkVolume: Int,
    val breed: String
) {
    @PrimaryKey(autoGenerate = true)
    var dogId: Long=0
//这个变量在后面类中可以看到(关联键)
    var dogOwnerId: Long=2
}


3、又创建了一个Cat类


import androidx.room.Entity
import androidx.room.PrimaryKey
@Entity
data class Cat(
    val catName: String
) {
    @PrimaryKey(autoGenerate = true)
    var catId: Long = 0
//关联键
    var catOwnerId: Long=2
}

2、创建Dao

按照上面的三个依次创建了3个Dao(我只是创建了添加的方法)



3、关键的来了

//人的dao
@Dao
interface OwnerDao {
    @Insert
    fun insert(owner: Owner)
}
//Cat的dao层
@Dao
interface CatDao {
    @Insert
    fun insert(cat: Cat)
}
//Dog的dao层
@Dao
interface DogDao {
    @Insert
    fun insert(dogDao: Dog)
}

创建一个Entity把Dog、Cat、Owner链接起来的类

import androidx.room.Embedded
import androidx.room.Relation
data class OwnerWithDogs(
    @Embedded val owner: Owner,
    @Relation(
        parentColumn = "ownerId",//关联键
        entityColumn = "dogOwnerId"//关联键
    )
    val dogs: List<Dog>,
    @Relation(
        parentColumn = "ownerId",//关联键
        entityColumn = "catOwnerId"//关联键
    )
    val cats: List<Cat>
)


创建Dao

import androidx.room.Dao
import androidx.room.Query
import androidx.room.Transaction
import com.example.myroomtest.room.entity.OwnerWithDogs
import io.reactivex.Single
@Dao
interface DogsAndOwnersDao {
    @Transaction
    @Query("SELECT * FROM Owner")//SQ写的是查询主键的类(也就是那个人Owner类)
    fun getDogsAndOwners(): Single<List<OwnerWithDogs>> 
//在接受结果的时候使用的OwnerWithDogs关联类接收
}

创建数据库的初始类(简单自己封装的)

object DBInstance {
    //    private static final String DB_NAME = "/sdcard/LianSou/room_test.db";
    private val DB_NAME = "test.db"
    var appDataBase: MyDataBase? = null
    fun getInstance(): MyDataBase? {
        if (appDataBase == null) {
            synchronized(DBInstance::class.java) {
                if (appDataBase == null) {
                    appDataBase = Room.databaseBuilder(
                        FinancialExchangeApplication.context,
                        MyDataBase::class.java,
                        DB_NAME
                    )
                        //不推荐打开这句,但是为了demo展示,我只能打开了
                        .allowMainThreadQueries()
                        .build()
                }
            }
        }
        return appDataBase
    }
}


自己封装了一个dao层的工具类

@Database(
    entities = [Owner::class, Dog::class, Cat::class],
    version = 1,
    exportSchema = false
)
abstract class MyDataBase : RoomDatabase() {
    abstract fun getDao(): DogsAndOwnersDao
    abstract fun getDog(): DogDao
    abstract fun getOwen(): OwnerDao
    abstract fun getCat(): CatDao
}

引入依赖

//Room的依赖引用
    implementation "androidx.room:room-runtime:2.2.5"
    implementation "androidx.room:room-ktx:2.2.5"
    kapt "androidx.room:room-compiler:2.2.5"
    androidTestImplementation "androidx.room:room-testing:2.2.5"
    implementation "androidx.room:room-rxjava2:2.2.5"  //room的RxJ
    implementation "io.reactivex.rxjava2:rxandroid:2.1.0"  //线程调度器

就是这样完事了

附上Git(Demo)的地址


目录
相关文章
|
7月前
|
网络协议 关系型数据库 MySQL
如何实现无公网ip远程访问本地安卓Termux部署的MySQL数据库【内网穿透】
如何实现无公网ip远程访问本地安卓Termux部署的MySQL数据库【内网穿透】
|
7月前
|
XML 关系型数据库 MySQL
【Mysql】有关数据库中一对多/一对一,多对一xml中文件映射问题
【Mysql】有关数据库中一对多/一对一,多对一xml中文件映射问题
60 0
|
7月前
|
存储 数据库连接 数据库
Android数据存储:解释SQLite数据库在Android中的使用。
Android数据存储:解释SQLite数据库在Android中的使用。
89 0
|
数据库连接 数据库 Android开发
Android -- Room简化数据库设置图书案例
Android -- Room简化数据库设置图书案例
51 0
|
6月前
|
数据库 Android开发 数据安全/隐私保护
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
267 2
|
6月前
|
SQL 存储 数据库
48. 【Android教程】数据库:SQLite 的使用
48. 【Android教程】数据库:SQLite 的使用
106 1
|
6月前
|
存储 缓存 数据库
Android之SQLite数据库使用详解
Android之SQLite数据库使用详解
|
6月前
|
存储 数据库 Android开发
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
在 Android Studio 中结合使用 SQLite 数据库实现简单的注册和登录功能
206 0
|
7月前
|
数据库 Android开发
Android数据库框架-GreenDao入门,2024年最新flutter 页面跳转动画
Android数据库框架-GreenDao入门,2024年最新flutter 页面跳转动画
Android数据库框架-GreenDao入门,2024年最新flutter 页面跳转动画
|
6月前
|
关系型数据库 MySQL 数据库
MySQL数据库——多表查询(1)-多表关系(一对多、多对对多、一对一)、多表查询概述(概念、笛卡尔积、分类)
MySQL数据库——多表查询(1)-多表关系(一对多、多对对多、一对一)、多表查询概述(概念、笛卡尔积、分类)
141 0