如何在Sqlite DB中提供新记录时获取数据并更新到UI?

时间:2012-02-03 10:31:31

标签: sqlite listview

我正在通过与.net网络服务进行通信来处理示例应用程序。在我的应用程序中,我从Web服务获取记录到我的活动类,然后我通过使用ArrayAdapter在ListView中显示整个记录,而且我正在运行服务在Web服务中获取新记录时,从Web服务获取最新记录,然后我将这些记录保存到SQLite数据库中。此过程发生在后台。我想获取最新数据从SQLite DB并附加到我的ListView。  我已经实现了Activity类,如下所示:

public class GetMsgsScreen extends ListActivity 
{

private LayoutInflater mInflater;
private Vector<RowData> data;
RowData rd;

static String[] userName = null;
static String[] usrMessages = null; 

private Integer[] imgid = null;

ShoutRepeatService bg;

////////////////////////////////////////////////////
List<Message> resultShoutMessage;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    requestWindowFeature(Window.FEATURE_NO_TITLE);

    resultMessage = new ParseXml().convertMessages(new Model().getMessages("0"));

    usrMessages = new String[resultMessage.size()];
    userName = new String[resultMessage.size()];
    imgid = new Integer[resultMessage.size()];

    getSharedPreferences("Values", 0).edit().putString("msgid",resultMessage.get(0).getMessageID()).commit();

    for(int i=0;i<resultMessage.size();i++)
    {

        Log.v("GetMsgsScreen", "resultMessage*******>>>>"+resultMessage.get(i).getMessageText());
        Log.v("GetMsgsScreen", "resultNames*******>>>>"+resultMessage.get(i).getUserFirstName());
        usrMessages[i] = resultMessage.get(i).getMessageText();
        userName[i] = resultMessage.get(i).getUserFirstName();
        imgid[i] = R.drawable.person;


    }



    ///////////////////////////////////////////////////////
    mInflater = (LayoutInflater) getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

            data = new Vector<RowData>();
            for(int i=0;i<userName.length;i++){

            try {
                rd = new RowData(i,userName[i],usrMessages[i]);
                } catch (ParseException e) {
                    e.printStackTrace();
               }
               data.add(rd);
            }
               CustomAdapter adapter = new CustomAdapter(this, R.layout.list, R.id.usrName, data);
               setListAdapter(adapter);

                bindService(new Intent(GetMsgsScreen.this, RepeatService.class), mConnection, Context.BIND_AUTO_CREATE);


               getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
               this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
               getListView().setTextFilterEnabled(true);
            }

@Override
protected void onDestroy() {
    unbindService(mConnection);
    super.onDestroy();
}


   private ServiceConnection mConnection = new ServiceConnection() {

        public void onServiceConnected(ComponentName className, IBinder binder) {

            bg = ((RepeatService.MyBinder) binder).getService();

            Toast.makeText(GetMsgsScreen.this, "Connected",
                    Toast.LENGTH_SHORT).show();

        }

        public void onServiceDisconnected(ComponentName className) {
            bg = null;
        }
    }; 


       public void onListItemClick(ListView parent, View v, int position, long id) {            

               Toast.makeText(getApplicationContext(), "You have selected "
                                +(position+1)+"th item",  Toast.LENGTH_SHORT).show();


               }










  private class CustomAdapter extends ArrayAdapter<RowData> {

    public CustomAdapter(Context context, int resource, int textViewResourceId, List<RowData> objects) {               

             super(context, resource, textViewResourceId, objects);
              }
                  @Override
                   public View getView(int position, View convertView, ViewGroup parent) {   

                   ViewHolder holder = null;
                   TextView name = null;
                   TextView messages = null;
                   ImageView i11=null;
                   RowData rowData= getItem(position);
                   if(null == convertView){
                        convertView = mInflater.inflate(R.layout.list, null);
                        holder = new ViewHolder(convertView);
                        convertView.setTag(holder);
                      }
                         holder = (ViewHolder) convertView.getTag();
                         name = holder.gettitle();
                         name.setText(rowData.mName);
                         messages = holder.getdetail();
                         messages.setText(rowData.mMessage);                                                     

                         i11=holder.getImage();
                         i11.setImageResource(imgid[rowData.mId]);
                         return convertView;
                     }
                        private class ViewHolder {
                        private View mRow;
                        private TextView names = null;
                        private TextView messageText = null;
                        private ImageView i11=null; 

                        public ViewHolder(View row) {
                        mRow = row;
             }
                     public TextView gettitle() {
                         if(null == names){
                             names = (TextView) mRow.findViewById(R.id.usrName);
                            }
                        return names;
                     }     

                     public TextView getdetail() {
                         if(null == messageText){
                             messageText = (TextView) mRow.findViewById(R.id.msgText);
                                }
                       return messageText;
                     }
                    public ImageView getImage() {
                         if(null == i11){
                              i11 = (ImageView) mRow.findViewById(R.id.img);
                                                  }
                            return i11;
                    }
                 }
               } 

}

我已经实现了后台服务类,如下所示:

     public class RepeatService extends Service
{
 List<Message> resultMessage;
 String[] userNameLatest = null;
 String[] usrMessagesLatest = null;
 String[] usrMessageID = null;
 String msgID = null;
 private Timer timer = new Timer();
 private static final long UPDATE_INTERVAL = 500;

 SQLiteDB db;

@Override
public IBinder onBind(Intent arg0) {
    // TODO Auto-generated method stub
    return null;
}

@Override
public void onCreate() {


   pollForUpdates();
    super.onCreate();
}



private void pollForUpdates() {
    timer.scheduleAtFixedRate(new TimerTask() {
        @Override
        public void run() {

            Log.v("!!!!!!!!!!!!!!!!", "service is calling");
            msgID = getSharedPreferences("Values", 0).getString("msgid","");
            resultMessage = new ParseXml().convertMessages(new Model().getMessages(msgID));
            usrMessagesLatest = new String[resultMessage.size()];
            userNameLatest = new String[resultMessage.size()];
            usrMessageID = new String[resultMessage.size()];

            db = new SQLiteDB();

             for(int i=0;i<resultMessage.size();i++)
                {
                    Log.v("RepeatService", "getMessageID------>"+resultMessage.get(i).getMessageID());               
                    Log.v("RepeatService", "getMessageText------>"+resultMessage.get(i).getMessageText());
                    Log.v("RepeatService", "getUserFirstName------>"+resultMessage.get(i).getUserFirstName());

                    usrMessagesLatest[i] = resultMessage.get(i).getMessageText();
                    userNameLatest[i] = resultMessage.get(i).getUserFirstName();
                    usrMessageID[i] = resultMessage.get(i).getMessageID();

    //Save the data into Sqlite db here

db.insertValues(usrMessageID[i], userNameLatest[i], usrMessagesLatest[i], RepeatService.this);



                }

        }
    }, 0, UPDATE_INTERVAL);

    Log.v(getClass().getSimpleName(), "Timer started.");

}



public class MyBinder extends Binder {
    ShoutRepeatService getService() 
    {
        return ShoutRepeatService.this;
    }
}

}

如果Web服务提供的任何新记录将记录存储到Sqlite数据库中,则上述类总是在后台运行。

从上面的代码我可以将数据保存到Sqlite数据库中 如何在My Activity类中向ListView显示最新记录?

请任何机构帮我解释代码说明.........

1 个答案:

答案 0 :(得分:0)

我可能会使用在添加新内容时从服务通知的BroadcastReceiver。然后它可以更新您的列表。另请查看LocalBroadcastManager,因为所有通信都在您的应用中。