我試圖從光標得到結果並將它們放入我創建的對象中。在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,如果我把遊標變量在「變量」窗口中,我可以看到所有的列:
,並在頂部之類的,表列變量設置爲同一個名字:
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
任何幫助,不勝感激!
我通常做一個cursor.moveToFirst( )在嘗試訪問列數據之前,也許試試這個?確保它返回bool true – CSmith 2012-03-13 13:23:32