2017-08-04 118 views
0

我想在加載器和內容提供者上練習我有一個學生數據庫,其中包含(name,degree)activity_main.xml中我有一個recyclerview和2個editText一個其他學位的名字我的目標是,當用戶點擊按鈕的名稱將出現在recyclerview ,這裏是我的logcat嘗試調用空對象上的虛擬方法

致命異常:主要 過程:com.example.abdelmagied.myapplication, PID:16160 java.lang.NullPointerException:試圖調用虛方法'void com.examp在com.example.abdelmagied.myapplication.MainActivity.onLoadFinished(MainActivity.java:97) com.example.abdelmagied上的null對象引用 上的「le.abdelmagied.myapplication.recyclerview.swapcursor(android.database.Cursor)」。 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) at android.support.v4.content.Loader.deliverResult(Loader.java:126) at android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:105) at android.support.v4.content.CursorLoader.deliverResult(CursorLoader.java:37) at android.support.v4.content.AsyncTaskLoader.dispatchOnLoadComplete(AsyncTaskLoader.java:255) at android.support.v4.content.AsyncTaskLoader $ LoadTask.onPostExecute(AsyncTaskLoader.java:80) at android.support.v4.content.ModernAsyncTask.finish(ModernAsyncTask.java:485) at android.support.v4.content.ModernAsyncTask $ InternalHandler.handleMessage(ModernAsyncTask.java :502) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(Activ ityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal .os.ZygoteInit.main(ZygoteInit。Java的:616)

這是我的MainActivity類別

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; 
    } 
} 
+0

但沒有任何問題。儘管如此,我還是給你+1,以便在他們關於例外的問題中實際包含一個幸運的堆棧跟蹤。 – hoodaticus

+0

你可能想在你的代碼中加入一些斷點來看看爲什麼NPE正在發生。看起來像它從97行onLoadFinished – DroiDev

回答

1

recyclerAdapter從不實例studentcontract類。 onCreate將是實例化recyclerview類型對象的理想場所。

相關問題