gpt4 book ai didi

android - 如何实现多表的内容提供者?

转载 作者:行者123 更新时间:2023-11-29 14:22:58 25 4
gpt4 key购买 nike

更新:查看"vnd.android.cursor.dir/vnd.google.note""vnd.android.cursor.item/vnd .google.note" 在我看来,光标好像是针对一张表的。

从示例来看,似乎内容提供程序被设计为使用一个表。我确实知道如何在 sqlite 中使用多个表,但在我看来,内容提供者似乎是关于从一个表中选择一行或多行。

参见 http://developer.android.com/guide/topics/providers/content-provider-creating.html

另请参阅 adt-bundle-windows-x86-20131030\sdk\samples\android-19\legacy\NotePad\src\com\example\android\notepad 中的记事本示例

假设我想按主题做笔记。

我想要一个包含列 _id 和 Title_text 的主题表。我希望 Notes 表包含列 _id 和外键 Topic_id 和 Note_text。

如何设计主题和注释?

但查看 Notes 样本、内容 URI 和内容提供者的文档,似乎拥有多个相关表是事后才想到的,对我来说并不明显。

来自 NotepadProvider.java, Notepad.java:

    public static final String CONTENT_TYPE = "vnd.android.cursor.dir/vnd.google.note";

/**
* The MIME type of a {@link #CONTENT_URI} sub-directory of a single
* note.
*/
public static final String CONTENT_ITEM_TYPE = "vnd.android.cursor.item/vnd.google.note";

public static final Uri CONTENT_ID_URI_BASE
= Uri.parse(SCHEME + AUTHORITY + PATH_NOTE_ID);

/**
* The content URI match pattern for a single note, specified by its ID. Use this to match
* incoming URIs or to construct an Intent.
*/
public static final Uri CONTENT_ID_URI_PATTERN
= Uri.parse(SCHEME + AUTHORITY + PATH_NOTE_ID + "/#");



@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
String sortOrder) {
...
switch (sUriMatcher.match(uri)) {

// If the incoming URI is for notes, chooses the Notes projection
case NOTES:
qb.setProjectionMap(sNotesProjectionMap);
break;

/* If the incoming URI is for a single note identified by its ID, chooses the
* note ID projection, and appends "_ID = <noteID>" to the where clause, so that
* it selects that single note
*/
case NOTE_ID:
qb.setProjectionMap(sNotesProjectionMap);
qb.appendWhere(
NotePad.Notes._ID + // the name of the ID column
"=" +
// the position of the note ID itself in the incoming URI
uri.getPathSegments().get(NotePad.Notes.NOTE_ID_PATH_POSITION));
break;

最佳答案

创建 ContentProvider 时,期望其他应用程序将使用您的数据库,我指的是其他对您的数据库方案一无所知的人。为了方便他们,您可以创建并记录您的 URI:

访问所有书籍

content://org.example.bookprovider/books

通过id访问图书

content://org.example.bookprovider/books/#

按作者姓名访问书籍

content://org.example.bookprovider/books/author

根据需要创建尽可能多的 URI,这取决于您。通过这种方式,您的提供者的用户可以非常轻松地访问您的数据库信息,也许这就是为什么您会觉得提供者被设计为与一个表数据库一起工作,但不,内部是完成工作的地方。

在您的 ContentProvider 子类中,您可以使用 UriMatcher 来识别将要传递给您的 ContentProvider 方法(queryinsert更新删除)。如果 Uri 请求的数据存储在多个表中,您实际上可以执行 JOINGROUP BY 或任何您需要的操作SQLiteQueryBuilder ,例如

public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
SQLiteQueryBuilder mQueryBuilder = new SQLiteQueryBuilder();
. . .
String Joins = " t1 INNER JOIN table2 t2 ON t2._id = t1._id"
+ " INNER JOIN table3 t3 ON t3._id = t1._id";

switch (mUriMatcher.match(uri)) {
case DATA_COLLECTION_URI:
mQueryBuilder.setTables(YourDataContract.TABLE1_NAME + Joins);
mQueryBuilder.setProjectionMap(. . .);
break;
case SINGLE_DATA_URI:
mQueryBuilder.setTables(YourDataContract.TABLE1_NAME + Joins);
mQueryBuilder.setProjectionMap(. . .);
mQueryBuilder.appendWhere(Table1._ID + "=" + uri.getPathSegments().get(1));
break;
case . . .
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
. . .
SQLiteDatabase db = mOpenHelper.getReadableDatabase();
Cursor c = mQueryBuilder.query(db, projection, selection, selectionArgs, groupBy, having, orderBy);
return c;
}

希望对您有所帮助。

关于android - 如何实现多表的内容提供者?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23846374/

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