2012-05-04 9 views
3

何らかの理由で、入力したユーザー名が見つからない場合、アプリケーションがクラッシュします。しかし、ユーザー名が見つかったら、完璧に動作するようです。私は返されたカーソル== nullかどうかを調べるためのチェックをします。相続人は、コードAndroid SQLite CursorIndexOutOfBounds

public boolean isUserAuthenticated(String username, String password) { 
    // TODO Auto-generated method stub 
    boolean authenticated = false; 
    String[] columns = new String[] {LOGIN_USERNAME, LOGIN_PASSWORD}; 
    String sqlUsername = "\"" + username + "\""; 
    Cursor c = ourDatabase.query(LOGIN_TABLE, columns, LOGIN_USERNAME + "="+ sqlUsername, null, null, null, null); 
    if (c != null) { 
     c.moveToFirst(); 
     String passwordAttachedToUsername = c.getString(1); 
     if(passwordAttachedToUsername.equals(password)) { 
      authenticated = true; 
     } 
    } 

    return authenticated; 
} 

答えて

3

カーソルオブジェクトがnullではないかもしれないが、その結果セットのサイズは、の代わりに0です:

if (c != null) { 
    ... 
} 

試してみてください。

if (c.getCount() > 0) { 
    ... 
} 

また、など@muがあまりにも短いと言えば、あなたの条件にc.moveToFirst()の戻り値を使うことができます:

if (c.moveToFirst()) { 
    String passwordAttachedToUsername = c.getString(1); 
    if (passwordAttachedToUsername.equals(password)) { 
     authenticated = true; 
    } 
} 
+2

それとも、 'moveToFirst'戻り値をチェックすることができている場合にtrueを返します

if (c != null && c.moveToFirst()) { ... } 

へ/developer.android.com/reference/android/database/Cursor.html#moveToFirst%28%29 –

+0

True。それは私の解決策よりもきれいです。 – anon

0

queryコマンドは常にカーソルを返しますので、nullのテストは常に失敗します。あなたはカーソルがcursor.getCount()

+0

あなたはnullのテストが必ず成功するのではないですか? –

2

ファーストを使用して含まれているカウントを確認する必要があり、条件は次のようになります。

if (c != null && c.getCount() > 0) 

第二に、あなたはこの代わりに

String passwordAttachedToUsername = c.getString(1); 
if(passwordAttachedToUsername.equals(password)) { 
    authenticated = true; 
    } 

をリファクタリングすることができます

authenticated = password.equals(c.getString(1)); 
1

変更:

012 http:/
if (c != null) { 
    c.moveToFirst(); 
    ... 
} 

c != nullは、カーソルの大きさが0より大きい

0
if (cursor != null && cursor.getCount() > 0) { 
if (c.moveToFirst()) { 
      String passwordAttachedToUsername = c.getString(1); 
      if(passwordAttachedToUsername.equals(password)) { 
      authenticated = true; 
    }} 
        // your logic goes here 
       } else { 
        Toast.makeText(getApplicationContext(), "No Record Found", 1000).show(); 
       }