2011-12-31 46 views
0

我嘗試恢復放入SQLite數據庫的信息時遇到問題。我收到了一條成功的消息,但是當我開始我的活動時,它會導致數據崩潰。SQLite中字段插槽的錯誤請求

logcat的

12-30 22:14:13.005: D/dalvikvm(275): GC_EXTERNAL_ALLOC freed 734 objects/54696 bytes in 92ms 
12-30 22:19:00.275: W/KeyCharacterMap(275): No keyboard for id 0 
12-30 22:19:00.275: W/KeyCharacterMap(275): Using default keymap: /system/usr/keychars/qwerty.kcm.bin 
12-30 22:19:11.185: D/dalvikvm(275): GC_FOR_MALLOC freed 7425 objects/301256 bytes in 70ms 
12-30 22:19:11.257: E/CursorWindow(275): Bad request for field slot 0,-1. numRows = 8, numColumns = 4 
12-30 22:19:11.265: D/AndroidRuntime(275): Shutting down VM 
12-30 22:19:11.265: W/dalvikvm(275): threadid=1: thread exiting with uncaught exception (group=0x4001d800) 
12-30 22:19:11.285: E/AndroidRuntime(275): FATAL EXCEPTION: main 
12-30 22:19:11.285: E/AndroidRuntime(275): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.walkarc.babytracker/com.walkarc.babytracker.BathReport}: java.lang.IllegalStateException: get field slot from row 0 col -1 failed 
12-30 22:19:11.285: E/AndroidRuntime(275): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663) 
12-30 22:19:11.285: E/AndroidRuntime(275): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
12-30 22:19:11.285: E/AndroidRuntime(275): at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
12-30 22:19:11.285: E/AndroidRuntime(275): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
12-30 22:19:11.285: E/AndroidRuntime(275): at android.os.Handler.dispatchMessage(Handler.java:99) 
12-30 22:19:11.285: E/AndroidRuntime(275): at android.os.Looper.loop(Looper.java:123) 
12-30 22:19:11.285: E/AndroidRuntime(275): at android.app.ActivityThread.main(ActivityThread.java:4627) 
12-30 22:19:11.285: E/AndroidRuntime(275): at java.lang.reflect.Method.invokeNative(Native Method) 
12-30 22:19:11.285: E/AndroidRuntime(275): at java.lang.reflect.Method.invoke(Method.java:521) 
12-30 22:19:11.285: E/AndroidRuntime(275): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
12-30 22:19:11.285: E/AndroidRuntime(275): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
12-30 22:19:11.285: E/AndroidRuntime(275): at dalvik.system.NativeStart.main(Native Method) 
12-30 22:19:11.285: E/AndroidRuntime(275): Caused by: java.lang.IllegalStateException: get field slot from row 0 col -1 failed 
12-30 22:19:11.285: E/AndroidRuntime(275): at android.database.CursorWindow.getString_native(Native Method) 
12-30 22:19:11.285: E/AndroidRuntime(275): at android.database.CursorWindow.getString(CursorWindow.java:329) 
12-30 22:19:11.285: E/AndroidRuntime(275): at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:49) 
12-30 22:19:11.285: E/AndroidRuntime(275): at com.walkarc.babytracker.MyDBAdapter.getData(MyDBAdapter.java:91) 
12-30 22:19:11.285: E/AndroidRuntime(275): at com.walkarc.babytracker.BathReport.onCreate(BathReport.java:17) 
12-30 22:19:11.285: E/AndroidRuntime(275): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
12-30 22:19:11.285: E/AndroidRuntime(275): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 

我進入代碼

public long createEntry(String date, String time, String hairWash, 
      String comment) { 
     // TODO Auto-generated method stub 
     ContentValues cv = new ContentValues(); 
     cv.put(KEY_BATHDATE, date); 
     cv.put(KEY_BATHTIME, time); 
     cv.put(KEY_HAIRWASH, hairWash); 
     cv.put(KEY_COMMENTS, comment); 
     return ourDatabase.insert(DATABASE_TABLE, null, cv); 
    } 

