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 или моя ошибка?

0 ответов

Другие вопросы по тегам