【问题标题】:How to retrieve entries from a space in Contentful in Android如何在 Android 的 Contentful 中从空间中检索条目
【发布时间】:2015-10-30 19:26:57
【问题描述】:

今天刚开始使用此服务,文档有点混乱。 我使用照片库模板创建了一个Space。在这个空间中,我有图像、作者和照片库类型的条目。我的问题是,如何检索图像以在我的 android 应用中显示?

要与Contentful Delivery API 交互,我知道我必须使用CDAClient 对象和CDAEntry 对象来获取我想要获取的条目。

我在Fragment 类的onCreate() 方法中定义了这个,如下所示:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mContext = getActivity();

    client = CDAClient.builder()
            .setSpace("id-of-the-space-am-accessing")
            .setToken("the-access-token")
            .build();

    entry = client.fetch(CDAEntry.class).one("the id of the image I want to retrieve");
}

onCreateView() 方法中,我尝试这样查看结果:

Log.e(TAG, "Result: " + entry.toString());

当我运行应用程序时,我在 Logcat 中得到了这个:

E/NEWS ACTIVITY﹕ Result: CDAEntry{id='2YhtjbebgscIwO2keYEa4O'}

此 id 与我传递给 client.fetch(CDAEntry.class).one() 的图像的 id 匹配

显然正在获取图像,但如何显示它?

【问题讨论】:

    标签: android contentful


    【解决方案1】:

    引用official documentation

    内容类型

    内容类型是描述条目形状的方案。它们主要由作为条目蓝图的字段列表组成。

    资产

    资产代表空间中的文件。资产可以是任何类型的文件:图像、视频、音频文件、PDF 或任何其他文件类型。资产通常通过链接附加到条目。

    条目

    条目是包含在空格内的文档。它们可能代表博客文章或事件或您为其定义了内容类型的任何其他内容。

    空格

    Contentful 中的所有内容都属于一个空间。您可以考虑像数据库这样的空间,通常一个项目至少有一个空间,但可以选择使用单独的空间,例如测试。

    如上所述,为了包含一些关于它的额外元数据,有一个包装资产的条目是很常见的。例如,考虑Image 类型,它具有以下字段集:

    • 标题 - 短文本
    • 照片 - 资产链接
    • imageCaption - 长文本
    • imageCredits - 长文本

    对于 Java/Android SDK,这些属性可通过条目的 getField() 方法访问:

    CDAEntry imageEntry = client.fetch(CDAEntry.class).one("foo");
    String title = imageEntry.getField("title");
    CDAAsset photo = imageEntry.getField("photo");
    String photoUrl = photo.url(); // URL of the linked photo
    String imageCaption = imageEntry.getField("imageCaption");
    String imageCredits = imageEntry.getField("imageCredits");
    

    请注意,getField() 方法会推断返回类型以避免显式强制转换,因此请确保在调用时使用正确的类型。

    值得一提的是,one(String id) 方法是同步的,并且会在调用线程上执行 IO,因此您可以使用 one(String id, CDACallback callback) 或者如果您对 RxJava 感到满意,那么还有 client.observe() 可以为您提供Observable.

    最后一点是,在某些情况下,每次创建活动/片段时都从网络获取资源可能被认为是一种浪费,最好将资源保存到本地数据库并在离线模式下访问它。为此,您可能想查看Vault,这是一个注释处理器,可帮助您通过 SQLite 以最小的努力持久化来自 Contentful 的数据,它使用 Contentful Sync API 从给定空间获取增量更新,从而减少电池和数据消耗,同时还有助于提供更好的离线行为。

    Java/Android SDK 的 JavaDoc 在这里:http://contentful.github.io/contentful.java/

    还有一些开源示例应用程序展示了 Vault 与空间模板的使用,照片库模板可在此处获得:https://github.com/contentful/gallery-app-android

    干杯!

    【讨论】:

    • 感谢 Tom 的回答。我会更好地阅读这篇文章并在我回到我的计算机时尝试它们。
    • 嗨@Tom,那么在执行client.fetch(CDAEntry.class).one("id"); 时如何获取条目的ID 而无需在信息选项卡中查找?
    • 我不确定我是否理解您要执行的操作。条目的 ID 可通过用户界面获得。如果您有多个条目并且想要获取所有条目,例如通过特定类型,您可以执行client.fetch(CDAEntry.class).where("content_type", "content-type-id").all() 并获得CDAArray 实例。这是你的意思吗?
    • 是的。这正是我想要的。这些方法在我所知道的任何地方都不可用。我已经看过了。谢谢
    猜你喜欢
    • 1970-01-01
    • 2018-04-04
    • 1970-01-01
    • 1970-01-01
    • 2017-12-18
    • 2018-07-25
    • 2021-02-09
    • 1970-01-01
    • 2021-07-15
    相关资源
    最近更新 更多