目标:从XML数据刷新数据库
过程:
数据库操作相当标准的东西.问题是CRUD操作不是在内部完成,ContentProvider而是使用ContentResolver插件,例如看起来像resolver.insert(CONTENT_URI, contentValues).ContentResolver API似乎没有任何与事务相关的东西,我无法使用,bulkInsert因为我间歇性地插入2个表(另外我也希望delete在事务内部).
我正在考虑ContentProvider通过使用注册我自定义的监听器,registerContentObserver但由于ContentResolver#acquireProvider隐藏了方法,我如何获得正确的引用?
我运气不好吗?
sqlite android transactions android-contentresolver android-contentprovider
我想知道是否可以在同一操作中使用android.content.ContentResolver.applyBatch()方法将master和detail记录保存到内容提供者,其中providers参数中的后续ContentProviderOperation项取决于先前项的结果.
我遇到的问题是,当调用ContentProviderOperation.newInsert(Uri)方法并且Uri是不可变的时,实际的Uri是未知的.
我想出的内容如下所示:
Master Uri:content://com.foobar.masterdetail/master
Detail Uri:content://com.foobar.masterdetail/master/#/detail
ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();
operations.add(ContentProviderOperation.newInsert(intent.getData())
.withValue(Master.NAME, "")
.withValue(Master.VALUE, "")
.build());
operations.add(ContentProviderOperation.newInsert(intent.getData()
.buildUpon()
.appendPath("#") /* ACTUAL VALUE NOT KNOWN UNTIL MASTER ROW IS SAVED */
.appendPath("detail")
.build())
.withValue(Detail.MASTER_ID, /* WHAT GOES HERE? */)
.withValue(Detail.NAME, "")
.withValue(Detail.VALUE, "")
.build());
ContentProviderResult[] results = this.getContentResolver().applyBatch(MasterDetail.AUTHORITY, operations);
for (ContentProviderResult result : results) {
Uri test = result.uri;
}
Run Code Online (Sandbox Code Playgroud)
在我的内容提供程序中,我重写了applyBatch()方法,以便将操作包装在事务中.
这是可能的还是有更好的方法来做到这一点?
谢谢.
任何人都有很好的建议如何实现一对多映射SQLite使用ContentProvider?如果你看,Uri ContentProvider#insert(Uri, ContentValues)你可以看到它有ContentValues包含要插入的数据的参数.问题是,它当前的实现ContentValues不支持put(String, Object)方法,类是最终的,所以我不能扩展它.为什么这是一个问题?我的设计来了:
我有两个一对多关系的表.为了在代码中表示这些,我有2个模型对象.1st表示主记录,并且具有一个第二个对象实例列表的字段.现在我在模型对象#1中有一个辅助方法,它返回ContentValues从当前对象生成的.用ContentValues#put重载方法填充原始字段是微不足道的,但我对这个列表运气不好.所以目前我的第二个表行只是一个字符串值,我生成一个逗号分隔的字符串,然后我重新分配到String []里面ContentProvider#insert.这感觉很难吃,所以也许有人可以暗示如何以更清洁的方式完成它.
这是一些代码.首先来自模型类:
public ContentValues toContentValues() {
ContentValues values = new ContentValues();
values.put(ITEM_ID, itemId);
values.put(NAME, name);
values.put(TYPES, concat(types));
return values;
}
private String concat(String[] values) { /* trivial */}
Run Code Online (Sandbox Code Playgroud)
这是ContentProvider#insert方法的精简版
public Uri insert(Uri uri, ContentValues values) {
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.beginTransaction();
try {
// populate types
String[] types = ((String)values.get(Offer.TYPES)).split("|");
// we no longer need …Run Code Online (Sandbox Code Playgroud) 我的目标
我想批量插入多个记录到sqlite(事务性).
我的问题
我找到了这个方法android.content.ContentResolver.bulkInsert(..)有趣,但javadoc声明:
此函数不保证插入的原子性.
为什么android会提供一种瘫痪的方法?你能说出用于非原子插入的用例吗?我显然要覆盖ContentProvider.bulkInsert(..)以确保自己的原子性,所以我不确定为什么它是这样的短语.
我正在实现一个PRIVATE ContentProvider,它有几个关系表(一对多,多对多).在我当前的实现中,所有表都可以通过URI访问.如何简化界面,以便URI不必访问内部的"通过"表?
例如,我有一个POSTS表,每个POST通过TAGGINGS表有很多TAGS.我想只与POSTS URI进行交互,并在内部进行"私有"工作ContentProvider.
为了query简单地返回带有连接表的游标,但我该怎么做insert呢?是bulkInsert我应该到什么?
android android-contentresolver android-contentprovider android-sqlite