2011-03-21 71 views
0

在android中使用AsqlTask​​中的sqlite命令時遇到兩個主要問題。在android中使用AsyncTask中的sqlite時有問題嗎?

  1. 當我第一次嘗試執行SELECT命令我沒有得到任何結果,但在第二次嘗試(裝載有這一個的AsyncTask活動)我得到的結果。

  2. 有時候,我得到一個錯誤,該數據庫沒有關閉,儘管它已經關閉/

什麼問題,這是什麼?

UPDATE: 這是從數據庫retrive數據的代碼(db.getAllMessage)

private ArrayList<FriendMessagesResulted> getMessagesFromCach(Context c){ 

    FriendMessagesResulted messagesResulted1 = new FriendMessagesResulted(); 
    DBAdapter db = new DBAdapter(c); 
    Cursor c1; 
    db.open(); 

    c1 = db.getAllMessage(Settings.getCurrentUserId(c),Integer.parseInt(fId)); 
    Log.d("***Database count",c1.getCount()+" from: "+Settings.getCurrentUserId(c)+" to:"+Integer.parseInt(fId)); 
    c1.moveToFirst(); 
    if(c1.getCount()>0) 
      status=true; 

    if (messagesResultedList == null) { 
      messagesResultedList = new ArrayList<FriendMessagesResulted>(); 
    } 
     else 
      messagesResultedList.clear(); 

     while (c1.isAfterLast() == false) { 
      if(Integer.parseInt(c1.getString(0))>maxId) 
       maxId=Integer.parseInt(c1.getString(0)); 

      messagesResulted1.set_mId(Integer.parseInt(c1.getString(0))); 
      messagesResulted1.set_msgTxt("MD:"+c1.getString(3)); 
      messagesResulted1.set_MessageTime(c1.getString(4)); 
      messagesResulted1.set_dir(c1.getString(5)); 
      messagesResultedList.add(messagesResulted1); 
      c1.moveToNext(); 
     } 

    db.close(); 
    c1.close();  
    return messagesResultedList; 
} 

這對於的AsyncTask,其中I調用get getMessagesFromCach方法的代碼

private void getMessages(final Context c) 
{ 
    handler = new Handler(); 
     r=new Runnable() { 
      public void run() { 
       class RecentMessageLoader extends AsyncTask<Void, Void, ArrayList<FriendMessagesResulted>>{ 
        ArrayList<FriendMessagesResulted> messagesResultedList=null; 


        @Override 
        protected ArrayList<FriendMessagesResulted> doInBackground(Void... params) { 

         if(!finishLoadingPastMessages) 
          { 
          messagesResultedList=getMessagesFromCach(c); 

          if(!status){ 
           Log.d("Where are you","I'm in JSON"); 
           messagesResultedList=getMessagesFromJSON(c); 
          } 
          } 
         else{ 
          Log.d("Where are you","I'm in Recent messages"); 
          messagesResultedList=getRecentMessages(c,Settings.getCurrentUserId(c),Integer.parseInt(fId)); 
         } 
          return messagesResultedList; 
        } 
        protected void onPostExecute(ArrayList<FriendMessagesResulted> FMRList) { 

         // to disappear loading message 
         d.dismiss(); 
         finishLoadingPastMessages=true; 
         if(FMRList!=null){ 
          for(int i=FMRList.size()-1;i>=0;i--) 
           addMessage(FMRList.get(i),c); 
         } 
         handler.postDelayed(r, 2000); 
        } 
      } 
      new RecentMessageLoader().execute(); 
      } 
     }; 
     handler.post(r); 
} 

UPDATE 2 :Cach類..

public class Cach { 
    static DBAdapter db; 
    public Cach(Context c) 
    { 
    } 

    public static void AddMessages(Context c, 
            int id, 
            int fromId, 
            int toId, 
            String message, 
            String dir, 
            String MessageTime) 
    { 
     db = new DBAdapter(c); 
     db.open();   
     long id2; 
     id2 = db.insertMessage(id, fromId, toId, message, dir,MessageTime); 
     db.close(); 
    } 
} 
+1

請顯示您的代碼。 – Olegas 2011-03-21 16:53:34

+0

在'Runnable'中啓動'AsyncTask'?奇怪的 – ernazm 2011-03-21 17:03:26

+0

@ user639183爲什麼?我想定時器每2秒執行一些任務\t [handler.postDelayed(r,2000); ] – Adham 2011-03-21 17:04:19

回答

2

看來問題是與你正在使用的變量類型..必須有從許多來源設置的實例變量的靜態變量...儘量不要使用靜態變量和使用局部變量我的意思是隱式地在方法中。