【问题标题】:Getting Realm and GSON working together让 Realm 和 GSON 一起工作
【发布时间】:2015-12-23 22:26:28
【问题描述】:

我有一个项目,我正在通过 GSON 和 Volley 读取一些 json。我想将我的数据保存在数据库中,我希望 Realm 是一个很好的解决方案。我选择了我的第一个类,它有七个成员变量,所有字符串和整数,并让它扩展 RealmObject 并将其中一个整数标识为主键。它编译得很好,但是当它运行时,我在日志中得到了大量的输出,最终应用程序在显示主要活动之前就崩溃了。看来 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 类。真的很简单:

    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
 }

为了澄清,它像这样运行良好。如果我添加“扩展 RealmObject”,它仍然会编译,但在运行时,它只会喷出各种消息,然后应用程序最终会在几秒钟后崩溃(我猜是内存不足)而没有显示活动。

编辑2,按要求添加logcat。

当我使用“扩展 RealmObject”运行它时,这就是 logcat。

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

如果我把“extends RealmObject”拿出来,它会完美运行。

【问题讨论】:

  • 你能展示你的 MyData 类吗?
  • MyData 类代码按要求添加。
  • 好吧,你会显示错误信息吗?
  • 已按要求添加了 Logcat。
  • 老实说,logcat 还不够清晰,您能否再次使用仅警告过滤器?第二个是最好将您的数据包含在这样的变量中 Data data = myData.getData();并且还包含大小,然后像这样使用它 int dataSize = data.size().

标签: android gson realm


【解决方案1】:

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

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

mGson = new Gson();

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    相关资源
    最近更新 更多