gpt4 book ai didi

android content provider - 隐藏内部复杂性但允许复杂查询的设计模式

转载 作者:太空狗 更新时间:2023-10-29 15:16:29 25 4
gpt4 key购买 nike

我有一个关于通过内容提供商实现复杂查询的最佳实践的问题。正如我从 android 联系人内容提供程序中看到的那样,建议使用字段 selectionselectionArgs 等来发出特定请求。

我现在正在塑造我的第一个内容提供商。它背后有一个相当复杂的野兽,包括所有连接、全文表等具有规范化表的数据库构造。当然,我想对内容提供者的用户隐藏这种复杂性,但我还不知道如何实现它。如果用户使用 selectionselectionArgs 等指定他的请求,内容提供者似乎必须解析这些并将其映射到底层结构。是否有一些用于此解析的工具,或者我最终会编写自己的 selection 字符串解析器等。

恐怕这是要走的路,但在实现之前,我想听听 android 专业人士的一些建议。

非常感谢

马丁

最佳答案

这就是我现在所处的位置,至少我想快速分享一些解决方案,以获得鼓舞人心的专家反馈,并可能为周围其他该死的新手提供一些提示。现在看来,我一开始的基本错误是没有引入内容提供商向其用户提供的“虚拟”数据库之类的层。完成此操作后,隐藏了背后的复杂性,并且可以使用正常的查询语法。

所以我所做的是在内容提供者契约类中有一个“虚拟”数据库层,

public class JustDharmaQuotesContract {

public class Quote {

public static final String TABLE_NAME = QuoteTable.TABLE_NAME;

public static final String _ID = TABLE_NAME + "." + QuoteTable._ID;
public static final String AUTHOR = TABLE_NAME + "." + QuoteTable.AUTHOR;
public static final String AUTHOR_FULL_NAME = TABLE_NAME + "." + QuoteTable.AUTHOR_FULL_NAME;
public static final String TITLE = TABLE_NAME + "." + QuoteTable.TITLE;
public static final String QUOTE = TABLE_NAME + "." + QuoteTable.QUOTE;
public static final String QUOTE_LENGTH = TABLE_NAME + "." + QuoteTable.QUOTE_LENGTH;
public static final String BLOG_POST_LINK = TABLE_NAME + "." + QuoteTable.BLOG_POST_LINK;
}

public class QuoteFTS {

public static final String TABLE_NAME = QuoteFtsTable.TABLE_NAME;

public static final String _ID = TABLE_NAME + "." + QuoteFtsTable._ID;
public static final String TITLE = TABLE_NAME + "." + QuoteFtsTable.TITLE;
public static final String QUOTE = TABLE_NAME + "." + QuoteFtsTable.QUOTE;
public static final String SNIPPET = "snippet";

public static final String AUTHOR = Quote.TABLE_NAME + "." + QuoteTable.AUTHOR;
public static final String AUTHOR_FULL_NAME = Quote.TABLE_NAME + "." + QuoteTable.AUTHOR_FULL_NAME;
public static final String QUOTE_LENGTH = Quote.TABLE_NAME + "." + QuoteTable.QUOTE_LENGTH;
public static final String BLOG_POST_LINK = Quote.TABLE_NAME + "." + QuoteTable.BLOG_POST_LINK;

}

}

Quote 层基本上一对一地映射到数据库的 QuoteTable,而 QuoteFTS 层表示 FTS 表和 Quote 表之间的连接。 (相应的 fts fragment 结果的 fragment 列)这里我使用与数据库列名相同的列名,以便用户的投影和选择适合数据库。 (包括表名以便连接正常工作)

内容提供者的用户现在可以在所提供的这两个虚拟数据库层上进行各种查询,例如

Uri uri = QuoteContentProvider.FTS_URI;

switch (order) {
case 1: {
sortOrder = QuoteFTS.TITLE + " COLLATE NOCASE";
break;
}
case 2: {
sortOrder = QuoteFTS.AUTHOR + ", " + QuoteFTS.TITLE
+ " COLLATE NOCASE";
break;
}
case 3: {
sortOrder = QuoteFTS.QUOTE_LENGTH;
break;
}
}


String[] projection = new String[] { QuoteFTS._ID,
QuoteFTS.TITLE, QuoteFTS.AUTHOR, QuoteFTS.SNIPPET};

String selection = titleOnly ? QuoteFTS.TITLE + " MATCH ? " : QuoteFTS.TABLE_NAME + " MATCH ? ";
String[] selectionArgs = {appendWildcard(query)};

Loader<Cursor> loader = CursorLoader(this, uri, projection,selection, selectionArgs, sortOrder);

仍然需要对如何使用 MATCH 语法等有适当的了解才能使其正常工作。这一点让我感到有点不舒服,我非常感谢对此的反馈。

谢谢 friend

马丁

关于android content provider - 隐藏内部复杂性但允许复杂查询的设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12354953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com