尝试在空对象

时间:2017-08-04 19:22:33

标签: java android android-contentprovider loader

我正在尝试在装载程序和内容提供程序上练习我有一个学生数据库,其中包含(name,degree)在activity_main.xml中我有一个recyclerview和2 editText一个用于名称其他程度我的目标是当用户单击按钮,名称将显示在recyclerview中 这里是我的logcat

  

致命的例外:主要                                                                                              处理:com.example.abdelmagied.myapplication,PID:16160                                                                                              java.lang.NullPointerException:尝试调用虚方法' void com.example.abdelmagied.myapplication.recyclerview.swapcursor(android.database.Cursor)'在null对象引用上                                                                                                  at com.example.abdelmagied.myapplication.MainActivity.onLoadFinished(MainActivity.java:97)                                                                                                  在com.example.abdelmagied.myapplication.MainActivity.onLoadFinished(MainActivity.java:17)                                                                                                  在android.support.v4.app.LoaderManagerImpl $ LoaderInfo.callOnLoadFinished(LoaderManager.java:476)                                                                                                  在android.support.v4.app.LoaderManagerImpl $ LoaderInfo.onLoadComplete(LoaderManager.java:444)                                                                                                  在android.support.v4.content.Loader.deliverResult(Loader.java:126)                                                                                                  在android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:105)                                                                                                  在android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:37)                                                                                                  在android.support.v4.content.AsyncTaskLoader.dispatchOnLoadComplete(AsyncTaskLoader.java:255)                                                                                                  在android.support.v4.content.AsyncTaskLoader $ LoadTask.onPostExecute(AsyncTaskLoader.java:80)                                                                                                  在android.support.v4.content.ModernAsyncTask.finish(ModernAsyncTask.java:485)                                                                                                  在android.support.v4.content.ModernAsyncTask $ InternalHandler.handleMessage(ModernAsyncTask.java:502)                                                                                                  在android.os.Handler.dispatchMessage(Handler.java:102)                                                                                                  在android.os.Looper.loop(Looper.java:148)                                                                                                  在android.app.ActivityThread.main(ActivityThread.java:5417)                                                                                                  at java.lang.reflect.Method.invoke(Native Method)                                                                                                  在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726)                                                                                                  在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

这是我的主要活动课

package com.example.abdelmagied.myapplication;

import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.EditText;

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

    public static final String[] MAIN_STUDENT_PROJECTION = {

            studentContract.StudentEntry._ID ,

            studentContract.StudentEntry.COLUMN_NAME ,

            studentContract.StudentEntry.COLUMN_DEGREE ,

    };

    public static final int INDEX_COLUMN_ID      = 0;
    public static final int INDEX_COLUMN_NAME    = 1;
    public static final int INDEX_COLUMN_DEGREE  = 2;


    private recyclerview recyclerAdapter;
    private int mposition = RecyclerView.NO_POSITION;

    public static final int ID_STUDNET_LOADER = 99;

    // details of the recyclerview

     RecyclerView recycler;
     RecyclerView.Adapter myadapter;
     RecyclerView.LayoutManager mymanager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        // adjust the recyclerview
        recycler  = (RecyclerView) findViewById(R.id.recyclerid);
        myadapter = new recyclerview(this);
        mymanager = new LinearLayoutManager(this);

        recycler.setAdapter(myadapter);
        recycler.setLayoutManager(mymanager);

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

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        switch(id)
        {
            case ID_STUDNET_LOADER :

                Uri  Query    = studentContract.StudentEntry.CONTENT_URI;


                return new CursorLoader(this  ,
                              Query ,
                              MAIN_STUDENT_PROJECTION ,
                              null ,
                              null  ,
                              null
                           );

             default:
                  throw new RuntimeException("Loader is not implemented : " + id);
        }
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) {

        recyclerAdapter.swapcursor(data);
        if(mposition == RecyclerView.NO_POSITION) mposition = 0;
        recycler.smoothScrollToPosition(mposition);
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
           recyclerAdapter.swapcursor(null);
    }

    public void addtodatabase(View view) {

        EditText name = (EditText) findViewById(R.id.name);
        EditText degree=(EditText) findViewById(R.id.degree);

        // make a contentvalues and put name  , degree , salary on  it...
        ContentValues values = new ContentValues();
        values.put(studentContract.StudentEntry.COLUMN_NAME   , name.getText().toString());
        values.put(studentContract.StudentEntry.COLUMN_DEGREE , degree.getText().toString());
        getContentResolver().insert(studentContract.StudentEntry.CONTENT_URI , values);
    }
}

