如何在 Android 上的 RoomDB 中保存嵌套 List

2024-02-25

嘿谷歌有一个使用@Relation的例子

@Entity
 public class Pet {
     int userId;
     String name;
     // other fields
 }
 public class UserNameAndAllPets {
   public int id;
   public String name;
   @Relation(parentColumn = "id", entityColumn = "userId")
   public List<Pet> pets;
 }

是否可以保存字符串列表而不为其创建额外的类。我想避免 JsonProperty 和房间实体之间的不一致

我们希望有类似的东西

 public class UserNameAndAllPets {
   @JsonProperty("id")
   public int id;
   @JsonProperty("name")
   public String name;
   @Relation(parentColumn = "id")
   @JsonProperty("pets")
   public List<String> pets;
 }

因为我收到以下 Json:

{ 
 "id" : "1",
"name" : "someName",
"pets": ["cat", "dog", "camel"]
}

有人知道解决办法吗?

EDIT:

现在我的示例代码看起来像但我有错误:错误:参数的类型必须是用@Entity注释的类或其集合/数组。

@JsonIgnoreProperties(ignoreUnknown=true)
@Entity(tableName = TABLE_NAME)
public class Item {
    @Ignore public static final String TABLE_NAME = "itemTable";

    @PrimaryKey(autoGenerate = true)
    Long id;
    @JsonProperty("supplierName")
    String supplierName;
    @JsonProperty("eventDescription")
    String eventDescription;
    @JsonProperty("eventDate")
    @TypeConverters(StringListToGsonConverter.class)
    Date date;
    @JsonProperty("carServiceType")
    @TypeConverters(StringListToGsonConverter.class)
    List<String> types;

    public ServiceHistoryItem(Long id, String supplierName, String eventDescription, Date date, List<String> types) {
        this.id = id;
        this.supplierName = supplierName;
        this.eventDescription = eventDescription;
        this.date = date;
        this.types = types;
    }

    public static class StringListToGsonConverter{
        @TypeConverter
        public static List<String> restoreList(String listOfString){
            return new Gson().fromJson(listOfString, new TypeToken<List<String>>() {}.getType());
        }

        @TypeConverter
        public static String saveListOfString(List<String> listOfString){
            return new Gson().toJson(listOfString);
        }

        @TypeConverter
        public static Date fromTimestamp(Long value) {
            return value == null ? null : new Date(value);
        }

        @TypeConverter
        public static Long dateToTimestamp(Date date) {
            return date == null ? null : date.getTime();
        }
    }
}

EDIT2

保存项目时出现新问题 Dao 无法插入我的实体列表,没有原因......但是错误:参数的类型必须是用@Entity注释的类或其集合/数组。

@Dao
interface ItemDao {
    @Query("SELECT * FROM " + Item.TABLE_NAME)
    fun getAll(): LiveData<List<Item>>

    @Query("DELETE FROM " + Item.TABLE_NAME)
    fun deleteAllServiceHistory()

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertNewItem(item: Item)

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertNewItems(itemList: List<Item>) // <--- Error

}

SOLUTION for Dao

如果你使用 Kotlin,你应该使用 ArrayList

@Insert(onConflict = OnConflictStrategy.REPLACE)
        fun insertNewItems(itemList: ArrayList<Item>)

我遇到了同样的问题,我解决了@TypedConverter。我将列表另存为JSONArray.toString in the db.

@TypeConverter
public static List<String> restoreList(String listOfString) {
    return new Gson().fromJson(listOfString, new TypeToken<List<String>>() {}.getType());
}

@TypeConverter
public static String saveList(List<String> listOfString) {
    return new Gson().toJson(listOfString);
}

这样每List<String>将在您的数据库中序列化为 JSONArray。

到你的数据库类,扩展的类RoomDatabase,您必须声明使用哪个类进行此转换@TypeConverters(Converters.class). E.g.

@Database(version = 1, entities = {Entity.class})
@TypeConverters(Converters.class)
public abstract class MoviesDatabase extends RoomDatabase {
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Android 上的 RoomDB 中保存嵌套 List 的相关文章

