ContentProvider: managedQuery () работает;Запрос () не выполняется - PullRequest
0 голосов
/ 15 апреля 2011

В моем приложении я нахожусь в процессе упаковки доступа к базе данных в ContentProvider. Это потому, что иногда у меня возникают сбои, потому что два потока обращаются к базе данных одновременно. Я в значительной степени полагаюсь на фоновые потоки, чтобы получить данные с веб-сервера и поместить их в базу данных; когда пользователь переключается между действиями, у вас может быть несколько запущенных одновременно. Вот почему.

Теперь как. Я реализовал класс ContentProvider, и это, кажется, работает нормально. Зарегистрировано в манифесте, и это также показывает в LogCat, что поставщик активен.

Приложение со всеми своими действиями обращается к базе данных через класс-оболочку, который сам по себе не является действием. Конструктор этого класса принимает контекст вызывающего действия в качестве параметра. Ничего особенного там нет.

Теперь моя проблема: При обращении к поставщику контента через метод context.query () я получаю сбой:

04-15 23:05:33.699: ERROR/AndroidRuntime(3564): Caused by: java.lang.NullPointerException
04-15 23:05:33.699: ERROR/AndroidRuntime(3564):     at android.content.ContentResolver.acquireProvider(ContentResolver.java:727)
04-15 23:05:33.699: ERROR/AndroidRuntime(3564):     at android.content.ContentResolver.query(ContentResolver.java:239)
04-15 23:05:33.699: ERROR/AndroidRuntime(3564):     at squirrel.DeaddropDroid.DeaddropDB.query(DeaddropDB.java:482)

Оскорбительная строка:

final Cursor blog2 = db.query(DeaddropDB.BLOG_TABLE, new String[] {
            DeaddropDB.KEY_ID, DeaddropDB.KEY_DATE,
            DeaddropDB.KEY_BLOG_SUMMARY }, null, null,
            DeaddropDB.KEY_DATE + " DESC");

db - это объект БД, конструктор принимает контекст действия в качестве параметра. В том же упражнении следующая строка работает как положено и дает правильные результаты:

final Cursor blog = managedQuery(DeaddropDBProvider.BLOG_URI,
            new String[] {DeaddropDB.KEY_ID, DeaddropDB.KEY_DATE,
            DeaddropDB.KEY_BLOG_SUMMARY }, null, null,
            DeaddropDB.KEY_DATE + " DESC");

Это доказывает, что мой ContentProvider работает и правильно зарегистрирован. Я действительно в недоумении от того, что здесь происходит! Почему этот запрос не работает как рекламируется?

1 Ответ

2 голосов
/ 17 апреля 2011

И наконец, как и обещал, мой ответ.

Правильно, в конце концов, это была моя вина (конечно). Я немного покопался в исходниках Android (еще одно замечание по открытым источникам), и после некоторого дальнейшего тестирования я нашел причину. Мой Ури был нулевым! Я пытаюсь импортировать URI от провайдера, но там что-то идет не так. Это будет мой следующий вопрос, так как пока у меня есть обходной путь, я не понимаю, почему это идет не так.

Это мой следующий вопрос: Сбой загрузки URI из myContentProvider (нулевой результат) , так как пока у меня есть работающее решение, я не понимаю, почему оно идет не так. Более подробная информация по этому вопросу находится там.

...