草庐IT

安卓房间 : How to read from two tables at the same time - duplicate id column

coder 2023-11-18 原文

我是 Android Room 的新手。我想从一个表中读取,也想从一个相关的表中读取。这种关系很常见。一张表定义实例。另一个表定义类型。想象一个 Animal 表和一个 AnimalType 表。几乎每次需要读取 Animal 表时,也需要读取 AnimalType 表。例如,我们要显示动物名称(来自 Animal 表)和猴子图标(来自 AnimalType 表)。

根据 Android Room 文档中的示例,这是对其建模的数据类:

public class AnimalWithType {
    @Embedded
    private Animal animal;

    @Embedded
    private AnimalType type;
    ...

DAO 可以通过单个查询来查询数据。 Room 应该足够智能以填充两个子类。

@Dao
public interface ZooDao
    @Query("select * from animal join animal_type on (animal.id = animal_type.id)")
    List<AnimalWithType> getAllAnimals();

一如既往,理论很漂亮。现实被打破了。结果出现如下错误:

Error:(8, 8) error: Multiple fields have the same columnName: id. Field names: animal > id, animalType > id.

显然,Room 对在查询中只获取一个“id”列以及它属于哪个类感到困惑。有两种可能的解决方案: 1) 我们可以为 building_type.id 创建一个列名别名并将它告诉 Room。 2) 我们已经知道从 Animal 表到 AnimalType 表(可能是 animal_type_id)的外键有另一个 id 列。

问题是我们如何将其传达给 Room。 Room 甚至能够处理这种情况吗?

感谢有关如何解决此问题的提示。我希望 Room 不需要做一些尴尬的事情,比如给每个 id 列一个唯一的名称。

最佳答案

waqaslam 指出了解决问题的方法。他建议为列名起别名。额外的步骤是给第二个表一个前缀。

public class AnimalWithType {
@Embedded
private Animal animal;

@Embedded(prefix = "type_")
private AnimalType type;
...

列别名又长又乱。我希望有人能找到更清洁的方法。

@Query("select animal.id, animal.name..., animal_type.id as type_id... from animal join animal_type on (animal.id = animal_type.id)")

关于安卓房间 : How to read from two tables at the same time - duplicate id column,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48123507/

有关安卓房间 : How to read from two tables at the same time - duplicate id column的更多相关文章

  1. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  2. ruby-on-rails - “remember me” 复选框的集成测试失败 - 2

    我正在关注railstutorial.org第3版,目前正在研究第8章:登录、注销。我在代码list8.51中发现了一个问题(登录时不记得测试):assert_nilcookies['remember_token']当我执行:raketest时,返回红色并出现以下错误:FAIL["test_login_without_remembering",UsersLoginTest,1.268578948]test_login_without_remembering#UsersLoginTest(1.27s)Expected""tobenil.test/integration/users_log

  3. (一)专题介绍:移动端安卓手机改造成linux服务器&linux服务器中安装软件、部署前后端分离项目实战 - 2

    快捷目录前言一、涉及到的相关技术简介二、具体实现过程及踩坑杂谈1.安卓手机改造成linux系统实现方案2.改造后的手机Linux中软件的安装3.手机Linux中安装MySQL5.7踩坑实录4.手机Linux中安装软件的正确方法三、Linux服务器部署前后端分离项目流程1.前提准备(安装必要软件,搭建环境):2.前后端分离项目的详细部署过程:总结前言总体概述:本篇文章隶属于“手机改造服务器部署前后端分离项目”系列专栏,该专栏将分多个板块,每个板块独立成篇来详细记录:手机(安卓)改造成个人服务器(Linux)、Linux中安装软件、配置开发环境、部署JAVA+VUE+MySQL5.7前后端分离项目

  4. ruby-on-rails - Rails 应用程序中 "Remember me"的实现 - 2

    我的Rails应用程序有一个带有“记住我”复选框的登录框。选中该框的用户即使在关闭浏览器后也应保持登录状态。我通过将用户ID存储在用户session中来跟踪用户是否已登录。但是session在Rails中是作为sessioncookie实现的,它不是持久的。我可以让它们持久存在:classApplicationController但这似乎是一种hack,对于如此常见的功能来说令人惊讶。有没有更好的办法?编辑Gareth的回答非常好,但我仍然希望熟悉Rails2的人回答(因为它是独一无二的CookieSessionStore)。 最佳答案

