2012-03-13 82 views
1

我試圖從光標得到結果並將它們放入我創建的對象中。在Eclipse中,它看起來光標正在返回一行(這是我想要的),但是當我嘗試訪問它時,出現錯誤。下面就來取單行代碼:Android - 光標未找到列

public Object fetchIssue(long IssueNumber, int type){ 

    //Get query cursor. 
    Cursor cursor = mDB.query(true, ISSUES_TABLE, ISSUES_COLUMN_ARRAY, COL_ISSUE_ID + "=" + IssueNumber, null, null, null, null, null); 

    int iCount = cursor.getCount(); 

    if(cursor == null) 
     return null; 

    Object objOut = null; 

    if(type == QUERY_TYPE_STRING_ARRAY){ 
     //Create Array to hold Issue Information. 
     String[] IssueInfo = new String[3]; 
     IssueInfo[0] = String.valueOf(IssueNumber); 
     IssueInfo[1] = cursor.getString(cursor.getColumnIndexOrThrow(COL_DATE_RECEIVED)); 
     IssueInfo[2] = cursor.getString(cursor.getColumnIndexOrThrow(COL_ISSUE_SUMMARY)); 
     IssueInfo[3] = cursor.getString(cursor.getColumnIndexOrThrow(COL_ISSUE_STATUS)); 
     IssueInfo[4] = cursor.getString(cursor.getColumnIndexOrThrow(COL_ISSUE_SUB_STATUS)); 
     IssueInfo[5] = cursor.getString(cursor.getColumnIndexOrThrow(COL_ISSUE_DESCRIPTION)); 
     objOut = IssueInfo; 
    } 
    else{ 
     //Create IssueInfo object. 
     IssueInfo IssueInfo = new IssueInfo(
        IssueNumber, "12/12/2000", 
        //cursor.getString(cursor.getColumnIndexOrThrow(COL_DATE_RECEIVED)), 
        cursor.getString(cursor.getColumnIndexOrThrow(COL_ISSUE_SUMMARY)), 
        cursor.getString(cursor.getColumnIndexOrThrow(COL_ISSUE_STATUS)), 
        cursor.getString(cursor.getColumnIndexOrThrow(COL_ISSUE_SUB_STATUS)), 
        cursor.getString(cursor.getColumnIndexOrThrow(COL_ISSUE_DESCRIPTION))); 
     objOut = IssueInfo; 
    } 

    //Close cursor. 
    cursor.close(); 

    //Return IssueInfo. 
    return objOut; 
} 

ICOUNT返回1,如果我把遊標變量在「變量」窗口中,我可以看到所有的列: Cursor variable

,並在頂部之類的,表列變量設置爲同一個名字:

public static final String ISSUES_TABLE = "Issues"; 
public static final String COL_ISSUE_ID = "_id"; 
public static final String COL_DATE_RECEIVED = "DateReceived"; 
public static final String COL_ISSUE_STATUS = "IssueStatus"; 
public static final String COL_ISSUE_SUB_STATUS = "IssueSubStatus"; 
public static final String COL_ISSUE_SUMMARY = "IssueSummary"; 
public static final String COL_ISSUE_DESCRIPTION = "IssueDescription"; 

private static final String[] ISSUES_COLUMN_ARRAY = new String[]{ 
    COL_ISSUE_ID, COL_DATE_RECEIVED, COL_ISSUE_SUMMARY, 
    COL_ISSUE_STATUS, COL_ISSUE_SUB_STATUS, COL_ISSUE_DESCRIPTION}; 

的錯誤是在這條線存在的:

//Create IssueInfo object. 
     IssueInfo IssueInfo = new IssueInfo(
        IssueNumber, "12/12/2000", 
        //cursor.getString(cursor.getColumnIndexOrThrow(COL_DATE_RECEIVED)), 
        cursor.getString(cursor.getColumnIndexOrThrow(COL_ISSUE_SUMMARY)), 
        cursor.getString(cursor.getColumnIndexOrThrow(COL_ISSUE_STATUS)), 
        cursor.getString(cursor.getColumnIndexOrThrow(COL_ISSUE_SUB_STATUS)), 
        cursor.getString(cursor.getColumnIndexOrThrow(COL_ISSUE_DESCRIPTION))); 

或任何這些行(正如你所看到的,我評論了接收日期並在其中放置了一個正常的字符串值)。

