【发布时间】:2021-04-11 14:48:04
【问题描述】:
我是 Room 的新手,目前正在做我的一个项目,我应该在其中插入一些改造 GSON 数据。首先,让我在下面展示我的 JSON,它将给出一个清晰的结构。
{
"organization": {
"id": 0,
"title": "string",
"description": "HTML String",
"style": {
"navigationBackgroundColor": "#cd1325",
"navigationTextColor": "#ffffff",
"topBarLabel": "27July2015abcd",
"topBarBackgroundColor": "#cd1325",
"topBarTextColor": "#ffffff",
"bodyBackgroundColor": "#f5c233",
"bodyTextColor": "#646363",
"bannerBackgroundColor": "#ffffff",
"bannerTextColor": "#000000",
"buttonBackgroundColor": "#000000",
"buttonTextColor": "#ffffff",
"baseTextSize": 0,
"htmlWrapper": "string"
}
"login_options": [{
"name": "string",
"title": "EMAIL",
"description": "string",
"state": "string",
"allowed_email_domain": "string",
"restricted_email_domain": "string"
}, {
"name": "string",
"titl"e: "GOOGLE",
"description": "string",
"url": "string",
"clientId": "string",
"clientSecret": "string",
"redirectUri": "string",
"state": "string",
"nonce": "string",
"authorizationEndpointUri": "string",
"tokenEndpointUri": "string"
}
]
}
}
我正在用效果很好的改造来解析这个。以下是从https://www.jsonschema2pojo.org/创建的模型类名称
好的。现在我必须通过我面临很多困难的存储库将这些插入到 Room 数据库中。任何人都可以帮助我如何创建实体以及如何将这些数据模型插入到房间中。仍然不确定是将 GSON 模型插入 Room 还是创建实体并将解析数据放入这些模型然后插入。 我到目前为止所尝试的。
登录选项表
@Parcelize
@Entity
public class LoginOptionsTable {
@ColumnInfo
@PrimaryKey(autoGenerate = true)
public long loginOpnId;
@ColumnInfo(name = "login_options_name")
public String name;
@ColumnInfo(name = "login_options_title")
public String title;
@ColumnInfo(name = "login_options_description")
public String description;
@ColumnInfo
public String state;
@ColumnInfo
public String allowedEmailDomain;
@ColumnInfo
public String restrictedEmailDomain;
@ColumnInfo
public String url;
@ColumnInfo
public String clientId;
@ColumnInfo
public String clientSecret;
@ColumnInfo
public String redirectUri;
@ColumnInfo
public String nonce;
@ColumnInfo
public String authorizationEndpointUri;
@ColumnInfo
public String tokenEndpointUri;
public static List<LoginOptionsTable> fromObject(List<LoginOption>
mOptions){
List<LoginOptionsTable> groups = new ArrayList<>();
for(int i=0; i<mOptions.size(); i++){
LoginOptionsTable st = new LoginOptionsTable();
st.name = mOptions.get(i).getName();
st.title = mOptions.get(i).getTitle();
st.description = mOptions.get(i).getDescription();
st.state = mOptions.get(i).getState();
st.allowedEmailDomain = mOptions.get(i).getAllowedEmailDomain();
st.restrictedEmailDomain =
mOptions.get(i).getRestrictedEmailDomain();
st.url = mOptions.get(i).getUrl();
st.clientId = mOptions.get(i).getClientId();
st.clientSecret = mOptions.get(i).getClientSecret();
st.redirectUri = mOptions.get(i).getRedirectUri();
st.nonce = mOptions.get(i).getNonce();
st.authorizationEndpointUri =
mOptions.get(i).getAuthorizationEndpointUri();
st.tokenEndpointUri = mOptions.get(i).getTokenEndpointUri();
groups.add(st);
}
return groups;
}
}
样式实体:
@Parcelize
@Entity
public class StyleTable {
@ColumnInfo
@PrimaryKey(autoGenerate = true)
public long styleId;
@ColumnInfo
public String navigationBackgroundColor;
@ColumnInfo
public String navigationTextColor;
@ColumnInfo
public String topBarLabel;
@ColumnInfo
public String topBarBackgroundColor;
@ColumnInfo
public String topBarTextColor;
@ColumnInfo
public String bodyBackgroundColor;
@ColumnInfo
public String bodyTextColor;
@ColumnInfo
public String bannerBackgroundColor;
@ColumnInfo
public String bannerTextColor;
@ColumnInfo
public String buttonBackgroundColor;
@ColumnInfo
public String buttonTextColor;
@ColumnInfo
public Integer baseTextSize;
@ColumnInfo
public String htmlWrapper;
public static StyleTable fromObject(Style mStyle) {
StyleTable st = new StyleTable();
st.navigationBackgroundColor = mStyle.getNavigationBackgroundColor();
st.navigationTextColor = mStyle.getNavigationTextColor();
st.topBarLabel = mStyle.getTopBarLabel();
st.topBarBackgroundColor = mStyle.getTopBarBackgroundColor();
st.topBarTextColor = mStyle.getTopBarTextColor();
st.bannerBackgroundColor = mStyle.getBodyBackgroundColor();
st.bannerTextColor = mStyle.getBannerTextColor();
st.buttonBackgroundColor = mStyle.getButtonBackgroundColor();
st.buttonTextColor = mStyle.getButtonTextColor();
st.baseTextSize = mStyle.getBaseTextSize();
st.htmlWrapper = mStyle.getHtmlWrapper();
return st;
}
}
组织实体:
@Parcelize
@Entity(foreignKeys = {@ForeignKey(entity = StyleTable.class, parentColumns =
"styleId", childColumns = "stId"),
@ForeignKey(entity = LoginOptionsTable.class, parentColumns =
"loginOptionId", childColumns = "loginOpnId")
})
public class OrgTable {
@ColumnInfo
@PrimaryKey
public long id;
@ColumnInfo
public String title;
@ColumnInfo
public String description;
@ColumnInfo
public long stId;
//TODo make it for mutiple table
@ColumnInfo
public Long loginOptionsId;
@Ignore
public StyleTable style;
@Ignore
public List<LoginOptionsTable> loginOptions = null;
public static OrgTable fromObject(Organization organization){
OrgTable org = new OrgTable();
org.id = organization.getId();
org.title = organization.getTitle();
org.description = organization.getDescription();
StyleTable st = StyleTable.fromObject(organization.getStyle());
org.style = st;
//make the relation through Id
org.stId = st.styleId;
List<LoginOptionsTable> lo =
LoginOptionsTable.fromObject(organization.getLoginOptions());
org.loginOptions = lo;
//make the relation through Id
org.loginOptionsId = lo.get(0).loginOpnId;
return org;
}
}
DAO
@Dao
public interface OrgDAO {
@Query("SELECT * FROM OrgTable")
OrgTable getOrganization();
@Insert
void insertOrg(OrgTable org);
}
我尝试创建这些,但无法理解如何保持这些之间的关系以及插入/获取保存的数据。
【问题讨论】:
-
I am facing a lot of difficulties有什么,具体是什么?网上有很多关于房间使用的教程和资源,你似乎已经有了这些模型,为什么不能插入它们呢? -
@a_local_nobody 你可以检查我的编辑。
-
@a_local_nobody 你能帮我回答我的小问题吗?我可以将简单的 gson 模型插入到我创建的用于解析改造响应的数据库中吗?
-
你绝对可以,这就是房间的用途。但正如我所说,有很多可用的资源和教程,从你发布的内容来看,你似乎已经有了一个 dao,我不知道如何在房间内的数据之间创建关系,但无法做到帮助解决这个问题(这只是我不需要的东西)——祝你好运 :)
-
实际上,无论我遵循的任何教程都插入了实体类,但没有人展示如何使用改造模型来做到这一点(如果我错过了一些可能是我的错误)。所以只有我在这里寻求帮助。
标签: android retrofit2 android-room