Android 存储来自 Api 调用 Sqlite 的嵌套 JSON 个对象

Android store nested JSON Objects from Api call to Sqlite

如何在 android SQLite 数据库中存储具有其他对象作为实例变量的对象。

基本上,我的 JSON 来自 Rest Api 电话的回复看起来像:

{
  "announcements": [
    {
      "courseId": "196014605914",
      "id": "269865109791",
      "text": "Ignore the previous link. Join the already started CHM 112",
      "state": "PUBLISHED",
      "alternateLink": "https://classroom.google.com/c/MTk2MDE0NjA1OTE0/p/MjY5ODY1MTA5Nzkx",
      "creationTime": "2021-02-08T09:18:05.420Z",
      "updateTime": "2021-02-08T09:18:05.415Z",
      "creatorUserId": "101562079220031604157"
    },
    {
      "courseId": "196014605914",
      "id": "246419265642",
      "text": "Note2",
      "materials": [
        {
          "driveFile": {
            "driveFile": {
              "id": "1CjL0RV7PdcIrrRWii1ApUown3YoyEKTx",
              "title": "HYDROCARBONS2-C-C, C=C AND ALKYNES.pdf",
              "alternateLink": "https://drive.google.com/open?id=1CjL0RV7PdcIrrRWii1ApUown3YoyEKTx",
              "thumbnailUrl": "https://drive.google.com/thumbnail?id=1CjL0RV7PdcIrrRWii1ApUown3YoyEKTx&sz=s200"
            },
            "shareMode": "VIEW"
          }
        }
      ],
 "state": "PUBLISHED",
      "alternateLink": "https://classroom.google.com/c/MTk2MDE0NjA1OTE0/p/MjQ2NDE5MjY1NjQy",
      "creationTime": "2021-01-25T10:41:45.094Z",
      "updateTime": "2021-01-25T10:41:44.260Z",
      "creatorUserId": "101562079220031604157"
    },
  ],
  "nextPageToken": "GkUSQxJBCLHA5Pr4LhI4Cg5iDAi2pfD_BRDAoOKzAQoOYgwItqXw_wUQgMCNtwEKCgiAgICg29jhsFoKCgiAgIDgwu223Hk"
}

这是公告对象的一部分,但有些人没有 Material 对象,如上所示。问题不是所有的公告都有 Material 对象,而且一个公告对象最多可以有 20 个 material 对象。

我的数据模型如下所示:

public class CourseDetailsItem{
    private final String message;
    private final Long time;
    private final String author;
    private final List<Material> materials;

//... Appropriate getters and setters

//Material.java
public class Material{
    private final String label;
    private final String link;

//... Appropriate getters and setters

存储对象以供离线使用的最佳方式是什么?

在我的 DbHelper 中 class 我很困惑

SQLiteDatabase db = this.getWritableDatabase();
        String CREATE_COURSE_TABLE = "CREATE TABLE IF NOT EXISTS _"+courseId+" ("+ ID +" INTEGER PRIMARY KEY," + MESSAGE + " TEXT,"+ TIME + " INTEGER," + AUTHOR + " TEXT," + LABEL + " TEXT," + LINK + " TEXT"+")";
        db.execSQL(CREATE_COURSE_TABLE);
        ContentValues values = new ContentValues();
        values.put(MESSAGE, courseDetailsItem.getMessage());
        values.put(TIME, courseDetailsItem.getTime());
        values.put(AUTHOR, courseDetailsItem.getAuthor());
        //values.put(); HERE HOW DO I STORE MATERIAL OBJECT
        //Considering the fact that Material Object could be upto Twenty for each  of my entry

有人请...

这里请不要有负能量,我只是想不出解决办法

最好的或最直观的方法是在关系 SQLite 数据库中也反映它们的关系。

这意味着您将有一个 Announcement table 和一个 Material table。

Material table 中,您需要添加一个 'foreign key' 以及它所指的 Announcement 的主要 ID。这样你就可以为 Announcement 存储 0...n Materials。您的 Announcement 型号/ table 不需要更改,可以保持原样。

注意:据我所知,SQLite 不支持真正的 'foreign key' 定义。这还不算太糟糕,因为它只是关于 'pointer' 从一个 table 到另一个基于主键的概念。在一个真实的、成熟的数据库中,它将对其进行评估并确保基于它的数据完整性。这种严格性并不总是需要或想要的,因此在 SQLite 中不受支持 - 使其更轻量级。您还可以通过正确编写代码来确保相同的数据完整性。

那么您将有两个 table 如下所示:

公告(courseId, id, text, ...)

Material (announcementId, id, title, alternateLink, ...)

编辑:这也称为 OneToMany 关系。当您查找 'modelling a OneToMany relationship in relational database' 时,您会发现很多资源对其进行了更详细的解释。

存储 Announcement 时,您还将 'simply' 将 Material 对象存储在它们的 table 中。在这里,您可以评估是否要保持强大的数据完整性并希望将所有 AnnouncementMaterial 对象存储在一个事务中,或者是否不需要如此严格,您将存储它在不同的交易中。

有几种可能:

  • 单个 Announcement 对象与其所有 Material 对象一起存储在一个事务中
  • 所有 Announcement 个对象与所有 Material 个对象一起存储在一个事务中
  • 所有 Announcement 个对象存储在一个事务中,然后所有 Material 个对象存储在一个事务中

第一个选项在逻辑上更喜欢并将提供最佳的用户体验。

从数据库加载 Announcement 时,您可以决定是否要加载 Material 的列表 eagerly懒惰。查询应如下所示:

SELECT * FROM Material WHERE announcementId = this.id.

它将 return 与个人 Announcement.

关联的 Material 列表