让Realm和GSON一起工作

时间:2015-12-23 22:26:28

标签: android gson realm

我有一个项目,我正在通过GSON和Volley阅读一些json。我想将数据保存在数据库中,我希望Realm是一个很好的解决方案。我拿了我的第一个类,它有七个成员变量,所有字符串和整数,并让它扩展了RealmObject并将其中一个int标识为主键。它编译得很好,但是当它运行时,我会在日志中获得大量的输出,并且最终应用程序在显示主要活动之前崩溃。似乎GSON不喜欢解析扩展了RealmObject的类。

所以我做了一些搜索,我在Realm网站上发现了这篇帖子,但它是针对较旧版本的Realm(我目前使用的是0.87)

https://realm.io/docs/java/0.77.0/#other-libraries

它提供了一个解决方案,但我无法让这个解决方案适合我,因为他们正在以不同的方式解析他们的GSON。也许我们可以通过在这里帮助我来解决这个问题,但是我想知道这个解决方案是否会起作用并不重要,因为它适用于旧版本?无论如何,我正在解析我的GSON:

private void DisplayData(int count, final ArrayList<TwoLineSummaryCardDataObject> tlscdo,
                                 final TwoLineSummaryViewAdapter lsva) {

    final String url = "https://mydata.com/mydata";
    final GsonRequest gsonRequest = 
          new GsonRequest(url, MyData.class, null, new Response.Listener<MyData>() {

        @Override
        public void onResponse(MyData myData) {
            tlscdo.clear();
            // Disable Realm stuff for now
            //Realm realm = Realm.getDefaultInstance();
            //realm.beginTransaction();
            for (int i = 0; i < myData.getData().size(); i++) {
                tlscdo.add(new TwoLineSummaryCardDataObject(myData.getData().get(i)));
                //realm.copyToRealmOrUpdate(myData.getData().get(i));
            }
            //realm.commitTransaction();
            lsva.notifyDataSetChanged();
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError volleyError) {
            if(volleyError != null) Log.e("MainActivity", volleyError.getMessage());
            Toast.makeText(MainActivity.this, "Error in Volley", Toast.LENGTH_SHORT).show();
        }
    }
    );

    // Add the request to the queue
    Volley.newRequestQueue(this).add(gsonRequest);
    VolleyHelper.getInstance(getApplicationContext()).addToRequestQueue(gsonRequest);

1)如何更新我的代码,以便像Realm javadoc页面上的示例一样使用GsonBuilder?

2)我是否在浪费时间,因为该代码适用于旧版本的Realm,现在有一种不同/更好/没有办法让GSON和Realm一起玩?

编辑:有一个要查看MyData类的req。这很简单:

    public class MyData {
        @PrimaryKey
        private Integer id;

        private String name;
        private String abbrev;
        private String countryCode;
        private Integer type;
        private String infoURL;
        private String wikiURL;

        // followed by a bunch of getters and setters
 }

澄清一下,它运行得很好。如果我添加&#34;扩展RealmObject&#34;,它仍然会编译,但是在运行时,它只是喷出各种消息然后应用程序最终崩溃(内存不足,我推测)几秒后没有展示活动。

编辑2,按要求添加logcat。

当我使用&#34;扩展RealmObject&#34;来运行它时,这就是logcat。

http://pastebin.com/raw/1VZq8bQD

如果我采用&#34;扩展RealmObject&#34;出来,它运行得很好。

1 个答案:

答案 0 :(得分:1)

  

1)如何更新我的代码,以便像Realm javadoc页面上的示例一样使用GsonBuilder?

您可以创建一个扩展Request<T>的新类,并将其应用于现有代码。在您的情况下,最快的方法是将GsonRequest类源代码复制到新的源代码,并修改构造函数中初始化Gson对象的行:

mGson = new Gson();

使用在realm.io网站上编写的代码。

  

2)我是否在浪费时间,因为该代码适用于旧版本的Realm,现在有一种不同/更好/没有办法让GSON和Realm一起玩?

在写这个答案时,最新版本的领域是0.87.1,而method of working with GSON是相同的。所以这应该仍然是正确的方法。