Intereting Posts
Android Emulator: не удалось выделить память: 8 даже с 8 МБ ОЗУ Фрагменты ViewPager не воссоздаются после FragmentTransaction.replace (), а затем кнопки возврата Измените элемент внутри слоя-листа drawable xml Странное поведение при использовании WebView и RelativeLayout в полноэкранном режиме Установить источник ImageView динамически андроида Android PagerAdapter не сообщает правильную позицию, если нажать предыдущий элемент Вспышка вспышки Nexus 4 не срабатывает, когда режим фокусировки установлен на непрерывное изображение Есть ли встроенные / стандартные звуки, которые можно использовать в приложении? Какой лучше дизайн пакета? Android ScrollView не соответствует нижнему краю ребенка Gradle не может удалить каталог из-за .fuse_hidden Загрузка нескольких файлов одновременно в приложениях Android Интервал между звездами рейтингового бара? Как прокрутить tablayout программно – Android Изменение цветаКонтрольАктивированный цвет программно

Как правильно вставить значения в базу данных SQLite с помощью метода insert () ContentProvider с помощью CursorLoader?

Я читал документ, но я все еще не уверен. В нем говорится использовать getContentResolver() , но тогда это действительно не использует CursorLoader. Так есть ли способ сделать это через CursorLoader ? Я знаю, как это сделать с помощью query() . Являются ли шаги очень похожими? Даже просто ссылка, которая объясняет именно это, была бы полезна.

Обратите внимание: не связывайте меня с документом Google, так как у них нет примера, который когда-либо использовал метод insert() из ContentProvider с помощью CursorLoader .

Заранее спасибо!!

Редактирование. Возможно, я должен упомянуть причину, с которой я смущен, потому что вызов нового CursorLoader автоматически вызывает метод CursorLoader query() . Но как я могу сделать то же самое для вставки?

Solutions Collecting From Web of "Как правильно вставить значения в базу данных SQLite с помощью метода insert () ContentProvider с помощью CursorLoader?"

Посмотрите мой блог на тему:

Резолюции и контент-провайдеры


CursorLoader имеет к этому никакого отношения.

Вставка – совершенно другая концепция … она абсолютно не имеет отношения к CursorLoader . В сочетании с LoaderManager CursorLoader автоматически запрашивает вашу базу данных и обновляет себя, когда ContentObserver уведомляется об изменении хранилища данных. Это не имеет никакого отношения к фактическому процессу вставки данных в вашу базу данных.

Как разрешаются запросы к ContentResolver

Когда вы вставляете (или запрашиваете или обновляете или удаляете) данные в свою базу данных через поставщика контента, вы напрямую не общаетесь с провайдером. Вместо этого вы используете объект ContentResolver для связи с провайдером (обратите внимание, что ContentResolver является частной переменной экземпляра в глобальном Context вашего приложения). Более конкретно, последовательность выполненных этапов:

  1. Вы вызываете getContentResolver().insert(Uri, ContentValues);

  2. Объект ContentResolver определяет полномочия Uri.

  3. ContentResolver передает запрос поставщику контента, зарегистрированному в этом органе (поэтому вам нужно указать полномочия в AndroidManifest.xml ).

  4. Поставщик контента получает запрос и выполняет указанную операцию (в этом случае insert ). Как и где данные вставляются, зависит от того, как вы реализовали метод insert ( ContentProvider – это абстрактный класс, который требует, чтобы пользователь реализовал insert , query , delete , update и getType ).

Надеюсь, вы могли обернуть вокруг себя хотя бы немного. Причина, по которой происходит так много шагов, заключается в том, что Android (1) позволяет приложениям иметь более одного поставщика контента, и (2) должен гарантировать, что приложения могут безопасно обмениваться данными с другими сторонними приложениями. (Это было не потому, что он хотел смутить вас, я обещаю).

Вставка данных через ContentProvider

Теперь, когда вы (надеюсь) лучше ContentResolver как ContentResolver может передать эти запросы поставщику контента, вставка данных довольно прямолинейна:

  1. Сначала определите, какой uri вы хотите согласовать со своим поставщиком контента. Это зависит от того, как вы решили совместить свой урис с UriMatcher . Каждый uri, который у вас есть, представляет собой другое средство вставки данных во внутреннюю базу данных (т. Е. Если ваше приложение имеет две таблицы, у вас, вероятно, будет два uris, по одному для каждой таблицы).

  2. Создайте новый объект ContentValues и используйте его для упаковки данных, которые вы хотите отправить поставщику содержимого. Объект ContentValues сопоставляет имена столбцов с данными. В приведенном ниже примере имя столбца – «column_1», а значение, вставленное под этим столбцом, – «value_1»:

     ContentValues values = new ContentValues(); values.put("column_1", "value_1"); 
  3. Получив, поставщик контента (в вашем случае) передаст объект values в вашу SQLiteDatabase (через метод SQLiteDatabase.insert(String table, String nullColumnHack, ContentValues values) ). В отличие от ContentProvider , этот метод реализован для вас … SQLiteDatabase знает, как обрабатывать объект values и вставляет строку в базу данных, возвращая идентификатор строки вставленной строки или -1 если вставка не удалась.

… и вот как вы вставляете данные в свою базу данных.


TL; DR

Используйте getContentResolver().insert(Uri, ContentValues);

Преобразуйте курсор в ContentValues ​​для удобной вставки базы данных.

В нем говорится использовать getContentResolver (), но тогда это действительно не использует CursorLoader

Кроме того, что сказал Алекс, нет ничего, что помешало бы вам повторить через Cursor , вернув его в ContentValue а затем вставив его (скажем, в другую БД).

Просто пример из верхней части моей головы (простой Cursor из двух столбцов String ):

 @Override public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) { if (cursor.moveToFirst()) { ArrayList<ContentValues> values = new ArrayList<ContentValues>(); do { ContentValues row = new ContentValues(); DatabaseUtils.cursorStringToContentValues(cursor, fieldFirstName, row); DatabaseUtils.cursorStringToContentValues(cursor, fieldLastName, row); values.add(row); } while (cursor.moveToNext()); ContentValues[] cv = new ContentValues[values.size()]; values.toArray(cv); getContentResolver().bulkInsert(CONTENT_NAMES, cv); } } 

Вероятно, есть более эффективные способы сделать это (и определенно некоторые проверки целостности), но это была моя первая мысль …