这里是recyclerview适配器

package com.example.abdelmagied.myapplication;

import android.content.Context;
import android.database.Cursor;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

/**
 * Created by AbdELMagied on 8/4/2017.
 */

public class recyclerview extends RecyclerView.Adapter<RecyclerView.ViewHolder> {


    Context context;

    private Cursor mycursor;
    public recyclerview(Context context) {
        this.context = context;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View view =   LayoutInflater.from(context).inflate(R.layout.recyclerrow , parent , false);
        return new viewholder(view);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

         mycursor.move(position);
         viewholder myholder = (viewholder) holder;
        myholder.mytxt.setText(mycursor.getString(MainActivity.INDEX_COLUMN_NAME));

    }

    void swapcursor(Cursor mycurso)
    {
        this.mycursor = mycurso;
        notifyDataSetChanged();
    }

    @Override
    public int getItemCount() {
        if(mycursor == null) return 0;
        return mycursor.getCount();
    }

    public class viewholder extends RecyclerView.ViewHolder
    {
        public  TextView mytxt;
        public viewholder(View itemView) {
            super(itemView);
            mytxt = (TextView) itemView.findViewById(R.id.textView);
        }
    }
}

此处是我的内容提供商

package com.example.abdelmagied.myapplication;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.support.annotation.Nullable;
import android.text.TextUtils;

/**
 * Created by AbdELMagied on 8/4/2017.
 */

public class studentprovider extends ContentProvider {

    databaseopenhelper mydatabase;

    static final int STUDENT = 100;

    static final int STUDENT_WITH_ID = 101;

    private UriMatcher urimatcher = matcher();

    private UriMatcher matcher() {

        UriMatcher mymatcher = new UriMatcher(UriMatcher.NO_MATCH);
        mymatcher.addURI(studentContract.authority, "student", STUDENT);
        mymatcher.addURI(studentContract.authority, "student/#", STUDENT_WITH_ID);
        return mymatcher;

    }

    @Override
    public boolean onCreate() {
        mydatabase = new databaseopenhelper(getContext());
        return true;
    }


    @Nullable
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        Cursor returncursor;
        switch (urimatcher.match(uri)) {

            case STUDENT:

                returncursor = mydatabase.getReadableDatabase().query(
                        studentContract.StudentEntry.TABLE_NAME,
                        projection,
                        selection,
                        selectionArgs,
                        null,
                        null,
                        sortOrder
                );
                break;

            case STUDENT_WITH_ID:

                String where = "_id = " + uri.getLastPathSegment() + (!TextUtils.isEmpty(selection)? " AND " +  selection : "");

                returncursor = mydatabase.getReadableDatabase().query(

                        studentContract.StudentEntry.TABLE_NAME,
                        projection,
                        where,
                        selectionArgs,
                        null,
                        null,
                        sortOrder

                );
                break;

            default:
                throw new UnsupportedOperationException("not found  uri " + uri);
        }

        returncursor.setNotificationUri(getContext().getContentResolver() , uri);
        return returncursor;
    }


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

    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues values) {
         long rowid =  mydatabase.getWritableDatabase().insert(studentContract.StudentEntry.TABLE_NAME, null , values);
          if(rowid > 0)
          {
              Uri _uri = ContentUris.withAppendedId(studentContract.StudentEntry.CONTENT_URI, rowid);
              getContext().getContentResolver().notifyChange(_uri, null);
              return _uri;
          }

        throw new SQLException("Faild to add a record " + uri);
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        if(selection == "") selection= "1";
        int numberofdeleted = 0;
        switch (urimatcher.match(uri))
        {
            case STUDENT:
                 String where = "_id = " + uri.getLastPathSegment()  + (!TextUtils.isEmpty(selection)? "AND " + selection : "");
                 numberofdeleted = mydatabase.getWritableDatabase().delete("students" , where , selectionArgs);
                break;
            default:
                throw new UnsupportedOperationException("uri not found  " + uri);
        }
           if(numberofdeleted != 0)
           {
               getContext().getContentResolver().notifyChange(uri , null);
           }
        return numberofdeleted;
    }


    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        return 0;
    }
}

