2017-02-25 66 views
0

我正在android应用程序中实现一个基本的CRUD函数。我通过我的注册创建了一个CREATE方法,并在我的登录中进行了读取。我没有收到我的注册错误,但当我登录我的应用程序崩溃,并在我的光标上生成空指针异常。光标指向null

我调用该方法searchRecord上登录按钮点击:

mLogin.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        if(!mUsername.getText().toString().isEmpty() && !mPassword.getText().toString().isEmpty()) { 
         DBase db = new DBase(MainActivity.this); 
         if(db.searchRecord(mUsername.getText().toString(), mPassword.getText().toString())){ 
          Toast.makeText(MainActivity.this, "Welcome, "+mUsername.getText().toString()+"!", Toast.LENGTH_LONG).show(); 
          Intent intent = new Intent(MainActivity.this,TimeSetter.class); 
          startActivity(intent); 
         } 
         else { 
          Intent intent = new Intent(MainActivity.this,SignupActivity.class); 
          startActivity(intent); 
         } 

        } 
       } 
      }); 

这里是searchRecord方法在我的质数据库类:

public Boolean searchRecord(String username, String password) throws SQLException{ 
    Boolean isUser = false; 
    String selectQuery = "SELECT * FROM "+DB_TABLE+" WHERE "+K_NAME+" = "+username+ " AND "+K_PASSWORD+" = "+password; 
    Cursor c = null; 

    c = dBase.rawQuery(selectQuery, null); 

    if(c.moveToFirst()){ 
      isUser = false; 
    } 
    else { 
     isUser = false; 
    } 
    return isUser; 
} 

我实际上是基于上一个从获取记录功能单独的项目,我发现,因为我不熟悉SQLite:

public String[] getRecord(int rid) throws SQLException{ 
    String selectQuery = "SELECT * FROM "+DB_TABLE+" WHERE "+K_RID+" = "+rid; 
    Cursor c = null; 
    c = dBase.rawQuery(selectQuery, null); 
    String[] data = new String[2]; 
    if(c.moveToFirst()){ 
     int indexName = c.getColumnIndex(K_NAME); 
     int indexCourse = c.getColumnIndex(K_EMAIL); 
     int indexPassword = c.getColumnIndex(K_PASSWORD); 
     data[0] = c.getString(indexName); 
     data[1] = c.getString(indexCourse); 
     data[2] = c.getString(indexPassword); 
    } 
    return data; 
} 

最后,这里是我的数据库声明:

@Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 
     db.execSQL(
       "CREATE TABLE " + DB_TABLE + " (" + 
         K_RID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
         K_NAME + " TEXT NOT NULL, " + 
         K_EMAIL + " TEXT NOT NULL, " + 
         K_PASSWORD + " TEXT NOT NULL);" 
     ); 
    } 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 
     db.execSQL("DROP TABLE IF EXIST " + DB_TABLE); 
     onCreate(db); 
    } 

下面是我对错误日志:

02-25 22:33:22.261 21810-21810/com.exceptions.finalproject E/AndroidRuntime: FATAL EXCEPTION: main 
                     Process: com.exceptions.finalproject, PID: 21810 
                     java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.Cursor android.database.sqlite.SQLiteDatabase.rawQuery(java.lang.String, java.lang.String[])' on a null object reference 
                      at com.exceptions.finalproject.DBase.searchRecord(DBase.java:84) 
                      at com.exceptions.finalproject.MainActivity$1$1.onClick(MainActivity.java:38) 
                      at android.view.View.performClick(View.java:4848) 
                      at android.view.View$PerformClick.run(View.java:20262) 
                      at android.os.Handler.handleCallback(Handler.java:815) 
                      at android.os.Handler.dispatchMessage(Handler.java:104) 
                      at android.os.Looper.loop(Looper.java:194) 
                      at android.app.ActivityThread.main(ActivityThread.java:5637) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at java.lang.reflect.Method.invoke(Method.java:372) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

它指出,这条线:c = dBase.rawQuery(selectQuery, null);

谢谢!

回答

1

你在误读例外。该错误说明在空引用上调用方法rawQuery。这意味着dBase变量为空,而不是光标。

问题的根源在于别处,无论变量初始化。