android - 使用 ContentProvider 插入到多个表

标签 android android-contentprovider android-contentresolver android-sqlite

我正在实现一个 PRIVATE ContentProvider,它具有很少的关系表(一对多、多对多)。在我当前的实现中,所有表都可以通过 URI 访问。 我怎样才能简化界面,使内部的“直通”表不必通过 URI 访问?

比如我有一个POSTS表,每个POST通过TAGGINGS表有很多TAGS。 我只想与 POSTS URI 交互,并在 ContentProvider 中进行“私有(private)”工作。

对于 query 返回一个带有连接表的游标很简单,但是我如何使用 insert 做到这一点? bulkInsert 是我应该研究的内容吗?

最佳答案

这是ContentProvider的限制。如果您不向其他应用程序公开您的数据,您可以使用您的自定义数据库适配器实现,方法和查询直接满足您的要求。

bulkInsert() 在这种情况下无济于事,因为它一次仅将行插入到一个表中。但是看看ContentProvider.applyBatch()方法和ContentProviderOperation , ContentProviderOperation.Builder类(您可能需要 withValueBackReference() 进行一对多插入)。

这些链接应该可以帮助您了解如何使用它们:

http://www.grokkingandroid.com/better-performance-with-contentprovideroperation/ http://www.grokkingandroid.com/androids-contentprovideroperation-withbackreference-explained/ What are the semantics of withValueBackReference?

但是请注意,如果您一次插入许多行,使用 ContentProviderOperationbulkInsert() 慢得多,因为它解析 Uri (字符串比较)每次执行操作时。这样做你仍然需要公开 Uri 以插入到子表中。

如果您决定使用 applyBatch(),请在您的提供程序中覆盖它,以便它在一个事务中执行所有操作,从而保持数据的一致性并加快数据库操作:

@Override
public ContentProviderResult[] applyBatch(ArrayList<ContentProviderOperation> operations)
        throws OperationApplicationException {
    final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
    db.beginTransaction();
    try {
        ContentProviderResult[] results = super.applyBatch(operations);
        db.setTransactionSuccessful();
        return results;
    } finally {
        db.endTransaction();
    }
}

关于android - 使用 ContentProvider 插入到多个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11492122/

相关文章:

android - 列出所选帐户支持的权限

android - 直播 channel - 查询返回安全异常

java - ContentProvider insert() 总是在 UI 线程上运行?

android - 如何使网格线在 Android GraphView 中不可见?

android - libgdx - Assets 文件在 .apk 中翻倍

android - 无法添加名称为 'kotlin' 的扩展,因为已经有一个扩展使用该名称注册

android - 使用 ContactsContract.Contacts.Data

Android Content Provider SQLite 连接表

android - 我怎样才能让我的后退按钮像设备后退按钮 android 一样工作

android - cursor.setNotificationUri() 和 getContentResolver().notifyChange(uri,null) 之间的区别