在项目中用数据库检索替换 json 检索

Replacing json retrieval with database retrieval in project

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

我有一个 Android 电视项目(使用 leanback)的工作 VerticalGridFragment 页面,它在列和行中加载专辑封面和详细信息。它大量借鉴了 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.class, Card.class 的示例项目 类 及其在示例中的各种支持 类。

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

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

感谢任何帮助。数据库与 json 变量的重建一样基本,可以进行调整以适应。

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

易于使用并且比 SQLite快。 它只需要几行代码就可以开始。请检查一下。在爱上 Realm 之后,我最近成为了 Realm Evangelist(非官方)。唯一的挫折是使用基于流畅界面的查询,只有当您的查询太复杂时才会发生这种情况。

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 表实际上包含正确的数据。它使调试更容易一些。