這裏的錯誤:

03-13 09:06:42.370: E/AndroidRuntime(2324): FATAL EXCEPTION: AsyncTask #2 
    03-13 09:06:42.370: E/AndroidRuntime(2324): java.lang.RuntimeException: An error occured while executing doInBackground() 
    03-13 09:06:42.370: E/AndroidRuntime(2324):  at android.os.AsyncTask$3.done(AsyncTask.java:278) 
    03-13 09:06:42.370: E/AndroidRuntime(2324):  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273) 
    03-13 09:06:42.370: E/AndroidRuntime(2324):  at java.util.concurrent.FutureTask.setException(FutureTask.java:124) 
    03-13 09:06:42.370: E/AndroidRuntime(2324):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307) 
    03-13 09:06:42.370: E/AndroidRuntime(2324):  at java.util.concurrent.FutureTask.run(FutureTask.java:137) 
    03-13 09:06:42.370: E/AndroidRuntime(2324):  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076) 
    03-13 09:06:42.370: E/AndroidRuntime(2324):  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569) 
    03-13 09:06:42.370: E/AndroidRuntime(2324):  at java.lang.Thread.run(Thread.java:856) 
    03-13 09:06:42.370: E/AndroidRuntime(2324): Caused by: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1 
    03-13 09:06:42.370: E/AndroidRuntime(2324):  at android.database.AbstractCursor.checkPosition(AbstractCursor.java:400) 
    03-13 09:06:42.370: E/AndroidRuntime(2324):  at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136) 
    03-13 09:06:42.370: E/AndroidRuntime(2324):  at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50) 
    03-13 09:06:42.370: E/AndroidRuntime(2324):  at com.adacel.dashboard.DBAdapter.fetchIssue(DBAdapter.java:215) 
    03-13 09:06:42.370: E/AndroidRuntime(2324):  at com.adacel.dashboard.IssueInfoCreator.fetchIssue(IssueInfoCreator.java:42) 
    03-13 09:06:42.370: E/AndroidRuntime(2324):  at com.adacel.dashboard.ViewIssue.LoadIssueDetails(ViewIssue.java:73) 
    03-13 09:06:42.370: E/AndroidRuntime(2324):  at com.adacel.dashboard.ViewIssue.access$0(ViewIssue.java:70) 
    03-13 09:06:42.370: E/AndroidRuntime(2324):  at com.adacel.dashboard.ViewIssue$GetIssueDetailsTask.doInBackground(ViewIssue.java:96) 
    03-13 09:06:42.370: E/AndroidRuntime(2324):  at com.adacel.dashboard.ViewIssue$GetIssueDetailsTask.doInBackground(ViewIssue.java:1) 
    03-13 09:06:42.370: E/AndroidRuntime(2324):  at android.os.AsyncTask$2.call(AsyncTask.java:264) 
    03-13 09:06:42.370: E/AndroidRuntime(2324):  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305) 
    03-13 09:06:42.370: E/AndroidRuntime(2324):  ... 4 more 

任何幫助,不勝感激!

+0

我通常做一個cursor.moveToFirst( )在嘗試訪問列數據之前,也許試試這個?確保它返回bool true – CSmith 2012-03-13 13:23:32

回答

0

光標總是移動到一個元素,查詢後:

if(cursor == null) 
    return null; 
if(!cursor.moveToFirst()) //this will move the cursor to the first element 
    return null; 

,如果你希望多行更好的方式來做到這一點是:

if(cursor != null) { 
    cursor.move(-1); 
    while(cursor.moveToNext()) { 
     //do stuff 
    } 
} 
+0

這是有效的!感謝一堆......一直在考慮這一點,因爲它必須是簡單的。再次感謝。 – Robert 2012-03-13 13:43:31

0

嘗試修改IssueInfo的大小:

String[] IssueInfo = new String[3]; 

​​

而且改變對象的名稱IssueInfo到其他類似issue_info

+0

錯誤來自語句的ELSE部分,而不是使用String數組的第一部分。我不認爲這會影響任何事情。 – Robert 2012-03-13 13:19:34

+0

好吧,我不讀這個。但錯誤是在cursor.moveToFirst()(因爲他們已經回答) – thenosic 2012-03-13 13:28:35

3

你必須移動光標的第一指數第一:

cursor.moveToFirst();