【问题标题】:CursorLoader causes Contacts.DISPLAY_NAME to be set to NULLCursorLoader 导致 Contacts.DISPLAY_NAME 设置为 NULL
【发布时间】:2013-11-29 23:59:25
【问题描述】:

在实现 LoaderManager.LoaderCallbacks 的 FragmentActivity 中创建 CursorLoader 时遇到问题。

创建 CursorLoader 时,我的 android.provider.ContactsContract.Contacts.DISPLAY_NAME 设置为 NULL。

如果我使用“display_name”字符串,我仍然可以从光标获取数据,但如果我使用 Contacts.DISPLAY_NAME 则不能,那么它只会抛出 NullPointerException。

代码中的日志消息仍然打印正确的“display_name”字符串,但是在调试 DISPLAY_NAME 时为 null,我仍然得到 NullPointer 异常,这可能与后台任务中使用的线程的类加载器有关吗?

这是我的 FragmentActivity。

package com.example.test2;

import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.provider.ContactsContract.Contacts;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;

public class MainActivity extends FragmentActivity implements LoaderManager.LoaderCallbacks<Cursor> {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        String test = Contacts.DISPLAY_NAME;
        Log.d(ACTIVITY_SERVICE, test);

        getSupportLoaderManager().initLoader(0, null, this);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
        final String select = "((" + Contacts.DISPLAY_NAME + " NOTNULL) AND ("
                + Contacts.DISPLAY_NAME + " != '' ))";

        final String[] projection = new String[] {
            Contacts._ID,
            Contacts.DISPLAY_NAME,
            Contacts.CONTACT_STATUS,
            Contacts.CONTACT_PRESENCE,
            Contacts.PHOTO_ID,
            Contacts.LOOKUP_KEY,
        };

        CursorLoader cursorLoader = new CursorLoader(
            this, 
            Contacts.CONTENT_URI,
            projection, 
            select, 
            null, 
            Contacts.DISPLAY_NAME);

        return cursorLoader;
    }

    @Override
    public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) {
        Log.d(ACTIVITY_SERVICE, Contacts.DISPLAY_NAME);

        arg1.moveToFirst();
        arg1.getString(arg1.getColumnIndex("display_name"));
        arg1.getString(arg1.getColumnIndex(Contacts.DISPLAY_NAME));
    }

    @Override
    public void onLoaderReset(Loader<Cursor> arg0) {
        // TODO Auto-generated method stub

    }

}

【问题讨论】:

    标签: android android-loadermanager android-cursorloader


    【解决方案1】:

    也许已经晚了,但应该是

    IS NOT NULL 
    

    改为

    NOTNULL
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-09
      • 2015-06-22
      • 1970-01-01
      • 2012-08-22
      • 2015-01-02
      • 2018-12-01
      • 1970-01-01
      相关资源
      最近更新 更多