我有一个应用程序,它使用自定义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问题还是我的错误?