爲什麼Cursor.getLong()
和Cursor.getString()
可以在模擬器上正常工作,但不是運行相同版本Android的實際設備?光標的getLong()和getString()在模擬器上工作,但不是等效設備
我對Android的Notepad tutorial版本三進行了一些補充,這些補丁涉及以編程方式更改筆記的標題。 (我最近在Obtaining the current Android view and forcing it to be redrawn上詢問過這個項目。)我的改動在我的模擬器中正常工作,但在我的測試手機上導致應用程序結束「不幸的是,程序已停止」。
這裏就是發生這種情況的方法:
public void expandNoteTitle(int i) {
Cursor note = fetchNote(i);
long rowId =
note.getLong(note.getColumnIndexOrThrow(NotesDbAdapter.KEY_ROWID));
String title =
note.getString(note.getColumnIndexOrThrow(NotesDbAdapter.KEY_TITLE)) + "W";
String body =
note.getString(note.getColumnIndexOrThrow(NotesDbAdapter.KEY_BODY));
updateNote(rowId, title, body);
}
我知道獲取光標至少部分地工作,因爲note.getColumnName(1)
在調試器工作正常。我還確認,getLong()
和getString()
的參數正確顯示。
這裏的logcat的輸出:
08-12 15:35:29.735: D/AndroidRuntime(17937): Shutting down VM
08-12 15:35:29.735: W/dalvikvm(17937): threadid=1: thread exiting with uncaught exception (group=0x40a3d1f8)
08-12 15:35:29.751: E/AndroidRuntime(17937): FATAL EXCEPTION: main
08-12 15:35:29.751: E/AndroidRuntime(17937): android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
08-12 15:35:29.751: E/AndroidRuntime(17937): at android.database.AbstractCursor.checkPosition(AbstractCursor.java:400)
08-12 15:35:29.751: E/AndroidRuntime(17937): at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
08-12 15:35:29.751: E/AndroidRuntime(17937): at android.database.AbstractWindowedCursor.getLong(AbstractWindowedCursor.java:74)
08-12 15:35:29.751: E/AndroidRuntime(17937): at notepad.NotesDbAdapter.expandNoteTitle(NotesDbAdapter.java:212)
08-12 15:35:29.751: E/AndroidRuntime(17937): at notepad.NotesDbAdapter.expandNoteTitles(NotesDbAdapter.java:201)
08-12 15:35:29.751: E/AndroidRuntime(17937): at notepad.NotepadMain.expandTitles(NotepadMain.java:167)
08-12 15:35:29.751: E/AndroidRuntime(17937): at notepad.NotepadMain.onMenuItemSelected(NotepadMain.java:115)
08-12 15:35:29.751: E/AndroidRuntime(17937): at com.android.internal.policy.impl.PhoneWindow.onMenuItemSelected(PhoneWindow.java:950)
08-12 15:35:29.751: E/AndroidRuntime(17937): at [SNIPPED FOR LENGTH]
08-12 15:35:29.751: E/AndroidRuntime(17937): at dalvik.system.NativeStart.main(Native Method)
08-12 15:36:49.993: I/Process(17937): Sending signal. PID: 17937 SIG: 9
這裏是爲fetchNote()
的代碼。除了變量名外,它與本教程中給出的版本相同。
public Cursor fetchNote(long rowId) throws SQLException {
Cursor mCursor = database.query(true, DATABASE_TABLE, new String[] {
KEY_ROWID, KEY_TITLE, KEY_BODY }, KEY_ROWID + "=" + rowId, null,
null, null, null, null);
if(mCursor != null) {
mCursor.moveToFirst();
}
return mCursor;
}
是的,有八個保存的註釋(行)。在我嘗試編輯它們之前,它們都會在應用程序加載時正常顯示。 – Pops 2012-08-12 19:57:27
'fetchNote(int i)'的代碼是什麼? – Sam 2012-08-12 19:59:02
我已將它添加到問題中。它與[Android開發人員教程](http://developer.android.com/training/notepad/notepad-ex3.html)中給出的代碼完全相同,除了已更改的變量名稱。 – Pops 2012-08-12 20:03:42