我正在实现一个 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?
但是请注意,如果您一次插入许多行,使用 ContentProviderOperation
比 bulkInsert()
慢得多,因为它解析 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/