android - CursorLoader 连接到错误的 ContentProvider

标签 android android-contentprovider android-loader

问题

CursorLoader 实例化似乎使用了先前 CursorLoader 的 URI,而不是作为参数传入的 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 - 负责查询数据库“deck”表 并返回一个 Cursor 数组。
  2. DeckShow.java - 负责查询数据库“flashcard” 表并返回抽认卡的游标数组。
  3. AuducardOpenHelper.java - 负责数据库的DDL和创建。
  4. DecksProvider - 负责“deck”表的 CRUD
  5. FlashcardsProvider - 负责“flashcard”表的 CRUD

说明

传递的 URI:

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

我知道这是由 DecksProvider 而不是 FlashcardsProvider 处理的事实。

还有 FlashcardsProvider 中的 UriMatcher:

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

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

我认为首先调用 DecksIndex 类很重要,因此成功完成了对 DeckProvider 的调用。直到我单击其中一个套牌(启动 DeckShow Activity )时,才调用 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);

感谢您查看我的问题,如果任何其他详细信息或代码有帮助,请告诉我!

最佳答案

我遇到过这个问题,了解到要添加第二个内容提供者,我必须:

  • 在 Androidmanifest.xml 文件中定义第二个提供程序。将 android:authority 设置为包和类的全名。
  • 使用权限作为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);
  }
}

关于android - CursorLoader 连接到错误的 ContentProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14129352/

相关文章:

java - Android 中的 Http cookie 存储

android - 使用 Intent 共享文本 + 链接

android - 在 android 中使用 intent 分享到 facebook

Android - contentResolver.notifyChange() 降低性能

android - 以菊花链方式连接 Android Loader 是个坏主意吗?

android - 为什么Loaders不能是非静态内部类?

android - 如何去除Button的背景资源?

android - 在 android 2.2 中使用 Cursor Adapters 和 Content Provider 的正确方法是什么

Android Lollipop 联系人检索空指针异常

android - 在一个 Activity 中使用不同的 (AsyncTask) Loader