  5. 闭包 : help me understand 的 JavaScript 作用域 - 2

    运行以下代码:for(vari=0;i输出“3”三次。它输出i的最终值,而不是创建内部函数时i的值。如果我希望输出为1、2和3,我将如何编写这段代码?我怎样才能让它在定义函数时使用i的值而不是它的最终值? 最佳答案 for(vari=0;i因此,在setTimeout时间(在我们为setTimeout定义函数的时间),我们调用匿名函数获取val作为参数。这会为每个函数调用创建一个闭包,将val的值存储在我们刚刚调用的函数范围内。我用了self-invokingfunction,它立即创建一个closure.在您提供的代码中,代码创建

  6. javascript - Python(或者可能是 JavaScript/Ruby): open source projects that will give me a (bit) of hand-holding - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭10年前。我一直在互联网上漫游,寻找我的第一个开源项目来做出贡献-最酷的项目似乎是github上的单人乐队,我可以fork-但不太可能提供代码审查等我想我想要的,所以我可以提高我的python能力。Web.py、flask、celery、twisted等看起来很有趣——到目前为止,只有后者似乎是我可以适当贡献的东西的候选者,但即使我是一个体面的python程序员,

  7. javascript - 如何在客户端断开连接时向房间客户端发送消息 - 2

    我希望服务器在其中一个断开连接时向所有房间客户端发送一条消息。像这样:socket.on('disconnect',function(){server.sockets.in(room).emit('bye');});但是……我怎么知道在哪个房间广播?如果客户加入了多个房间怎么办? 最佳答案 检查套接字对象后,我想出了这个解决方案:socket.on('disconnect',function(){varrooms=io.sockets.manager.roomClients[socket.id];for(varroominrooms

  8. javascript - Socket.io 无法将数据发送到客户的唯一房间 - 2

    我正在使用Node.js创建一个媒体上传微服务。该服务的工作原理是将上传的二进制数据接收到缓冲区,然后使用S3npm包上传到S3存储桶。我正在尝试使用该包中的eventEmitter,它显示上传到S3的数据量,并将其发送回正在上传的客户端(以便他们可以看到上传进度)。我正在使用socket.io将进度数据发送回客户端。我遇到的问题是socket.io中的.emit事件会将上传进度数据发送到所有连接的客户端,而不仅仅是发起上传的客户端。据我了解,一个套接字连接到“连接”上的默认房间,该房间由客户端的“id”镜像。根据官方文档,使用socket.to(id).emit()应该只将范围内的数

  9. 微信小程序安卓视频播放卡顿问题 - 2

    在微信小程序开发中遇到在video组件的两个问题1.安卓手机里播放视频会有明显的卡顿问题刚开始以为是网络问题,或者是视频文件问题。排查了一下发现都没问题最后加了个属性就OK了uniapp和原生小程序方法:custom-cache="false"custom-cache={{false}}video组件兼容iOS手机custom-cache加了这个属性会让2.iOS手机第一次播放视频会有几秒黑屏问题因此我加了当前手机型号的判断uni.getDeviceInfo().deviceType获取当前设备api当为iPhone时不加custom-cache属性,否则加上custom-cache=“fal

  10. 安卓渐变的背景框实现 - 2

    安卓渐变的背景框实现1.背景实现方法1.利用PorterDuffXfermode进行图层的混合,这是最推荐的方法,也是最有效的。2.利用canvas裁剪实现,这个方法有个缺陷,就是圆角会出现毛边,也就是锯齿。3.利用layer绘制边框1.背景万恶的设计小姐姐又来搞事情啦,你说好好的设计一个纯色的背景框框不好嘛,非要把一个框框弄成渐变的,如果不拿出放大镜估计没几个人能看出来它是渐变的。来,我让你看看是啥样框子是从左到右渐变的,设计应该是做了一个底图,然后上面盖了一个白色圆角矩形。那么我们该怎么去实现它呢?实现方法下面介绍三种实现它的方法。先贴上源码地址,大家记得给个starhttps://git

随机推荐