2012-03-13 44 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();