2014-06-28 61 views
-1

這裏就是我想要做的SQLiteException:沒有這樣的列

如果「Gggfggvgvvvvvvvvvvv」一個人的類型或不管它的名字是不是在數據庫中,所以我試圖返回的消息沿着用戶「用戶名不存在」的行。

這是我的問題。當用戶點擊「getDetails」按鈕時,我收到一條令人討厭的錯誤消息(下面的錯誤消息)。

這是我認爲會工作,但它不工作。由於getColumnIndex等於-1,如果列不存在我想我會比較index1到-1。如果這種比較是真的,我會向我的用戶敬酒一條消息,但我收到一條錯誤消息。

我的問題是,我將如何解決這個問題?如何讓我的語法在沒有我的應用程序崩潰的情況下爲用戶提供一條消息Toast?

public void getDetails(View view){ 
    String theName = name.getText().toString(); 
    insertHelper.checkToSeeIfUserNameExist(theName); 
} 

public void checkToSeeIfUserNameExist(String theUserName){ 
    SQLiteDatabase db = helper.getWritableDatabase(); 

    String[] selectColoumnsFromDatabase = { 
     InsertDatabaseHelper.NAME 
    }; 

    String selectionArgs= theUserName; 
    Cursor cursor = db.query(
      InsertDatabaseHelper.TABLE_NAME, 
      selectColoumnsFromDatabase, 
      selectionArgs, 
      null, null, null, null 
      ); 
    while(cursor.moveToNext()){ 
     int index1 = cursor.getColumnIndex(InsertDatabaseHelper.NAME); 

     if(index1 == -1){ 
      SQLMessage.message(helper.context, "Username Does Not Exist"); 
     } else { 
      SQLMessage.message(helper.context, "Something Else Is Happening"); 
     } 

    } 
} 


06-28 15:04:20.189: E/AndroidRuntime(2999): FATAL EXCEPTION: main 
06-28 15:04:20.189: E/AndroidRuntime(2999): java.lang.IllegalStateException: Could not execute method of the activity 
06-28 15:04:20.189: E/AndroidRuntime(2999):  at android.view.View$1.onClick(View.java:2144) 
06-28 15:04:20.189: E/AndroidRuntime(2999):  at android.view.View.performClick(View.java:2485) 
06-28 15:04:20.189: E/AndroidRuntime(2999):  at android.view.View$PerformClick.run(View.java:9081) 
06-28 15:04:20.189: E/AndroidRuntime(2999):  at android.os.Handler.handleCallback(Handler.java:587) 
06-28 15:04:20.189: E/AndroidRuntime(2999):  at android.os.Handler.dispatchMessage(Handler.java:92) 
06-28 15:04:20.189: E/AndroidRuntime(2999):  at android.os.Looper.loop(Looper.java:130) 
06-28 15:04:20.189: E/AndroidRuntime(2999):  at android.app.ActivityThread.main(ActivityThread.java:3683) 
06-28 15:04:20.189: E/AndroidRuntime(2999):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-28 15:04:20.189: E/AndroidRuntime(2999):  at java.lang.reflect.Method.invoke(Method.java:507) 
06-28 15:04:20.189: E/AndroidRuntime(2999):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:870) 
06-28 15:04:20.189: E/AndroidRuntime(2999):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:628) 
06-28 15:04:20.189: E/AndroidRuntime(2999):  at dalvik.system.NativeStart.main(Native Method) 
06-28 15:04:20.189: E/AndroidRuntime(2999): Caused by: java.lang.reflect.InvocationTargetException 
06-28 15:04:20.189: E/AndroidRuntime(2999):  at java.lang.reflect.Method.invokeNative(Native Method) 
06-28 15:04:20.189: E/AndroidRuntime(2999):  at java.lang.reflect.Method.invoke(Method.java:507) 
06-28 15:04:20.189: E/AndroidRuntime(2999):  at android.view.View$1.onClick(View.java:2139) 
06-28 15:04:20.189: E/AndroidRuntime(2999):  ... 11 more 
06-28 15:04:20.189: E/AndroidRuntime(2999): Caused by: android.database.sqlite.SQLiteException: no such column: Gggfggvgvvvvvvvvvvv: , while compiling: SELECT Name FROM SHANETABLE WHERE Gggfggvgvvvvvvvvvvv 
06-28 15:04:20.189: E/AndroidRuntime(2999):  at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method) 
06-28 15:04:20.189: E/AndroidRuntime(2999):  at android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:92) 
06-28 15:04:20.189: E/AndroidRuntime(2999):  at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:65) 
06-28 15:04:20.189: E/AndroidRuntime(2999):  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:83) 
06-28 15:04:20.189: E/AndroidRuntime(2999):  at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:49) 
06-28 15:04:20.189: E/AndroidRuntime(2999):  at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:42) 
06-28 15:04:20.189: E/AndroidRuntime(2999):  at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1356) 
06-28 15:04:20.189: E/AndroidRuntime(2999):  at android.database.sqlite.SQLiteDatabase.queryWithFactory(SQLiteDatabase.java:1235) 
06-28 15:04:20.189: E/AndroidRuntime(2999):  at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1189) 
06-28 15:04:20.189: E/AndroidRuntime(2999):  at android.database.sqlite.SQLiteDatabase.query(SQLiteDatabase.java:1271) 
06-28 15:04:20.189: E/AndroidRuntime(2999):  at com.example.multapps.InsertDatabaseAdapter.checkToSeeIfUserNameExist(InsertDatabaseAdapter.java:152) 
06-28 15:04:20.189: E/AndroidRuntime(2999):  at com.example.multapps.InsertIntoDatabase.getDetails(InsertIntoDatabase.java:61) 
06-28 15:04:20.189: E/AndroidRuntime(2999):  ... 14 more 

回答

1

正確獲取光標:

Cursor cursor = db.query(InsertDatabaseHelper.TABLE_NAME,     // table 
         new String[] { InsertDatabaseHelper.NAME },  // columns 
         InsertDatabaseHelper.NAME + " = ? ",    // selection 
         new String[] { theUserName },      // selectionArgs 
         null, null, null);        // unused 

你不檢查你回到正確的只調用moveToNext()光標。 如果沒有匹配的行被返回,它將返回false,所以你的代碼不會運行。 正在檢查什麼在光標通過更好地完成:

try { 
    if (null != cursor && cursor.moveToFirst()) { //moveToFirst returns false if cursor is empty! 
     Toast.makeText(YourActivity.this, "Username exists!", Toast.LENGTH_LONG).show(); 
    } else { 
     Toast.makeText(YourActivity.this, "Username doesn't exist!",Toast.LENGTH_LONG).show(); 
    } 
} finally { // ensures that your cursor is closed no matter what! 
    if (null != cursor) { 
     cursor.close(); 
    } 
} 

你也可以查看有多少行通過cursor.getCount()

+0

謝謝,我的SQL語句不起作用。那是罪魁禍首。我感謝您的幫助 –

0

對於給定的用戶名,通常不會有列。通常你有一個名爲「用戶名」的列,每列都有一個值。您的架構真的很奇怪,或者您將列自己與列中的值混淆在一起。

1

這是你的錯誤:

while compiling: SELECT Name FROM SHANETABLE WHERE Gggfggvgvvvvvvvvvvv 

您的查詢應該是這個樣子:

SELECT Name FROM SHANETABLE WHERE Name = 'Gggfggvgvvvvvvvvvvv' 

然後,如果遊標有0行,這個名字並不在表中。

+1

由於是在光標,我的SQL語句不能正常工作。那是罪魁禍首。感謝您的幫助 –

相關問題