我的分貝的活動來看XML retrive

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" > 

    <TableLayout 
     android:id="@+id/tableLayout1" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 

     <TableRow > 

      <TextView 
       android:id="@+id/textView1" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:layout_weight="1" 
       android:text="Date" /> 

      <TextView 
       android:id="@+id/textView2" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:layout_weight="1" 
       android:text="Time" /> 

      <TextView 
       android:id="@+id/textView3" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:layout_weight="1" 
       android:text="Hair Wash?" /> 

      <TextView 
       android:id="@+id/textView4" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:layout_weight="1" 
       android:text="Comments" /> 
" 

     </TableRow> 

     <TextView 
      android:id="@+id/textView3" 
      android:layout_width="fill_parent" 
      android:layout_height="fill_parent" 
      android:text="get info from db" /> 
    </TableLayout> 

</LinearLayout> 

的Java它

public class BathReport extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.bathreport); 
     TextView tv = (TextView) findViewById(R.id.textView3); 
     MyDBAdapter info = new MyDBAdapter(this); 
     info.open(); 
     String data = info.getData(); 
     info.close(); 
     tv.setText(data); 
    } 


public String getData() { 
     String[] columns = new String[] { KEY_BATHDATE, KEY_BATHTIME, 
       KEY_HAIRWASH, KEY_COMMENTS }; 
     Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, 
       null, null); 
     String result = ""; 
     int iRow = c.getColumnIndex(KEY_ROWID); 
     int iDate = c.getColumnIndex(KEY_BATHDATE); 
     int iTime = c.getColumnIndex(KEY_BATHTIME); 
     int iHair = c.getColumnIndex(KEY_HAIRWASH); 
     int iCom = c.getColumnIndex(KEY_COMMENTS); 

     for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) { 
      result = result + c.getString(iRow) + " " + c.getString(iDate) 
        + " " + c.getString(iTime) + " " + c.getString(iHair) + " " 
        + c.getString(iCom) + "\n"; 
     } 

     return result; 
    } 

任何人都知道爲什麼這是錯誤的?

+0

什麼是你的幫助代碼獲取數據? – 2011-12-31 06:02:13

+0

將其添加到原始帖子。謝謝! – Intelwalk 2011-12-31 06:28:54

回答

1

OK,儘量

public String getData() { 
    String[] columns = new String[] { KEY_BATHDATE, KEY_BATHTIME, 
      KEY_HAIRWASH, KEY_COMMENTS }; 
    Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null, 
      null, null); 
    if (c != null && c.moveToFirst()) { 
    int iRow = c.getString(0); 
    int iDate = c.getString(1); 
    int iTime = c.getString(2); 
    int iHair = c.getString(3); 
    int iCom = c.getString(4); 

    String[] rData = { iRow, iDate, iTime, iHair, iCom }; 

    return rData; 

    } 

    return null; 
} 

編輯

String[] columns = new String[] { KEY_BATHDATE, KEY_BATHTIME, 
      KEY_HAIRWASH, KEY_COMMENTS }; 

是4分的結果,但

int iRow = c.getColumnIndex(KEY_ROWID); 
    int iDate = c.getColumnIndex(KEY_BATHDATE); 
    int iTime = c.getColumnIndex(KEY_BATHTIME); 
    int iHair = c.getColumnIndex(KEY_HAIRWASH); 
    int iCom = c.getColumnIndex(KEY_COMMENTS); 

正在尋找5個結果。添加你的_id列

String[] columns = new String[] { KEY_ROWID, KEY_BATHDATE, KEY_BATHTIME, 
      KEY_HAIRWASH, KEY_COMMENTS }; 
+0

rData做什麼?它沒有分配給它。你可以解釋嗎?謝謝 – Intelwalk 2011-12-31 06:41:37

+0

String [] rData = {iRow,iDate,Itime,iHair,iCom};它獲取5列並將它們放入一個字符串數組中。大聲笑,忘了更改變量名稱 – 2011-12-31 06:44:54

+0

@BillGary將工作? int iRow = c.getString(0);然後你正在製作一個String [] int值。 – 2011-12-31 06:55:28