2016-08-08 41 views
0

我想構建一個使用SQL數據庫保存用戶輸入(標題,任務,日期,時間)的Android待辦事項列表應用程序。在項目中我使用了2個活動(MainActivity,Dialog),我正在使用的代碼使用onClick(Add_task)保存用戶輸入,但是當我使用多個遊標來更新listview UI時,它會提供以下錯誤。Android:確保光標在從中訪問數據前正確初始化

logcat的

08-08 13:42:15.540 6051-6051/com.naive.LISTY E/AndroidRuntime: FATAL EXCEPTION: main 
                  Process: com.naive.LISTY, PID: 6051 
                  java.lang.IllegalStateException: Could not execute method for android:onClick 
                   at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:289) 
                   at android.view.View.performClick(View.java:5198) 
                   at android.view.View$PerformClick.run(View.java:21147) 
                   at android.os.Handler.handleCallback(Handler.java:739) 
                   at android.os.Handler.dispatchMessage(Handler.java:95) 
                   at android.os.Looper.loop(Looper.java:148) 
                   at android.app.ActivityThread.main(ActivityThread.java:5417) 
                   at java.lang.reflect.Method.invoke(Native Method) 
                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
                  Caused by: java.lang.reflect.InvocationTargetException 
                   at java.lang.reflect.Method.invoke(Native Method) 
                   at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:284) 
                   at android.view.View.performClick(View.java:5198)  
                   at android.view.View$PerformClick.run(View.java:21147)  
                   at android.os.Handler.handleCallback(Handler.java:739)  
                   at android.os.Handler.dispatchMessage(Handler.java:95)  
                   at android.os.Looper.loop(Looper.java:148)  
                   at android.app.ActivityThread.main(ActivityThread.java:5417)  
                   at java.lang.reflect.Method.invoke(Native Method)  
                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)  
                  Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow. Make sure the Cursor is initialized correctly before accessing data from it. 
                   at android.database.CursorWindow.nativeGetString(Native Method) 
                   at android.database.CursorWindow.getString(CursorWindow.java:438) 
                   at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51) 
                   at listy.naive.com.listy.MainActivity.updateUI(MainActivity.java:102) 
                   at listy.naive.com.listy.Dialog.Add_task(Dialog.java:58) 
                   at java.lang.reflect.Method.invoke(Native Method)  
                   at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:284)  
                   at android.view.View.performClick(View.java:5198)  
                   at android.view.View$PerformClick.run(View.java:21147)  
                   at android.os.Handler.handleCallback(Handler.java:739)  
                   at android.os.Handler.dispatchMessage(Handler.java:95)  
                   at android.os.Looper.loop(Looper.java:148)  
                   at android.app.ActivityThread.main(ActivityThread.java:5417)  
                   at java.lang.reflect.Method.invoke(Native Method)  
                   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)  
                   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

updateUI

更新UI

public void updateUI() { 
    ArrayList<String> taskList = new ArrayList<>(); 
    SQLiteDatabase db = mHelper.getReadableDatabase(); 

    Cursor title_cursor = db.query(TaskContract.TaskEntry.TABLE,        // Cursor Title 
      new String[]{TaskContract.TaskEntry._ID, TaskContract.TaskEntry.COL_TASK_TITLE}, 
      null, null, null, null, null); 

    Cursor time_cursor = db.query(TaskContract.TaskEntry.TABLE,        // Cursor Title 
      new String[]{TaskContract.TaskEntry._ID, TaskContract.TaskEntry.COL_TASK_TIME}, 
      null, null, null, null, null); 

    while (title_cursor.moveToNext()) { 
     int idx = title_cursor.getColumnIndex(TaskContract.TaskEntry.COL_TASK_TITLE); 
     taskList.add(title_cursor.getString(idx)); 
    } 

    if (mAdapter == null) { 
     mAdapter = new ArrayAdapter<>(this, 
       R.layout.item_todo, 
       R.id.task_title, 
       taskList); 
     mTaskListView.setAdapter(mAdapter); 
    } else { 
     mAdapter.clear(); 
     mAdapter.addAll(taskList); 
     mAdapter.notifyDataSetChanged(); 
    } 


    while (time_cursor.moveToNext()) { 
     int idx = time_cursor.getColumnIndex(TaskContract.TaskEntry.COL_TASK_TITLE); 
     taskList.add(time_cursor.getString(idx)); 
    } 

    if (mAdapter == null) { 
     mAdapter = new ArrayAdapter<>(this, 
       R.layout.item_todo, 
       R.id.task_time, 
       taskList); 
     mTaskListView.setAdapter(mAdapter); 
    } else { 
     mAdapter.clear(); 
     mAdapter.addAll(taskList); 
     mAdapter.notifyDataSetChanged(); 
    } 

    time_cursor.close(); 
    title_cursor.close(); 
    db.close(); 
} 

回答

0

嘗試訪問它之前移動光標到第一行:

Cursor time_cursor = db.query(TaskContract.TaskEntry.TABLE,        // Cursor Title 
     new String[]{TaskContract.TaskEntry._ID, TaskContract.TaskEntry.COL_TASK_TIME}, 
     null, null, null, null, null); 
    if(time_cursor != null){ 
     time_cursor.moveToFirst(); // this is part of cursor initialization 

     while (title_cursor.moveToNext()) { 
     int idx = title_cursor.getColumnIndex(TaskContract.TaskEntry.COL_TASK_TITLE); 
     taskList.add(title_cursor.getString(idx)); 
     } 
    } 
+0

這幫助我停止崩潰的問題,但我仍然無法更新用戶界面。任何猜測應該做什麼?使用此代碼的 –

+0

停止UI更新 –

相關問題