2011-09-07 3 views
1

내 활동에 맞춤 목록보기를 사용하고 값을 채우려합니다. 하지만, 여기 android.database.staledataexception : 닫힌 커서에 액세스

코드입니다 .... 내가 왜 undersdtand 그나마이 "staledataexception을"점점 오전 오류가 당신이 보인다 "여기에 오류"

protected void onCreate(Bundle savedInstanceState) { 
     // TODO Auto-generated method stub 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.upadtemailservr); 

     headText = (TextView)findViewById(R.id.TextView01); 
     prefsPrivate = getSharedPreferences(PREFS_PRIVATE,Context.MODE_PRIVATE); 
     Heading = prefsPrivate.getString(KEY_PRIVATE, "the string not found"); 
     headText.setText("Update Mail Server - "+Heading); 

     AddNew = (Button)findViewById(R.id.Button01); 
     AddNew.setOnClickListener(this); 


     m_orders = new ArrayList<Order>(); 

     //the first tried one... this was not working... so i tried the one writtten next to it. 
     /* 
     m_orders = new ArrayList<Order>(); 
     this.m_adapter = new OrderAdapter(this, R.layout.row, m_orders); 
     this.setListAdapter(this.m_adapter); 
      */  

     //new list adapter 

     MainList = (ListView)findViewById(R.id.mainlist1); 


      viewOrders = new Runnable() 
      { 

      @Override 
      public void run() { 
       // TODO Auto-generated method stub 
       getOrders(); 
      } 
      }; 
      Thread thread = new Thread(null, viewOrders, "MagentoBackground"); 
       thread.start(); 
       m_ProgressDialog = ProgressDialog.show(UpdateMailServr.this,  
         "Please wait...", "Retrieving data ...", true); 

       m_adapter = new OrderAdapter(this,R.layout.row,m_orders); 
       MainList.setAdapter(m_adapter); 
       MainList.setOnItemClickListener(this); 

    } 

    private Runnable returnRes = new Runnable(){ 

     @Override 
      public void run() { 
       if(m_orders != null && m_orders.size() > 0){ 
        m_adapter.notifyDataSetChanged(); 
        for(int i=0;i<m_orders.size();i++) 
        m_adapter.add(m_orders.get(i)); 
       } 
       m_ProgressDialog.dismiss(); 
       m_adapter.notifyDataSetChanged(); 
      } 
    }; 



      public void getOrders() { 
       m_orders = new ArrayList<Order>(); 

       adapter1 = new DBAdaptertrial2(this); 
      adapter1.open(); 
      Cursor cur1 = adapter1.fetchAllMeetings(); 

      cur1.moveToFirst(); 
      for(int i=0;i<cur1.getCount();i++) 
      { 
         //******Error here************** 
       if(Heading.equalsIgnoreCase(cur1.getString(1))) 
       { 
        try 
        { 
         if(!cur1.getString(5).equals("")) 
         { 
          Order o1 = new Order(); 
          o1.setMailserver(cur1.getString(5)); 
          o1.setPriority(cur1.getInt(8)); 
          o1.setIpaddr(cur1.getString(2)); 
          m_orders.add(o1); 
         } 
         if(!cur1.getString(6).equals("")) 
         { 
          Order o2 = new Order(); 
          o2.setMailserver(cur1.getString(6)); 
          o2.setPriority(cur1.getInt(8)); 
          o2.setIpaddr(cur1.getString(2)); 
          m_orders.add(o2); 
         } 
         if(!cur1.getString(7).equals("")) 
         { 
          Order o3 = new Order(); 
          o3.setMailserver(cur1.getString(6)); 
          o3.setPriority(cur1.getInt(8)); 
          o3.setIpaddr(cur1.getString(2)); 
          m_orders.add(o3); 
         } 
         Thread.sleep(3000); 
         Log.i("ARRAY", ""+ m_orders.size()); 

        } 
        catch (Exception e) { 
         Log.e("BACKGROUND_PROC", e.getMessage()); 
        } 
        runOnUiThread(returnRes); 

       } 
       else 
       { 
        cur1.moveToNext(); 
       } 
       cur1.close(); 
      adapter1.close(); 


      } 

    }  

      @Override 
     protected void onResume() { 
      // TODO Auto-generated method stub 
      super.onResume(); 

       viewOrders = new Runnable() 
       { 

       @Override 
       public void run() { 
        // TODO Auto-generated method stub 
        getOrders(); 
       } 
       }; 
       Thread thread = new Thread(null, viewOrders, "MagentoBackground"); 
        thread.start(); 
        m_ProgressDialog = ProgressDialog.show(UpdateMailServr.this,  
          "Please wait...", "Retrieving data ...", true); 

      } 

     // End of all the list stuff 
+0

커서는 커서 어댑터를 사용하고 작업에서 스레드를 시작하지 않아야합니다. – njzk2

+0

좋아 .. 그냥 내버려 둬 .. 다시 돌려 드리겠습니다 – Amar

+0

안녕하세요 ... 내게 CursorAdapter를 사용하는 방법을 안내해 주시겠습니까? 내 의심은 커서를 데이터베이스에서 몇 가지 값을 할당하는 것입니다. 어떻게 그것을 사용하여 데이터를 ArrayList에 넣은 다음 Listadapter에서 사용합니다. – Amar

답변

5

로 태그 라인에 발생 managedQuery를 사용하여? 서를 가져와야합니다.

어째서 Icecream Sandwich의 어떤 이유로 든 커서를 제대로 닫지 않은 응용 프로그램을 복원하는 데 문제가있었습니다. 이 문제를 해결하기 위해 모든 커서에 대해 다음과 같이 수정했습니다.

if (cursor != null && !cursor.isClosed()) { 
    myActivity.stopManagingCursor(cursor); 
    cursor.close(); 
} 
+0

API 11에서는 start/stopManagingCursor가 더 이상 사용되지 않으므로 ICS가 커서를 관리하지 않습니다. 더 나은 전략은 LoaderManager를 사용하는 것입니다. . 또한 백그라운드 스레드에 커서를로드하여 앱의 응답 성을 향상시킬 수 있습니다. – emil10001

관련 문제