CursorLoader подключается к неправильному ContentProvider

Эта проблема

Кажется, что для создания CursorLoader используется URI предыдущего CursorLoader, а не URI, переданный в качестве аргумента.

CursorLoader cursor = new CursorLoader(this, FLASHCARD_CONTENT_URI, 
FLASHCARD_FROM, null, null, null);

дает следующую ошибку:

no such column: front (code 1): , while compiling: 
SELECT _ID, front, back, FROM deck

Классы

  1. DeckIndex.java - отвечает за запрос к таблице "колоды" базы данных и возврат массива колоды Cursor.
  2. DeckShow.java - отвечает за запрос к таблице "флэш-карт" базы данных и возврат массива флэш-карт Cursor.
  3. AuducardOpenHelper.java - отвечает за DDL базы данных и создание.
  4. DecksProvider - отвечает за CRUD "палубного" стола
  5. FlashcardsProvider - отвечает за CRUD таблицы "flashcard"

объяснение

Передаваемый URI:

public static final Uri FLASHCARD_CONTENT_URI = 
Uri.parse("content://" + AUTHORITY + "/" + FLASHCARD_TABLE_NAME);

Я точно знаю, что это обрабатывается DecksProvider, а не FlashcardsProvider.

И UriMatcher во FlashcardsProvider:

@Override
public boolean onCreate(){
    uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    uriMatcher.addURI(AUTHORITY, "flashcard", FLASHCARDS);

    auducards = new AuducardOpenHelper(getContext());
    return true;
}

Я думаю, что важно упомянуть, что класс DecksIndex вызывается первым, и, таким образом, вызов DeckProvider завершается успешно. Пока я не нажму на одну из колод (которая запускает действие DeckShow), не будет вызван метод DeckShow onCreate:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getLoaderManager().initLoader(1, null, this);
        setContentView(R.layout.activity_deck_show);
        mAdapter = new SimpleCursorAdapter(this, R.layout.flashcard_item, null, 
              FLASHCARD_FROM, FLASHCARD_TO, 0 );

        Intent intent = getIntent();
        String message = intent.getStringExtra(DeckIndex.EXTRA_MESSAGE);

    }

и ошибка происходит.

Строки инициализации LoaderManager:

DeckIndex.java

getLoaderManager().initLoader(0, null, this);

DeckShow.java

getLoaderManager().initLoader(1, null, this);

Спасибо за просмотр моего вопроса и дайте мне знать, если какие-либо дополнительные детали или код помогут!

1 ответ

Решение

У меня возникла эта проблема, и я узнал, что для добавления второго поставщика контента мне нужно было:

  • Определите второго поставщика в файле Androidmanifest.xml. Установите для андроида: права доступа к полному имени пакета и класса.
  • Используйте авторитет как URL

Полномочия для каждого поставщика должны быть уникальными, а URL-адрес каждого провайдера должен совпадать с полномочиями. URL также должен быть в нижнем регистре.

Вот гипотетическая конфигурация:

AndroidManifest.xml

<application>
  <provider android:name="com.acme.ProviderOne"
    android:authorities="com.acme.providerone" />
  <provider android:name="com.acme.ProviderTwo"
    android:authorities="com.acme.providertwo" />
</application

SRC / COM / Acme/providerone.java

package com.acme

import android.content.ContentProvider;

public class ProviderOne extends ContentProvider {
  public static final Uri CONTENT_URI = Uri.parse("content://com.acme.providerone/objects");
  private static final int ALLROWS = 1;
  private static final int SINGLE_ROW = 2;

  static {
    uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    uriMatcher.addURI("com.acme.providerone", "objects", ALLROWS);
    uriMatcher.addURI("com.acme.providerone", "objects/#", SINGLE_ROW);
  }
}

SRC / COM / Acme/providertwo.java

package com.acme

import android.content.ContentProvider;

public class ProviderTwo extends ContentProvider {
  public static final Uri CONTENT_URI = Uri.parse("content://com.acme.providertwo/objects");
  private static final int ALLROWS = 1;
  private static final int SINGLE_ROW = 2;

  static {
    uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    uriMatcher.addURI("com.acme.providertwo", "objects", ALLROWS);
    uriMatcher.addURI("com.acme.providertwo", "objects/#", SINGLE_ROW);
  }
}
Другие вопросы по тегам