2016-05-19 5 views
1

私はアンドロイドを新しくしました。私は、ログインページを作成し、データベースにユーザーの詳細を保存しようとしています。サインアップアクティビティは正常に動作します。しかし、私はログインボタンをクリックすると、次のエラーが表示されます:java.lang.NullPointerException:仮想メソッド 'android.database.Cursor android.database.sqlite.SQLiteDatabase.query(java.lang.String、java.lang nullオブジェクト参照 に「[]、java.lang.Stringで、java.lang.Stringで[]、java.lang.Stringで、java.lang.Stringで、java.lang.String)を.Stringすることは、誰かが助けることができます。ログインページとサインアップページは、ユーザーの詳細を保存しないでください

DatabaseUserDetails:

public class DatabaseUserDetails extends SQLiteOpenHelper{ 
private static final int DATABASE_VERSION=1; 
private static final String DATABASE_NAME = "userDetailsDB.db"; 

private static final String TABLE = "userdeatils"; 

public static final String COLUMN_USERNAME = "username"; 
public static final String COLUMN_PASSWORD = "password"; 
public static final String COLUMN_EMAIL = "emailid"; 
public SQLiteDatabase db; 

public DatabaseUserDetails(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { 
    super(context, DATABASE_NAME, factory, DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase db) { 
    String CREATE_TABLE_CLASS = "CREATE TABLE " + TABLE + "(" + 
      COLUMN_USERNAME + " " + " TEXT," + 
      COLUMN_PASSWORD + " " + " TEXT," + 
      COLUMN_EMAIL + " TEXT)"; 
    Log.d("onCreate",CREATE_TABLE_CLASS); 
    db.execSQL(CREATE_TABLE_CLASS); 
} 

public void insertEntry(String username,String password,String emailid) 
{ 
    ContentValues values = new ContentValues(); 
    values.put(COLUMN_USERNAME, username); 
    values.put(COLUMN_PASSWORD,password); 
    values.put(COLUMN_PASSWORD, emailid); 
    SQLiteDatabase db = this.getWritableDatabase(); 
    db.insert(TABLE,null,values); 
    Log.d("insertEntry",username); 
    Log.d("insertEntry",password); 
    db.close(); 
} 
public String getSinlgeEntry(String userName) 
{ 
    Cursor cursor=db.query(TABLE, null, " username=?", new String[]{userName}, null, null, null); 
    if(cursor.getCount()<1) // UserName Not Exist 
    { 
     cursor.close(); 
     return "NOT EXIST"; 
    } 
    cursor.moveToFirst(); 
    String password= cursor.getString(cursor.getColumnIndex(COLUMN_PASSWORD)); 
    cursor.close(); 
    return password; 
} 

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

LoginActivity.java

mLogin.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String struserName = mUsername.getText().toString(); 
      String strpassword = mPassword.getText().toString(); 
      DatabaseUserDetails dbuserdeatils = new DatabaseUserDetails(getBaseContext(),null,null,1); 
      String storedPassword = dbuserdeatils.getSinlgeEntry(struserName); 
      if(strpassword.equals(storedPassword)) { 
       Toast.makeText(LoginActivity.this,"Welcome home"+struserName,Toast.LENGTH_LONG).show(); 
      //Go to homepage 
      Intent intent = new Intent(LoginActivity.this, HomePageActivity.class); 
      startActivity(intent); 
      }else{ 
        Toast.makeText(LoginActivity.this,"Username and passwords do not match",Toast.LENGTH_LONG).show(); 
       } 

     } 
    }); 

答えて

2

SQLiteDatabaseのNULLポインタ例外が発生しました。インスタンスを作成していません。

SQLiteDatabase db = this.getReadableDatabase(); 

または

SQLiteDatabase db = this.getWritableDatabase(); 

getSingleEntry()メソッドで)(db.query前に、これらのステートメントを追加します。 ?あなたはgetSinlgeEntry()を呼び出すときに、このコードは

実際

Cursor cursor=db.query(TABLE, null, " username=?", new String[]{userName}, null, null, null);

で、 "DB" を

を初期化しない

public SQLiteDatabase db;

:このコードの使用である

+0

ありがとうございました。しかし、私はユーザー名とパスワードを取得して、ユーザーがログインできるようにしようとしていますが、パスワードの代わりに電子メールを取得しています。私は自分のコードをチェックして、私にはうまく見えます。どうすれば助けてくれますか? – PersianBlue

+0

inserEntry()メソッドでは、COLUMN_PASSWORD列values.putにemailIdを挿入したことがわかります.put(COLUMN_PASSWORD、emailid); –

+0

ええ、私はそれを修正しましたが、それでも私に同じエラーを与えます – PersianBlue

1

getSinlgeEntry(String userName)の問合せでは何が必要返却されない場合があります。次のようにクエリの場合、メソッド呼び出しは次のとおりです。

query(String table, 
     String[] columns, 
     String selection, 
     String[] selectionArguments, 
     String groupBy, 
     String having, 
     String orderBy) 

だから、あなたは次のようになります。

query(TABLE, 
     new String[] {COLUMN_USERNAME, COLUMN_PASSWORD}, 
     COLUMN_USERNAME + " = ? " , 
     new String[] {userName}, 
     null, 
     null, 
     null) 

これは言う、私のテーブルからユーザー名値がユーザー名と同じであるユーザ名&パスワードを返しますあなたのメソッド呼び出しから送られたものです。もっとお手伝いが必要な場合は、このコメントを&にご連絡ください。

+0

uが言ったように私がやった中this.db == nullを。しかし、私はまだ同じエラーが発生しています – PersianBlue

0

これを意味する.db ~~

しかし、あなたのコード~~

関連する問題