【问题标题】:Cannot store nested parts of JSON request using robospice and ormlite无法使用 robospice 和 ormlite 存储 JSON 请求的嵌套部分
【发布时间】:2013-12-02 23:04:51
【问题描述】:

您好,我们使用带有 ORMLite 和 SpringAndroidSpiceRequest 的 RoboSpice 来阅读 来自网页的 JSON 信息并写入 SQLite 数据库。

我们正在使用最新的 JSON 映射器 MappingJackson2HttpMessageConverter。

        // Web services support JSON responses
        MappingJackson2HttpMessageConverter jsonConverter = new  MappingJackson2HttpMessageConverter();
        FormHttpMessageConverter formHttpMessageConverter = new FormHttpMessageConverter();
        StringHttpMessageConverter stringHttpMessageConverter = new StringHttpMessageConverter();
        final List<HttpMessageConverter<?>> listHttpMessageConverters = restTemplate.getMessageConverters();

我们尝试读取嵌套的 JSON 查询,如下例所示,我们可以读取 并存储到数据库,JSON的第一级(页面,总数),但我们不能存储 JSON 数组的下一层,所有“schedule_date”条目。

我们已经将这个示例(以及更多示例)视为存储 JSON 的最佳示例 数据。但这对我们不起作用。 RoboSpice persist JSON array with OrmLite

问题:我们如何读取和写入嵌套的 JSON 键和值,我们 难住了! :O

JSON:

{
   "page": 2,
   "total": 5,
   "result":
   [
       {
           "schedule_date": "2013-08-03"
       },
       {
           "schedule_date": "2013-09-03"
       },
       {
           "schedule_date": "2013-10-03"
       },
       {
           "schedule_date": "2013-11-03"
       },
       {
           "schedule_date": "2013-12-03"
       }
   ]
}

BroadcastResult.java:

            import java.util.Collection;
            import java.util.List;
            import com.j256.ormlite.field.DatabaseField;
            import com.j256.ormlite.table.DatabaseTable;
            import com.j256.ormlite.field.ForeignCollectionField;
            import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

            @JsonIgnoreProperties(ignoreUnknown = true)
            @DatabaseTable(tableName="BroadcastResult")
            public class BroadcastResult {

                @DatabaseField(id = true)
                private int page;

                @DatabaseField
                private int total;

                @ForeignCollectionField(eager = false)
                private Collection<Broadcast> result;

                public int getPage() {
                    return page;
                }

                public void setPage(int page) {
                    this.page = page;
                }

                public int getTotal() {
                    return total;
                }

                public void setTotal(int total) {
                    this.total = total;
                }

                public Collection<Broadcast> getResult() {
                    return result;
                }

                public void setResult(Collection<Broadcast> result) {
                    this.result = result;
                }
            }

Broadcast.java:

            import com.j256.ormlite.field.DatabaseField;
            import com.j256.ormlite.table.DatabaseTable;
            import com.fasterxml.jackson.annotation.JsonIgnoreProperties;

            @JsonIgnoreProperties(ignoreUnknown = true)
            @DatabaseTable(tableName="Broadcast")
            public class Broadcast {

                @DatabaseField(id = true)
                private String schedule_date;

                @DatabaseField(foreign = true)
                private BroadcastResult result;

                public String getScheduleDate() {
                    return schedule_date;
                }

                public void setScheduleDate(String schedule_date) {
                    this.schedule_date = schedule_date;
                }

                public void setBroadcastResult(BroadcastResult result) {
                    this.result = result;
                }

                public BroadcastResult getBroadcastResult() {
                    return result;
                }   
            }

我们收到了这个错误,我们不明白。
Logcat: SQLiteLog(10637): (1) no such column: result_id

@DatabaseField(foreign = true) // also tried (foreign = true, ColumnName="result")
private BroadcastResult result;

可以在此处查看运行测试的完整日志: https://gist.github.com/anonymous/7760344

【问题讨论】:

  • Jackson 很棘手,我相信字段名不是由私有变量名构建的,而是由 setter 和 getter 构建的。

标签: android json ormlite resttemplate robospice


【解决方案1】:

你有没有尝试添加

@DatabaseField(generatedId = true)
private int _id;

到您的 Broadcast.java 类?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    相关资源
    最近更新 更多