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 Material
s。您的 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 中。在这里,您可以评估是否要保持强大的数据完整性并希望将所有 Announcement
和 Material
对象存储在一个事务中,或者是否不需要如此严格,您将存储它在不同的交易中。
有几种可能:
- 单个
Announcement
对象与其所有 Material
对象一起存储在一个事务中
- 所有
Announcement
个对象与所有 Material
个对象一起存储在一个事务中
- 所有
Announcement
个对象存储在一个事务中,然后所有 Material
个对象存储在一个事务中
第一个选项在逻辑上更喜欢并将提供最佳的用户体验。
从数据库加载 Announcement
时,您可以决定是否要加载 Material
的列表 eagerly 或 懒惰。查询应如下所示:
SELECT * FROM Material WHERE announcementId = this.id
.
它将 return 与个人 Announcement
.
关联的 Material
列表
如何在 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 Material
s。您的 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 中。在这里,您可以评估是否要保持强大的数据完整性并希望将所有 Announcement
和 Material
对象存储在一个事务中,或者是否不需要如此严格,您将存储它在不同的交易中。
有几种可能:
- 单个
Announcement
对象与其所有Material
对象一起存储在一个事务中 - 所有
Announcement
个对象与所有Material
个对象一起存储在一个事务中 - 所有
Announcement
个对象存储在一个事务中,然后所有Material
个对象存储在一个事务中
第一个选项在逻辑上更喜欢并将提供最佳的用户体验。
从数据库加载 Announcement
时,您可以决定是否要加载 Material
的列表 eagerly 或 懒惰。查询应如下所示:
SELECT * FROM Material WHERE announcementId = this.id
.
它将 return 与个人 Announcement
.
Material
列表