在本地保存列表时GluonClient数据丢失

时间:2016-08-09 21:18:01

标签: java gluon gluon-mobile

我尝试使用GluonClient在本地保存数据。它偶尔会为一些元素工作,但会为大多数元素抛出错误。

我初始化:

GluonClient localClient = GluonClientBuilder.create()
    .operationMode(OperationMode.LOCAL_ONLY)
    .build();

我使用RestClient从REST API中检索数据。一旦列表初始化,我尝试在本地保存数据(尝试使用GluonClient进行此读取但没有成功):

RestClient apiClient = RestClient.create().method("GET")
    .host("http://localhost:8080/api")
    .path("/path/to/data")
    .queryParam("token","mytoken");
JobsIterableInputConverter<Job> converter = new JobsIterableInputConverter<>(Job.class);
GluonObservableList<Job.class> jobs = (DataProvider.retrieveList(apiClient.createListDataReader(converter)));
jobs.initializedProperty((obv,ov,nv)->{
    saveJobList(jobs);
});


private void saveJobListLocally(GluonObservableList<Job> list){
    GluonObservableList<Job> eqs = DataProvider.retrieveList(gluonClient.createListDataReader("jobs", Job.class));
    eqs.initializedProperty().addListener((obv, ov, nv) -> {
        if (nv && eqs.isEmpty()) {
            eqs.addAll(list);
        }
    });
}

这适用于某些时间的某些数据,大​​约4 (并非总是4) 168的作业对象被保存,其余的生成异常:< / p>

javax.json.stream.JsonParsingException: Invalid token=EOF at (line no=1, column no=0, offset=-1). Expected tokens are: [CURLYOPEN, SQUAREOPEN]

要检索本地数据,我打电话:

jobs = DataProvider.retrieveList(gluonClient.createListDataReader("jobs", Job.class));

这很好。

- 我可以访问和使用~4个被保存的对象,但其余的都丢失了。

- 从一个测试到下一个测试(最令人困惑的部分),保存的~4个对象不一样。

- 如果数据无效或者如果存在无效字符但是看到相同的问题,则每个作业对象中的数据与测试相同。之前使用org.json在其他应用程序中解析和使用过数据。

- 偶尔会为每个“丢失”的文件生成文件。除了作业文件之外,还将UID作为文件名。

-Twice我看到没有抛出异常,但大多数数据仍然缺失。

-Job类使用IntegerPropertyStringProperty作为数据类型。使用@XMLElement

注释的getters

我从GluonClient看到的行为不一致。

我尝试使用FileClient,但它不适用于列表(我应该在此轨道上吗?)。

如何使用GluonClient将本地内容保存和处理为列表?

使用javafxportsVersion= '8.60.7'

public class JobsIterableInputConverter<E> extends InputStreamIterableInputConverter<E> implements Iterator<E> {

    private JsonArray jsonArray = null;
    private int index;
    private final JsonConverter<E> converter;

    public JobsIterableInputConverter(Class<E> targetClass)
    {
        converter = new JsonConverter<>(targetClass);
    }

    @Override
    public boolean hasNext()
    {
        if (jsonArray == null) {
            return false;
        }
        return index < jsonArray.size();
    }

    @Override
    public E next()
    {
        JsonObject jsonObject = jsonArray.getJsonObject(index++);
        return converter.readFromJson(jsonObject);
    }

    @Override
    public Iterator<E> iterator()
    {
        index = 0;

        try (JsonReader reader = Json.createReader(getInputStream())) {
            JsonObject jsonObject = reader.readObject();
            jsonArray = jsonObject.getJsonArray("jobs");
        }

        return this;
    }
}

API返回格式:

{"jobs":[
    {"id":0},
    {"id":1}
]}

1 个答案:

答案 0 :(得分:0)

当将列表中的许多项目存储到本地存储时,确实存在一个错误。 JSON损坏的原因是可能同时访问存储对象的本地文件。该错误已通过以下拉取请求修复:https://bitbucket.org/gluon-oss/gluon-connect/pull-requests/1/make-sure-there-is-no-simultaneous-access/diff

本周计划在某个地方推出新版本。