当前位置: 首页 > 知识库问答 >
问题:

房间持久性库和内容提供商

颛孙高义
2023-03-14

最近几天,我一直在学习新的Android架构组件。跟进一些博文后,留档

共有3个答案

司徒墨竹
2023-03-14

文件室库对内容提供程序没有任何特定支持。您只能自己编写内容提供者,然后使用Room查询数据库。

如果你想使用Android体系结构组件,并且你想使用基于SQLite的内容提供商,考虑使用克里普顿持久性库:它允许从数据库查询生成实时数据,为您生成内容提供商等等。最少但不是最后:为什么你要写整个SQL,而你只需要写在哪里的条件?

为了清楚起见,我是克里普顿持久性图书馆的作者。我写它是因为我没有找到一个独特的库来满足我在持久性管理方面的所有需求(是的,因为我喜欢编程)。

我用Kripton编写了谷歌内容提供商示例的转换版本。你可以在这里找到它。

只是为了简化阅读。使用Kripton,您只需要定义一个DAO接口。内容提供者将由注释生成。在克里普顿转换的相同DAO将是:

@BindContentProviderPath(path = "cheese")
@BindDao(Cheese.class)
public interface CheeseDao {

    @BindSqlSelect(fields="count(*)")
    int count();

    @BindContentProviderEntry
    @BindSqlInsert
    long insert(String name);

    @BindContentProviderEntry()
    @BindSqlSelect
    List<Cheese> selectAll();

    @BindContentProviderEntry(path = "${id}")
    @BindSqlSelect(where ="id=${id}")
    Cheese selectById(long id);

    @BindContentProviderEntry(path = "${id}")
    @BindSqlDelete(where ="id=${id}")
    int deleteById(long id);

    @BindContentProviderEntry(path = "${cheese.id}")
    @BindSqlUpdate(where="id=${cheese.id}")
    int update(Cheese cheese);

}

生成的内容提供程序使用URI公开DAO的方法。为了清晰化,我在这里只放了生成的JavaDoc(总是由Kripton生成)。

更多关于克里普顿的信息在其维基、我的网站和我的文章上。

司寇安宜
2023-03-14

如果我想用本地数据库构建一个应用程序,我现在显然会选择新的架构组件(实时数据、视图模型、房间)

我不会用“显然”这个词。架构组件是一个选项,但不是一个需求。

但是,如果我想我的数据库数据访问其他应用程序,例如小部件我如何集成内容提供商与房间?

应用程序小部件与内容提供者无关。IMHO很少有应用程序应该通过ContentProvider向第三方公开数据库,也没有应用程序应该纯粹出于内部目的使用ContentProvider

话虽如此,您有几个选择:

>

  • 不要使用Room,至少要通过ContentProvider公开表。

    出于内部目的使用Room,然后通过调用RoomDatabase上的getOpenHelper()ContentProvider使用经典的SQLite编程技术

    ContentProvider中使用文件室,编写您自己的代码,从您检索的文件室实体(用于query())或创建实体以用于其他操作(用于插入()更新()删除(),等等)

  • 高山
    2023-03-14

    顺便说一下,我也有同样的问题。我在这里找到了一个样本来回答我的问题。希望它对你也一样。

    简而言之,这是在DAO对象中,它将从内容提供商的查询()方法中调用

    /**
     * Select all cheeses.
     *
     * @return A {@link Cursor} of all the cheeses in the table.
     */
    @Query("SELECT * FROM " + Cheese.TABLE_NAME)
    Cursor selectAll();
    

    请注意它是如何返回游标对象的。其他操作,您可以在示例中亲自查看更多详细信息。

    我想这是@commonware回答中的第三个选项。

     类似资料:
    • Android的Room持久性库优雅地包含了适用于对象或集合的@Insert和@Update注释。但是,我有一个用例(包含模型的推送通知),它需要UPSERT,因为数据库中可能存在数据,也可能不存在数据。 Sqlite本机不具有up,在这个SO问题中描述了解决方法。鉴于那里的解决方案,如何将它们应用于Room? 更具体地说,如何在房间中实现插入或更新,而不破坏任何外键约束?使用insert wit

    • 有没有更简单的方法可以查看Android Studio中使用Room Persistence Library创建的数据库的内容?

    • 转换器.KT FoodDatabase.kt 当我运行以下代码创建数据库时: 我还附上我的评分文件: 有人遇到过这个问题吗?

    • 我刚刚使用Android room persistence library,通常我使用DBHeper来管理数据,但我正在尝试使用这项技术,我想知道如何在room persistence library中使用这个查询 但是,当我在“喜欢”之后使用%时,我会在红线上划下它

    • 我正在尝试为drools会话配置JPA持久性(代码来自drools文档) > 我在pom.xml中添加了drools-persistence-jpa、Bitronix事务管理器和com.h2database依赖项 我在“src/META-INF”中的Eclipse项目中创建了一个META-INF文件夹作为Source-Folder。 [...]EntityManagerFactory emf=pe

    • 我一直在使用codelabs实现我的房间数据库持久化。现在,在将数据插入房间数据库后,我正在尝试获取最新的rowID。但是,我被困在存储库中,试图从异步任务返回rowID。 LogEntity.java 洛格道。JAVA 日志数据库。JAVA 日志存储库。JAVA 我放了两个星号,因为我不确定在这里要做什么来获取insert RowID,以及我的AsyncTask是否完全正确。 LogViewMo