  • Android Studio:无法终止 xxx 的现有进程

    The application is a system application and it will be started by other applications When I install the application from
  • 在 Android 上使用 MediaPlayer 流式传输经过身份验证的视频

    我正在尝试从具有基本身份验证的 SharePoint 服务器 URL 流式传输和播放视频 用户名密码 在我的 Android 设备中browser Media Player VideoView但我得到了 错误 sorry this vide
  • Android 滚动视图无法以编程方式创建。

    我想在我的应用程序中使用滚动视图 我尝试将文本视图添加到滚动视图中 但除了滚动视图的背景颜色之外 我看不到任何渲染的内容 我是这样做的 public class MyView extends ViewGroup ScrollView myS
  • Camera2设置预览(View)并获取预览回调

    我想从 Camera2 获取预览以及用于处理帧的 byte 回调 mImageReader ImageReader newInstance largest getWidth largest getHeight ImageFormat RAW
  • 使用 Gradle 进行 Travis-CI Android 测试总是超时

    我正在尝试在 Travis CI 上构建和测试我的项目 它每次都会在我的所有存储库上向我显示相同的重复输出 这是我的 travis ymlhttps github com carts uiet cartsbusboarding blob m
  • 如何在默认浏览器或webview中打开按钮点击url

    我怎样才能打开一个网址webview或者点击按钮后在默认浏览器中 目前 当我单击btn1按钮 它提示我从手机中选择一个浏览器 我想在默认浏览器或其他浏览器中打开此网址webview 这是我的java代码 public class myact
  • 如何使用 Android 处理在 Google Cardboard 设备中显示立体图像?

    处理的目的是使使用 Java 绘图变得更加容易 Android 的处理功能具有桌面版的强大功能以及来自传感器的信息 将这些东西放在一起 显示立体图像并像 Oculus Rift 或 Google Cardboard 一样在其周围移动不是很容
  • Flutter - 选择 TextFormField 时键盘不显示

    我目前遇到一个问题 当我选择任何一个时 键盘不会出现TextFormFielda 内的小部件Form小部件 这是表单的代码 位于我的内部CreateAccountForm有状态的小部件 import package flutter mate
  • Android Realm.io:行/对象不再有效

    这是我的删除功能 它确实找到了workday1 object public static void delete Context context Workday workday Realm realm getRealm context re
  • 单击输入字段会触发窗口调整大小

    我有一个带有徽标 菜单和搜索的标题 当我在桌面上时 我会按该顺序显示所有元素 但如果我的窗口宽度小于 980 像素 菜单会隐藏 有一个切换按钮 并且徽标会与nav并附在徽标之后 如果宽度更大 则徽标将再次分离并附加到 DOM 中的旧位置 w
  • 检查应用程序是否首次运行[重复]

    这个问题在这里已经有答案了 我是 Android 开发新手 我想根据应用程序安装后首次运行来设置一些应用程序的属性 有什么方法可以发现应用程序是第一次运行 然后设置其首次运行属性吗 下面是一个使用的例子SharedPreferences实现
  • android中如何布局支持各种屏幕?

    我正在使用gridview开发图库视图 在小屏幕中我的布局设计修复得很好 但大屏幕没有我的设计 在大屏幕中有一些空格 加载更多图片 按钮参考图2 我该如何解决这个问题 我的清单文件添加了这一行以支持各种屏幕 请给我一些示例代码
  • Android - 主页按钮发出什么意图?

    我想知道设备的主页按钮到底执行什么操作 即 当您单击主页按钮时会发出什么意图 意图类别和操作 回到空白的主屏幕 我想知道在单击我自己的自定义按钮时实现此操作涉及什么 谢谢 PS我知道这不是标准的 但我的设备也不是 如果您想显示主屏幕 可以通
  • jQuery mobile - 仅在侧面板关闭时才允许滚动?

