2012-09-04 79 views
1

我想要做的就是設置一個字符串等於我的數據庫中的一個條目。我訪問的表格有1列(除了ID列)。我一直在努力爭取一段時間,即使有人問過類似的問題,但我無法使這種情況發揮作用。我很喜歡SQLite中的其他一些命令,但仍然是初學者。這是我的。我敢肯定,一旦這種方法工作,我從另一個類的電話將正常工作。rawQuery不工作在SQLite android

請注意,StringCategory_Table和COLUMN_CATEGORIES都被定義爲字符串。

我的數據庫是用下面的(它工作得很好,除了下面的方法一切)創建:

db.execSQL("CREATE TABLE " + StringCategory_Table + " (" + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_CATEGORIES + " TEXT NOT NULL);"); 

,這裏是(使用SQLite開放助手在一個數據庫類創建)問題的方法:

public String getCategory(int catId){ 
Cursor mycursor = myDatabase.rawQuery("SELECT " + COLUMN_CATEGORIES + " FROM "+ StringCategory_Table +" WHERE " + _ID + " = " + catId, null); 

//i no longer use this line:String strCatName = mycursor.toString(); 


String strCatName = mycursor.getString(mycursor.getColumnIndex(COLUMN_CATEGORIES)); 

     return strCatName; 
    } 

這裏是我上面的代碼的logcat:

09-04 20:05:47.764: E/AndroidRuntime(9232): FATAL EXCEPTION: main 
09-04 20:05:47.764: E/AndroidRuntime(9232): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.mypackage.namespace/com.mypackage.namespace.MyCurrentRestaurants}: java.lang.NullPointerException 
09-04 20:05:47.764: E/AndroidRuntime(9232):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1880) 
09-04 20:05:47.764: E/AndroidRuntime(9232):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1981) 
09-04 20:05:47.764: E/AndroidRuntime(9232):  at android.app.ActivityThread.access$600(ActivityThread.java:123) 
09-04 20:05:47.764: E/AndroidRuntime(9232):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1147) 
09-04 20:05:47.764: E/AndroidRuntime(9232):  at android.os.Handler.dispatchMessage(Handler.java:99) 
09-04 20:05:47.764: E/AndroidRuntime(9232):  at android.os.Looper.loop(Looper.java:137) 
09-04 20:05:47.764: E/AndroidRuntime(9232):  at android.app.ActivityThread.main(ActivityThread.java:4424) 
09-04 20:05:47.764: E/AndroidRuntime(9232):  at java.lang.reflect.Method.invokeNative(Native Method) 
09-04 20:05:47.764: E/AndroidRuntime(9232):  at java.lang.reflect.Method.invoke(Method.java:511) 
09-04 20:05:47.764: E/AndroidRuntime(9232):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
09-04 20:05:47.764: E/AndroidRuntime(9232):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 

而不是刪除這個問題,我將解釋什麼的問題是(因爲這將是煩人通過評論挖):

  1. 我不能只分配一個類字符串到一個SQLite條目我在做。相反,我必須先打開數據庫,然後才能讀取數據庫:由於我需要在讀取數據庫之前打開數據庫,因此需要創建SQLite數據庫類的實例。
  2. 因爲我使用的是遊標,所以在任何事情都能正常工作之前,我需要使用moveToFirst方法。

感謝今天幫助過我的每一個人,請讓我知道這些結論是否是不正確的,因爲我不想將誤解傳播給像我一樣困惑的人。 亞當

+0

有什麼具體的理由,將光標對象轉換爲字符串? 註釋行必須已經工作。 –

+0

我使用一個字符串變量來膨脹成我已經構建的一些視圖。我認爲如果我不這樣做,我必須改變我已經制作的許多代碼。是否不可能將此對象轉換爲字符串? –

回答

1

試試這個,

public String getCategory(int catId){ 
     Cursor mycursor = myDatabase.rawQuery("SELECT " + COLUMN_CATEGORIES + " FROM "+ StringCategory_Table +" WHERE " + _ID + " = " + catId, null); 
     if(mycursor.moveToFirst()){ //Edited based on suggestion from SAM 
      String strCatName = mycursor.getString(mycursor.getColumnIndex(COLUMN_CATEGORIES)); 
        return strCatName; 
     } else { 
     return null; 
     } 


     } 
+1

'rawQuery()'將總是返回一個Cursor,所以'mycursor'不會是'null'。然而'mycursor'可能是_empty_,你應該在嘗試訪問Cursor中的任何「get」方法之前使用'moveToFirst()','moveToNext()','getCount()'等來檢查。 – Sam

+0

是的你是對的。感謝您指出了這一點。我將編輯答案。 – VendettaDroid

+0

這仍然是工作。我注意到一個空指針異常(即時調試很新)。任何關於我如何找到究竟發生了什麼的建議?數據庫完全創建,它只是這種方法,不會在添加一些斷點後工作 –

0

看起來像你的SELECT語句可能是錯的。您應該傳遞列名稱字符串而不是「COLUMN_CATEGORIES」,它看起來像一個整數。之後,你應該使用註釋的方式來訪問字符串。

+0

我把COLUMN_CATEGORIES定義爲類中較早的一個字符串;抱歉沒有把這個問題(現在生病了)。感謝有關注釋掉的信息。 –

1

看起來你只是忘了將光標移動到第一個結果。試試這個:

public String getCategory(int catId){ 
    Cursor mycursor = myDatabase.rawQuery("SELECT " + COLUMN_CATEGORIES + " FROM " + StringCategory_Table +" WHERE " + _ID + " = " + catId, null); 

    // Check if the row exists, return it if it does 
    if(mycursor.moveToFirst()) 
     return mycursor.getString(mycursor.getColumnIndex(COLUMN_CATEGORIES)); 

    // No rows match id 
    return ""; 
} 
+0

所以它仍然崩潰。任何想法爲什麼會發生這種情況?如果我沒有調用這個方法是行得通的。如果我調用這個方法甚至在應用程序的任何地方定義任何字符串,它將會崩潰。 –

+0

嗯,將logcat錯誤剪切並粘貼到您的問題中,以便我可以看到發生了什麼。 – Sam

+0

我發佈了它們。在添加了一些斷點後,我得到「未找到源」。如果我在此行後面打破這行代碼: 遊標mycursor = myDatabase.rawQuery(「SELECT」+ COLUMN_CATEGORIES +「FROM」+ StringCategory_Table +「WHERE」+ _ID +「=」+ catId,null); –