首页 > 解决方案 > 加载程序中的错误:java.lang.NullPointerException:尝试调用接口方法“boolean android.database.Cursor.moveToFirst()”

问题描述

我想使用 Loader 时遇到问题,我想从另一个应用程序中检索信息,此信息使用 Content Provider 保存,并检查数据是否正确保存,数据库创建时没有问题,但是使用Loader 的方法给了我这个错误:

java.lang.NullPointerException:尝试在空对象引用上调用接口方法“boolean android.database.Cursor.moveToFirst()”

我不知道为什么会出现该错误,我的班级已经对其进行了审查,并且包的名称和表的名称是正确的,这是我实现 Loader 的班级:

    public class principal extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor>{
        TextView textView = null;
        CursorLoader cursorLoader;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_principal);
            textView = (TextView) findViewById(R.id.texto);
            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);
            toolbar.setTitle("Control de Tareas");
            toolbar.setSubtitle("Mis tareas");
            listar();
        }

        @Override
        public Loader<Cursor> onCreateLoader(int id, Bundle args) {
            cursorLoader = new CursorLoader(this, Uri.parse("content://com.example.enriq.examen_tareas_segundo_plano_enrique_espinosa.ProviderContenedor/cte"), null, null, null, null);
            return cursorLoader;
        }

        @Override
        public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
            try {
                data.moveToFirst();
                StringBuilder txt = new StringBuilder();
                while (!data.isAfterLast()){
                    txt.append("\n"+data.getString(data.getColumnIndex("id"))+" - " +data.getString(data.getColumnIndex("nombre_tarea"))+" - " +data.getString(data.getColumnIndex("nota")));
                    data.moveToNext();
                }
                textView.setText(txt);
            }catch (Exception e){
                Toast.makeText(principal.this, "No se pudo recuperar datos: ", Toast.LENGTH_LONG).show();
                Log.i("Error","Este es el error: "+e);

            }
        }

        public void listar(){
            Toast.makeText(principal.this, "Desplegando", Toast.LENGTH_SHORT).show();
            getSupportLoaderManager().initLoader(1,null,this);
        }

        @Override
        public void onLoaderReset(Loader<Cursor> loader) {

        }

        @Override
        public void onDestroy(){
            super.onDestroy();

        }
    }

我知道没有必要在我的清单中添加任何额外的权限现在,这是我实现内容提供程序的类,这个类在不同的项目中,在这里我声明了所有变量和方法:

public class ProviderContenedor extends ContentProvider {

    private SQLiteDatabase db;
    static final String DATABASE_NAME = "tareas";
    static final String TABLE_NAME = "datos";
    static final int DATABASE_VERSION = 1;
    static final String Sentencia = "CREATE TABLE "+ TABLE_NAME
            + "(id INTEGER PRIMARY KEY AUTOINCREMENT,"
            + "nombre_tarea TEXT NOT NULL,"
            + "nota TEXT NOT NULL);";
    static final String id = "id";
    static final String name = "nombre_tarea";
    static final String nota = "nota";
    static final int uriCode = 1;
    static final UriMatcher uriMatcher;
    static final String NOMBREPROVIDER = "com.example.enriq.examen_tareas_segundo_plano_enrique_espinosa.ProviderContenedor";
    static final String URL = "content://" + NOMBREPROVIDER + "/cte";
    static final Uri CONTENEDORURI = Uri.parse(URL);
    private static HashMap<String, String> values;
    static {
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        uriMatcher.addURI(NOMBREPROVIDER, "cte", uriCode);
        uriMatcher.addURI(NOMBREPROVIDER, "cte/*", uriCode);
    }


    @Override
    public boolean onCreate() {
        Context context = getContext();
        DatabaseHelper dbHelper = new DatabaseHelper(context);
        db = dbHelper.getWritableDatabase();

        if (db != null) {
            return true;
        }

        return false;
    }

    private static class DatabaseHelper extends SQLiteOpenHelper {
        DatabaseHelper(Context context){
            super(context, DATABASE_NAME, null,DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(Sentencia);
        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
            onCreate(db);
        }

    }




    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, @Nullable String[] strings, @Nullable String s, @Nullable String[] strings1, @Nullable String s1) {
        return null;
    }

    @Nullable
    @Override
    public String getType(@NonNull Uri uri) {
        return null;
    }


    @Override
    public Uri insert(@NonNull Uri uri, @Nullable ContentValues values) {
        long roWID = db.insert(TABLE_NAME, "", values);
        if(roWID > 0){
            Uri _uri = ContentUris.withAppendedId(CONTENEDORURI, roWID);
            getContext().getContentResolver().notifyChange(_uri, null);
            //Toast.makeText(getContext(),"Se a guardado la nueva tarea en el proveedor de contenidos",Toast.LENGTH_LONG).show();
            return _uri;
        }
        throw  new SQLException("Error al agregar una nueva tarea en "+uri);
    }

    @Override
    public int delete(@NonNull Uri uri, @Nullable String s, @Nullable String[] strings) {
        return 0;
    }

    @Override
    public int update(@NonNull Uri uri, @Nullable ContentValues contentValues, @Nullable String s, @Nullable String[] strings) {
        return 0;
    }
}

标签: android-studioandroid-contentproviderloader

解决方案


query方法在 ContentProvider 中被覆盖,它始终返回 null。所以你从这个提供者那里得到的任何游标都是空的。


推荐阅读