ContentResolver.insert返回null EVENTUALLY

时间:2015-02-27 11:52:52

标签: android sqlite android-contentprovider android-contentresolver

我有一个应用程序,它使用自定义ContentProvider将来自活动和后台服务器的数据从多个线程插入到4-5个表中。

这是AndroidManifest.xml(我没有为提供者声明android:read(write)Permission<uses-permission>):

<application
    ...
    >
    <provider
        android:name=".content.provider.DefaultProvider"
        android:authorities="com.provider.auth"
        android:exported="false"
        android:grantUriPermissions="true"
        android:label="Default Provider"
        />
</application>

这是DefaultProvider类中的insert()实现:

@Override
public Uri insert(Uri uri, ContentValues values) {
    UriDetail uriDetail = URI_RESOLVER.match(uri);

    if (uriDetail == null || uriDetail.isSingleItem()){
        throw new IllegalArgumentException("Unsupported URI: " + uri);
    }

    SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
    long id = db.insert(uriDetail.getScheme().getName(), null, values);

    if (id != -1){
        Uri idUri;
        try {
            idUri = getUriForId(id, uri);
        } catch (SQLException e) {
            e.printStackTrace();
            throw e;
        }

        capacityManager.afterInsert(URI_RESOLVER, uriDetail, id);
        if (idUri == null){
            throw new NullPointerException(
                            "Insert into " + uriDetail.getScheme().getName() + " returned id = " + id+ " but no URI with ID was acquired!"+
                                    "\nUri: "+uri+
                                    "\nContentValues: "+values.toString()
                    );
        }
        return idUri;
    }else{
        throw new OperationApplicationException("Insert into "+uriDetail.getScheme().getName()+" returned id = "+id + "\n values: "+values.toString()));
    }

    return null;
}

UriResolver和UriDetail是用于将URI与sqlite数据库中的实际表名匹配的辅助类。 getUriForId()也只是ContentUris.withAppendedId(uri,id);几乎没有验证。在任何情况下 - 这个insert()应该抛出Exception或返回有效的Uri,但不是NULL。 所以我经常做

context.getContentResolver().insert(uri, contentValues)

接收URI并且我很高兴,但很少(!)insert()返回null而没有异常 - 看起来根本没有触发DefaultProvider.insert()并且实际上没有记录插入db。 我的应用程序适用于2.3多种设备,但大部分错误来自4.2.2 - 4.4。为什么会发生这种魔力这是Android问题还是我的错误?

0 个答案:

没有答案