相关疑难解决方法(0)

Android:使用ContentResolver时的SQLite事务

目标:从XML数据刷新数据库

过程:

  • 开始交易
  • 从表中删除所有现有行
  • 每个解析XML的主要元素插入主表并获取PK
  • 每个主元素的子元素记录插入到第二个表中,从上一步提供FK
  • 提交交易

数据库操作相当标准的东西.问题是CRUD操作不是在内部完成,ContentProvider而是使用ContentResolver插件,例如看起来像resolver.insert(CONTENT_URI, contentValues).ContentResolver API似乎没有任何与事务相关的东西,我无法使用,bulkInsert因为我间歇性地插入2个表(另外我也希望delete在事务内部).

我正在考虑ContentProvider通过使用注册我自定义的监听器,registerContentObserver但由于ContentResolver#acquireProvider隐藏了方法,我如何获得正确的引用?

我运气不好吗?

sqlite android transactions android-contentresolver android-contentprovider

32
推荐指数
2
解决办法
2万
查看次数

主细节使用ContentResolver.applyBatch()?

我想知道是否可以在同一操作中使用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()方法,以便将操作包装在事务中.

这是可能的还是有更好的方法来做到这一点?

谢谢.

android android-contentprovider

21
推荐指数
1
解决办法
5224
查看次数

Android:SQLite一对多设计

任何人都有很好的建议如何实现一对多映射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 one-to-many

11
推荐指数
2
解决办法
1万
查看次数

ContentResolver.bulkInsert(..)有什么意义?

我的目标

我想批量插入多个记录到sqlite(事务性).

我的问题

我找到了这个方法android.content.ContentResolver.bulkInsert(..)有趣,但javadoc声明:

此函数不保证插入的原子性.

为什么android会提供一种瘫痪的方法?你能说出用于非原子插入的用例吗?我显然要覆盖ContentProvider.bulkInsert(..)以确保自己的原子性,所以我不确定为什么它是这样的短语.

android

7
推荐指数
1
解决办法
5021
查看次数

使用ContentProvider插入多个表

我正在实现一个PRIVATE ContentProvider,它有几个关系表(一对多,多对多).在我当前的实现中,所有表都可以通过URI访问.如何简化界面,以便URI不必访问内部的"通过"表?

例如,我有一个POSTS表,每个POST通过TAGGINGS表有很多TAGS.我想只与POSTS URI进行交互,并在内部进行"私有"工作ContentProvider.

为了query简单地返回带有连接表的游标,但我该怎么做insert呢?是bulkInsert我应该到什么?

android android-contentresolver android-contentprovider android-sqlite

4
推荐指数
1
解决办法
3987
查看次数