    我不希望用户在任何侧边栏打开时滚动 一旦关闭 他们应该滚动 我使用了下面的代码 但它不适用于 Android 移动设备 document bind panelopen function e data body css overflow hi
  • QML MouseArea 将事件传播到按钮

    我正在开发一个应用程序 其菜单类似于 Android 版 Gmail 收件箱应用程序菜单 基本上 当您按下按钮打开菜单时 它就会滑入视图 用户可以将其滑开或按菜单上的按钮 对于滑动我使用了代码SwipeArea from kovrov ht
  • 查找配对的 Android 蓝牙设备是否在范围内的正确方法?

    我想编写一个充当蓝牙客户端的应用程序 我想做的是找出最好的方法来确定我支持的特定设备是否在范围内 而不是一直尝试在其上执行 BluetoothDevice connect 并失败如果不在范围内 这里我们假设设备已经配对 恐怕在特定设备处于范
  • android 媒体播放器 - 如何禁用范围请求? (Nexus 7 上的音频流中断)

    我有一个音频流应用程序 它运行本地代理服务器 本地代理服务器与互联网流媒体源建立 http 连接 在本地获取并缓冲流数据 然后 在应用程序内部 我使用 MediaPlayer 连接到本地代理服务器 使用方法 mediaPlayer setD
  • Google Cloud Messaging - 立即收到或长时间延迟收到的消息

    我在大学最后一年的项目中使用谷歌云消息传递 一切正常 但我在使用 GCM 时遇到了一些麻烦 通常 消息要么几乎立即传递 要么有很大的延迟 我读过这篇文章 但我真的认为它不适用于这种情况 GCM 通常会在消息发送后立即传送消息 然而 这并不总
  • 从包中发布的错误通知无法展开 RemoteViews

    我有个问题 有时我的服务会被这个 logcat 强制关闭 03 26 20 44 44 849 E AndroidRuntime 12080 FATAL EXCEPTION main 03 26 20 44 44 849 E Android
  • 如何减少导航图标和工具栏标题之间​​的差距?

    我的问题是导航抽屉图标和工具栏标题之间 有多余的空间 示例图像如下 工具栏的xml视图是

随机推荐

  • 使用自定义光标强制 WM_NCHITTEST 返回 HTCAPTION..?

    我创建了一个无边框窗口 使用wndProc 函数 强制WM NCHITTEST case回来HTCAPTION 它允许用户拖动窗口 无论其光标位于何处 问题是我设置了自定义光标 但是使用上述方法 光标总是设置回IDC ARROW 我该如何解
  • 使用 crypto/rand 通过 rand.Perm 生成排列

    Go 有两个随机数包 crypto rand 它提供了一种获取随机字节的方法 math rand 它有一个很好的打乱整数的算法 我想使用Perm算法来自math rand 但为其提供高质量的随机数 自从两人rand包是同一个标准库的一部分
  • 如何在 Leaflet 标记的弹出窗口中生成 Angular 4 组件?

    我一直是 Angular 1 x 的长期用户 现在我正在努力使用 Angular 4 制作一个新应用程序 我仍然不掌握大部分概念 但我终于有了一些非常好的东西 然而 我遇到了一个问题 我需要使用 Leaflet 在标记的弹出窗口中显示 An
  • 为什么 Enter 和 Space 键对于按钮的行为不同?

    据我所知 这些是当按钮获得焦点时唯一做出反应的键 Pressing Enter instantly clicks the button even if you keep it the key down So the click happen
  • 当 PhoneGap 应用程序在 iOS 上处于后台时,蜂鸣声不起作用

    我正在开发基于phonegap 的导航应用程序的iOS 版本 我的应用程序使用 GPS 跟踪用户在步行路线周围的位置 并在用户到达有新指示的位置时使用音频 navigator notification beep 和触觉 navigator
  • 基于本地时钟的Javascript事件触发

