我目前在Android应用程序中使用Sugar ORM和Android Async Http Client。
我通读了Sugar ORM的文档,并准确地完成了那里写的内容。
我的HttpClient使用单例模式,并提供了用于调用某些API的方法。
现在来谈谈它的坏处。我无法将数据永久保存到由Sugar ORM创建的数据库中。
这是调用API的方法:
public void getAvailableMarkets(final Context context, final MarketAdapter adapter) {
String url = BASE_URL.concat("/markets.json");
client.addHeader("Content-Type", "application/json");
client.addHeader("Accept", "application/json");
client.get(context, url, null, new JsonHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, JSONArray response) {
Log.i(TAG, "Fetched available markets from server: " + response.toString());
Result<Markets> productResult = new Result<Markets>();
productResult.setResults(new Gson().<ArrayList<Markets>>fromJson(response.toString(),
new TypeToken<ArrayList<Markets>>() {
}.getType()));
ArrayList<Markets> marketsArrayList = productResult.getResults();
// This lines tells me that there are no entries in the database
List<Markets> marketsInDb = Markets.listAll(Markets.class);
if(marketsInDb.size() < marketsArrayList.size() ||
marketsInDb.size() > marketsArrayList.size()) {
Markets.deleteAll(Markets.class);
for(Markets m : marketsArrayList) {
Markets market = new Markets(m.getId(), m.getName(), m.getChainId(), m.getLat(),
m.getLng(), m.getBusinessHourId(), m.getCountry(), m.getZip(), m.getCity(),
m.getStreet(), m.getPhoto(), m.getIcon(), m.getUrl());
market.save();
adapter.add(market);
}
adapter.notifyDataSetChanged();
}
List<Markets> market = Markets.listAll(Markets.class);
// This lines proves that Sugar ORM is not saving the entries
Log.i(TAG, "The market database list has the size of:" + market.size());
}
});
}
这是Logcat正在打印的内容:
D/Sugar: Fetching properties
I/Sugar: Markets saved : 3
I/Sugar: Markets saved : 5
I/RestClient: The market database list has the size of:0
另外,我在stackoverflow上查看了Sugar ORM标签,但是没有答案或问题可以给我提示如何解决该问题。
我是android生态系统的新手,很乐意解决您的问题。
提前致谢
最佳答案
我只是解决您遇到的相同问题。
这是脖子上的疼痛,但是几个小时后,我发现了导致此问题的原因。
使用Sugar ORM,您不得设置id属性,因为它属于SugarRecord类,
否则,ORM将尝试更新对象而不是插入对象。
因为我需要具有带有对象ID的字段,所以我使用json注释将其分配给另一个字段。
最后一步是将GSON配置为排除没有Expose注释的字段。
所以我的课现在看起来像下面的课:
public class MyClass
{
@Expose
@SerializedName("id")
private long myId;
@Expose
private String field1;
@Expose
private String field2;
@Expose
private byte[] field3;
@Expose
private double field4;
public MyClass() { }
// parametrized constructor and more logic
}
干杯!