这里是数据库类

package com.example.abdelmagied.myapplication;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
 * Created by AbdELMagied on 8/4/2017.
 */

public class databaseopenhelper extends SQLiteOpenHelper {


    public databaseopenhelper(Context context) {

        super(context, "student.db", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {


          final String SQL_CREATE_STUDENT_TABLE =

                          "CREATE TABLE " + studentContract.StudentEntry.TABLE_NAME + " ("  +

                           studentContract.StudentEntry._ID + " INTEGER  PRIMARY KEY , "  +

                           studentContract.StudentEntry.COLUMN_NAME + " TEXT , " +

                           studentContract.StudentEntry.COLUMN_DEGREE + " TEXT ); " ;


          db.execSQL(SQL_CREATE_STUDENT_TABLE);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

         db.execSQL("drop database if exists student");

         onCreate(db);
    }
}

此处的学生合同课程

package com.example.abdelmagied.myapplication;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.support.annotation.Nullable;
import android.text.TextUtils;

/**
 * Created by AbdELMagied on 8/4/2017.
 */

public class studentprovider extends ContentProvider {

    databaseopenhelper mydatabase;

    static final int STUDENT = 100;

    static final int STUDENT_WITH_ID = 101;

    private UriMatcher urimatcher = matcher();

    private UriMatcher matcher() {

        UriMatcher mymatcher = new UriMatcher(UriMatcher.NO_MATCH);
        mymatcher.addURI(studentContract.authority, "student", STUDENT);
        mymatcher.addURI(studentContract.authority, "student/#", STUDENT_WITH_ID);
        return mymatcher;

    }

    @Override
    public boolean onCreate() {
        mydatabase = new databaseopenhelper(getContext());
        return true;
    }


    @Nullable
    @Override
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
        Cursor returncursor;
        switch (urimatcher.match(uri)) {

            case STUDENT:

                returncursor = mydatabase.getReadableDatabase().query(
                        studentContract.StudentEntry.TABLE_NAME,
                        projection,
                        selection,
                        selectionArgs,
                        null,
                        null,
                        sortOrder
                );
                break;

            case STUDENT_WITH_ID:

                String where = "_id = " + uri.getLastPathSegment() + (!TextUtils.isEmpty(selection)? " AND " +  selection : "");

                returncursor = mydatabase.getReadableDatabase().query(

                        studentContract.StudentEntry.TABLE_NAME,
                        projection,
                        where,
                        selectionArgs,
                        null,
                        null,
                        sortOrder

                );
                break;

            default:
                throw new UnsupportedOperationException("not found  uri " + uri);
        }

        returncursor.setNotificationUri(getContext().getContentResolver() , uri);
        return returncursor;
    }


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

    @Nullable
    @Override
    public Uri insert(Uri uri, ContentValues values) {
         long rowid =  mydatabase.getWritableDatabase().insert(studentContract.StudentEntry.TABLE_NAME, null , values);
          if(rowid > 0)
          {
              Uri _uri = ContentUris.withAppendedId(studentContract.StudentEntry.CONTENT_URI, rowid);
              getContext().getContentResolver().notifyChange(_uri, null);
              return _uri;
          }

        throw new SQLException("Faild to add a record " + uri);
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        if(selection == "") selection= "1";
        int numberofdeleted = 0;
        switch (urimatcher.match(uri))
        {
            case STUDENT:
                 String where = "_id = " + uri.getLastPathSegment()  + (!TextUtils.isEmpty(selection)? "AND " + selection : "");
                 numberofdeleted = mydatabase.getWritableDatabase().delete("students" , where , selectionArgs);
                break;
            default:
                throw new UnsupportedOperationException("uri not found  " + uri);
        }
           if(numberofdeleted != 0)
           {
               getContext().getContentResolver().notifyChange(uri , null);
           }
        return numberofdeleted;
    }


    @Override
    public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
        return 0;
    }
}

1 个答案:

答案 0 :(得分:1)

从不实例化recyclerAdapter。 onCreate将是一个实例化recyclelerview类型对象的理想场所。