    我有一个场景 一台客户端 PC 将驱动多个 LCD 显示器 每个显示器显示一个浏览器窗口 这些浏览器窗口使用 jquery 显示不同的动画循环数据 我需要确保两个浏览器可以同步以完全相同的时间旋转 否则它们将在不同的时间播放动画 所以我的问
  • Handler vs AsyncTask vs Thread [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我对之间的差异有点困惑Handlers AsyncTask and Threads在安卓中 我在 StackOverflow 上阅读了很多博客和
  • 如何避免 Google App Engine 上的 django 中出现 NotImplementedError“仅 tempfile.TemporaryFile 可供使用”?

    我在 Google App Engine 上使用 Django 1 1use library 这里没有使用 Django GAE helper Django non rel 或类似工具 Django 处理 URL 路由 表单验证等 但我使用
  • MYSQL 包括项目计数为零的日期值

    我想统计购买总数以及一段时间内按 item id 的购买次数 在此示例中 用户可以拥有商品 并且其他用户可以购买这些商品 所有者不能购买自己的物品 我遇到的问题是如何在没有购买的日子以及正整数计数的日子中返回计数为 0 的结果 这是我的表格
  • 在控制器中调用异步方法

    我有一个控制器 其内容如下 public MyController Controller public ActionResult DoSomething CallSomeMethodWhichDoesAsyncOperations retu
  • Import-Module with -force 删除导入模块功能?

    我有 ModuleA 它使用下面的代码从模块 ADAutoDeployUtilities 和 Common LoggingNotifications 导入函数 但是 当我尝试使用 force 导入 Common LoggingNotific
  • 在 PATH 中找不到程序“g++”

    我在将 openCV 本机 C 添加到我的项目时遇到问题 首先它只是说 在路径中找不到程序 g 在路径中找不到程序 gcc 但是当我右键单击我的项目 gt Android Tools gt Add Native 时 出现更多错误 这是错误
  • 从服务器 xamarin.android 收到的证书无效

    所以这让我发疯了一天 我正在尝试与 xamarin android 上的 REST API 进行通信 但由于某种原因我收到此错误 InnerException Mono Security Protocol Tls TlsException
  • 使用静态构造函数(Jon Skeet Brainteaser)

    作为一个相对新手 我尝试尽可能多地阅读有关特定主题的内容 并尽可能多地测试 编写代码 我正在看其中之一乔恩斯脑筋急转弯 http www yoda arachsys com csharp teasers html 问题 2 我的输出与答案不
  • Pandas 从两列之间的操作开始

    我有一个包含两列的 pandas 数据框 我需要检查 A 列每行的值是一个以 B 列相应行的值开头的字符串 反之亦然 似乎系列方法 str startswith无法处理矢量化输入 因此我需要压缩列表理解中的两列并创建一个新的pd Serie
  • Struts2 预选复选框列表

    我已经尝试了我发现的类似情况下的所有解决方案 但没有运气 My jsp
  • 如何将 Mapsui 2.0.1 与 Xamarin.Forms 结合使用?

    据我了解 从 Mapsui 2 0 版本开始 我们可以在 Xamarin Forms 中使用 Mapsui 目前 Mapsui 版本为 2 0 1 Xamarin Forms 为 4 6 我正在寻找一个简单的示例或教程来指导我如何将 Map
  • 没有vhook的ffmpeg水印? [复制]

    这个问题在这里已经有答案了 由于 vhook 子系统已从最新版本的 FFMPEG 中删除 如何为视频添加水印 我需要能够覆盖具有背景透明度的 PNG 使用 Xuggler 我们可以在 java 中做到这一点 使用 IMediaTool 编码
  • Node.js Web 应用程序浏览器兼容性

    我听说node js是构建实时Web应用程序 聊天 实时提要等 的理想框架 那么我猜它涉及nodejs和客户端浏览器之间的大量套接字io连接 在客户端 我是否必须使用 websocket html5 才能与 node js 进行通信 如果是
  • 如何在 Android 上的 RoomDB 中保存嵌套 List

    嘿谷歌有一个使用 Relation的例子 Entity public class Pet int userId String name other fields public class UserNameAndAllPets public