【问题标题】:Replacing json retrieval with database retrieval in project项目中用数据库检索代替json检索
【发布时间】:2016-07-06 11:48:49
【问题描述】:

抱歉,如果我在这里没有提供足够的信息,我是 android/java 的新手,并且正在通过结合各种示例项目的元素来学习。

我有一个工作的VerticalGridFragment 页面用于 Android TV 项目(使用leaback),它在列和行中加载专辑封面和详细信息。它大量借鉴了googlesamples example on github

使用以下格式的测试music_database_proto.json 文件:

{
  "cards": [
    {
      "type": "GRID_SQUARE",
      "title": "Around the World in a Day",
      "artist": "Prince and the Revolution",
      "description": "Prince and the Revolution",
      "groupType": 0,
      "tagID": 0,
      "localImageResource": "food_01"
    }
}

然后我可以使用 createRows() 函数(来自同一个示例项目)加载它:

PresenterSelector cardPresenterSelector = new CardPresenterSelector(getActivity());
mAdapter = new ArrayObjectAdapter(cardPresenterSelector);
String json = Utils.inputStreamToString(getResources().
    openRawResource(R.raw.music_database_proto));
CardRow row = new Gson().fromJson(json, CardRow.class);
mAdapter.addAll(0, row.getCards());

在示例中使用CardRow.classCard.class的示例项目类及其各种支持类。

我已经实现了一个成功启动的SQLite 数据库,我可以在Android Studio 的Logs 中调用各种结果。我不知道从哪里开始插入数据库中的结果为Cards,我可以加载到VerticalGridFragment 中,替换json 文件的功能?

我认为这就像从数据库结果创建 List<Card> 并使用 mAdapter.addAll 将其添加到 mAdapter 一样简单。但是,我在使用迭代代码实现 ListCard 对象时运气不佳。无奈之下,我想我应该将数据库结果转换为json 字符串并将它们输入到我上面显示的现有代码中?

任何帮助表示赞赏。该数据库与 json 变量一样基本,可以根据需要进行调整。

【问题讨论】:

  • 您正在寻找一种简单的解决方案来实现离线存储机制,将所有 JSON 类存储到您的数据库中,对吧?

标签: android json sqlite android-tv leanback


【解决方案1】:

However, I've had little luck in implementing a List of Card objects using iterating code. 到底是什么意思?如果您使用卡片列表调用mAdapter.addAll(0, cards),它应该可以按您的意愿工作。

您是否在从 SQLite 数据库中提取卡片列表时遇到困难?您可以依赖this link,它有以下答案。我将其稍微修改为大约Card.class。您还需要向Card 对象添加一个构造函数,因为他们假设您使用@SerializedName 来初始化它。下面的示例假设您添加了一个类似于 public Card(String title, String description) 的构造函数。

List<Card> cardsList = new ArrayList<Card>();
database = openOrCreateDatabase("your_db", SQLiteDatabase.OPEN_READWRITE, null);
if(database!=null)
{
    c= database.rawQuery(QUERY, null);
    c.moveToFirst();
    while(c.isAfterLast()==false)
    {
        Card card = new Card(c.getString(c.getColumnIndex("title")),
                             c.getString(c.getColumnIndex("description")));
        cardsList.add(card);
        c.moveToNext();
    }

}
database.close();
c.close();

该示例实际上只是一个起点,但它们鼓励您自定义示例中的任何这些类以更好地满足您的需求。

我也喜欢您尝试学习 SQLite,因为它是一个很好熟悉的 Android(以及一般的移动开发)。您还可以使用Stetho by Facebook 之类的库来确保您的 SQLite 表实际上包含正确的数据。它使调试更容易一些。

【讨论】:

  • 感谢您的提示。我的意思是,我对基本 PHP、javascript 和条件编程、变量和值的基础知识的熟悉程度仍然让我对我指出的一些 Android 示例摸不着头脑。例如,如果我查看Card.java 类并认为我可以通过引用它来创建一个新的卡片对象,我将不可避免地得到一个编译错误。举个更精确的例子,如果我使用上面的代码,Card card = new Card(c.getString(c.getColumnIndex("title"))... 行会产生Card() in Card cannot be applied to (java.lang.String, java.lang.String)
  • 好的,我现在明白了。要实例化一个对象(并填充其字段),您可以使用constructor。他们提供的Card类此时只能通过json实例化其字段。因此,您需要向 Card 类添加一个新的“构造函数”,它将您想要填充的字段作为参数。像public Card(String title, String description) 这样的东西。该构造函数尚不存在,因此您需要添加它(这就是您收到编译错误的原因)。请让我知道这是否有效。
  • 啊,我当时是在正确的轨道上。我认为这是当前Card 类在我尝试为其提供字符串时显示各种序列化字段的问题。这是我能犯的错误的最佳解读。我现在要出去做一些研究,非常感谢您的建议,我一定会回帖的。我只是根据你所说的和一点阅读整理了一些粗略的代码。工作似乎太简单了,所以我想我会在这方面工作更长的时间。再次感谢。
  • 好吧,让我惊讶的是,它 75% 的工作,我想我可以看到去哪里让它达到 100%。我需要查看支持类和Card 类本身,以获取它当前崩溃的其余变量。我在Card 类中添加了以下内容进行测试:public Card(String dbTitle, String dbArtist) { mTitle = dbTitle; mArtist = dbArtist; mType = Type.GRID_SQUARE; mTagID = "1.jpg"; }; 再次感谢。非常感谢您尝试解决不完全简洁或易读的问题。
  • 太棒了!我很高兴它走到了一起。是的,@SerializedName 注释专门用于使用 JSON 初始化一个类,但是还有其他一些方法可以在 Java 中初始化字段(构造函数和 getter/setter)。您可以通过右键单击“getter”并选择“Find Usages”来找到导致崩溃的变量的使用位置。 ImagePresenter 很可能需要它们
【解决方案2】:

Realm for android 将是您的最佳选择。

易于使用并且它比 SQLite 更快。 它只需要几行代码就可以开始了。请检查一下。在爱上它之后,我最近成为了 Realm Evangelist(非官方)。只有当您的查询过于复杂时才会使用基于流畅接口的查询。

【讨论】:

  • 感谢您的建议。我是 Android 的新手(以及几乎所有软件开发),所以我觉得不要跳过对 SQLite 的熟悉是明智的。也就是说,我对 MySQL 与 PHP 和 Android 有一定的了解,与它相比,SQLite 感觉绝对是一种痛苦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
相关资源
最近更新 更多