ContentResolver.insert возвращает ноль ВСЕГДА
У меня есть приложение, которое вставляет данные из деятельности и фонового обслуживающего устройства из нескольких потоков в 4-5 таблиц, используя пользовательский ContentProvider.
это 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>
это реализация insert() внутри класса DefaultProvider:
@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); и несколько проверок. В любом случае - эта вставка () должна выдавать Exception или возвращать действительный Uri, но не NULL. Так я делаю регулярно
context.getContentResolver().insert(uri, contentValues)
получить URI, и я счастлив, но редко (!) insert() возвращает ноль без исключения - похоже, что DefaultProvider.insert() вообще не сработал и никакая запись фактически не вставлена в БД. Мое приложение работает на устройствах 2.3+, но большинство этих ошибок я получаю в 4.2.2 - 4.4. Почему происходит это волшебство? Это проблема с Android или моя ошибка?