2011-03-21 36 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

看来问题是与你正在使用的变量类型..必须有从许多来源设置的实例变量的静态变量...尽量不要使用静态变量和使用局部变量我的意思是隐式地在方法中。