2017-05-18 8 views
0

私はログイン/レジスタ機能を組み込んだアプリケーションを作っています。私は解決しようとしている問題を作り出しています。データベース値を取得して文字列値に割り当てる

ユーザーがログインしてログインに成功した場合、ログインした電子メールを使用して、インテントを使用して次のアクティビティに渡したいと思います(実際にはそのメールをDbhelperの関数に渡して、そのメールを使ってサインインした人の名前を探し、現在のアクティビティに「ようこそ(名前)」と表示します関数でnullが返され、最終的にアプリがクラッシュすることにつながります。

ここでは、名前を表示したいアクティビティの関数を呼び出しています。

if(!session.loggedIn()) 
     { 
      Logout(); 
     } 
     else 
     { 
      Intent in = getIntent(); 
      String email = in.getStringExtra("email"); 
      Name.setText("Welcome " + db.findName(email)); 
     } 

これは私のDbHelper.javaの中の、私がクエリなどで名前を探している機能です。

public String findName(String user_email) 
{ 
    String query = "SELECT " + COLUMN_NAME + " FROM " + USER_TABLE + " WHERE " + COLUMN_EMAIL + " = " + "'" + user_email + "'"; 
    SQLiteDatabase db = this.getWritableDatabase(); 

    //reads for database 
    Cursor c = db.rawQuery(query, null); 
    c.moveToFirst(); 
    if(c.getCount() > 0) // if cursor is not empty 
    { 
     String n = c.getString(0); 
     return n; 
    } 
    else 
    { 
     return null; 
    } 

} 

ご覧のとおり、nullが返されます。はい、既にデータベースにエントリがあります。また、関数に電子メールを渡して渡されたものを返そうとしましたが、それでもエラーが出ました。

答えて

0

通常、テキスト列の値をチェックするには、=という符号を使用せず、むしろWHERE Column LIKE '%text%'という符号を使用します。また、データベースに保存するときには、文字列をエスケープして "サニタイズ"する必要があります。あなたがこれをした場合、それらを探しているときにも同じプロセスをやっていなければなりません。そうでなければ、あなたはそれらを見つけられません。

これは、テーブルにエントリがあることが確かであっても、クエリの結果が空である可能性があるためです。 c.getCount()コールなどの結果を出力するだけでデバッグできます。

+0

私はc.getCount()の結果を出力してデバッグを試みましたが、それでもnullを返します。すべてがnullを返しています。私は、私が通過した機能から戻ってきました。 ' public string findName(String user_email) { 文字列クエリ=" SELECT "+ COLUMN_NAME +" FROM "+ USER_TABLE +" WHERE "+ COLUMN_EMAIL +" LIKE "+"% "+ user_email +"% '; " ; SQLiteDatabase db = this.getWritableDatabase(); //データベースを読み取る カーソルc = db.rawQuery(query、null); return user_email; ' それでも私にヌルとクラッシュが与えられました 文字列を消毒するとはどういう意味ですか? – dennis

関連する問題