Android 使用ListView的BaseAdapter时无法更新数据库的游标

Android 使用ListView的BaseAdapter时无法更新数据库的游标,android,database,sqlite,listview,android-listview,Android,Database,Sqlite,Listview,Android Listview,在经历了许多教程之后,我成功地在我的android应用程序中实现了数据库,除了一件事之外,一切都很好。我的应用程序是用来接收文本消息(SMS)并将它们存储在数据库中,还可以在ListView中填充它们。当应用程序收到消息时,数据库会更新,但该实例中的listview不会更新,但在重新启动应用程序后,listview将填充数据库中所有接收到的数据。请帮我解决这个问题。 以下是我的代码片段: 主类 import android.os.Bundle; import android.wi

在经历了许多教程之后,我成功地在我的android应用程序中实现了数据库,除了一件事之外,一切都很好。我的应用程序是用来接收文本消息(SMS)并将它们存储在数据库中,还可以在ListView中填充它们。当应用程序收到消息时,数据库会更新,但该实例中的listview不会更新,但在重新启动应用程序后,listview将填充数据库中所有接收到的数据。请帮我解决这个问题。 以下是我的代码片段: 主类

    import android.os.Bundle;
    import android.widget.ListView;
    import com.example.bhash.database.Adapter;
    import com.example.bhash.database.MessageData;
    import com.example.bhashsms.adapters.DrawerAdapter;
    import com.jeremyfeinstein.slidingmenu.lib.app.SlidingActivity;

    public class Main extends SlidingActivity {
        ListView dList, mList;
        DrawerAdapter dAdapter;
        static MessageData db;
        static Adapter adapter;

        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            setBehindContentView(R.layout.drawer);
            init();
            db = new MessageData(Main.this);

            adapter = new Adapter(this);
            mList.setAdapter(adapter);

        }

        private void init() {
            getSlidingMenu().setBehindOffset(100);
            dList = (ListView) findViewById(R.id.drawerlist);
            mList = (ListView) findViewById(R.id.mainlist);
        }

        public static void update(String number, String body) {
            // adapter.list.add(new Person_Data(number, body));
            try {

                db.open();
                db.createEntry(number, body);
                db.close();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

            adapter.notifyDataSetChanged();

        }

    }
databasehelper类:

    public class MessageData {

        public static final String KEY_ROWID = "_id";
        public static final String KEY_NUMBER = "phone_number";
        public static final String KEY_MESSGAE = "message";

        private static final String DATABASE_NAME = "Message";
        private static final String DATABASE_TABLE = "SMS";
        private static final int DATABASE_VERSION = 1;
        private Helper helper;
        private Context ourContext;
        private SQLiteDatabase ourDatabase;

        public MessageData(Context c) {
            // TODO Auto-generated constructor stub
            ourContext = c;

        }

        private static class Helper extends SQLiteOpenHelper {

            public Helper(Context context) {
                super(context, DATABASE_NAME, null, DATABASE_VERSION);
                // TODO Auto-generated constructor stub
            }

            @Override
            public void onCreate(SQLiteDatabase db) {
                // TODO Auto-generated method stub
                try {
                    db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + KEY_ROWID
                            + " INTEGER PRIMARY KEY AUTOINCREMENT, " + KEY_NUMBER
                            + " TEXT NOT NULL, " + KEY_MESSGAE + " TEXT NOT NULL);");
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

            @Override
            public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                // TODO Auto-generated method stub
                try {
                    db.execSQL("DROP TABLE IF EXIST " + DATABASE_TABLE);
                    onCreate(db);
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }

        }

        public MessageData open() {
            helper = new Helper(ourContext);
            ourDatabase = helper.getWritableDatabase();
            return this;
        }

        public void close() {
            helper.close();
        }

        public long createEntry(String number, String message) {
            ContentValues cv = new ContentValues();
            cv.put(KEY_NUMBER, number);
            cv.put(KEY_MESSGAE, message);
            return ourDatabase.insert(DATABASE_TABLE, null, cv);

        }

        public List<Person_Data> getData() {
            String[] columns = new String[] { KEY_ROWID, KEY_NUMBER, KEY_MESSGAE };
            Cursor c = ourDatabase.query(DATABASE_TABLE, columns, null, null, null,
                    null, null);

            // int iRow = c.getColumnIndex(KEY_ROWID);
            int iNumber = c.getColumnIndex(KEY_NUMBER);
            int iMessage = c.getColumnIndex(KEY_MESSGAE);
            Log.i("coaunt value",c.getCount()+"");
            List<Person_Data> list = new ArrayList<Person_Data>();
            c.moveToFirst();

            for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {

                list.add(new Person_Data(c.getString(iNumber), c
                        .getString(iMessage)));

            }
            c.close();
            return list;

        }

    }
公共类MessageData{
公共静态最终字符串键_ROWID=“_id”;
公共静态最终字符串键\u NUMBER=“电话号码”;
公共静态最终字符串键\u MESSGAE=“message”;
私有静态最终字符串数据库\u NAME=“Message”;
私有静态最终字符串数据库\u TABLE=“SMS”;
私有静态最终int数据库_VERSION=1;
私人佣工;
私人语境;
私有SQLITE数据库;
公共消息数据(上下文c){
//TODO自动生成的构造函数存根
ourContext=c;
}
私有静态类帮助程序扩展了SQLiteOpenHelper{
公共助手(上下文){
super(上下文、数据库名称、null、数据库版本);
//TODO自动生成的构造函数存根
}
@凌驾
public void onCreate(SQLiteDatabase db){
//TODO自动生成的方法存根
试一试{
db.execSQL(“创建表”+数据库表+”(“+KEY\u ROWID
+“整数主键自动递增,”+键号
+“文本不为空,”+键信息+“文本不为空”);
}捕获(SQLE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
@凌驾
public void onUpgrade(SQLiteDatabase db,int-oldVersion,int-newVersion){
//TODO自动生成的方法存根
试一试{
db.execSQL(“如果存在,则删除表”+数据库_表);
onCreate(db);
}捕获(SQLE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
}
}
public MessageData open(){
helper=新的helper(ourContext);
ourDatabase=helper.getWritableDatabase();
归还这个;
}
公众假期结束(){
helper.close();
}
公共长createEntry(字符串编号、字符串消息){
ContentValues cv=新的ContentValues();
cv.put(键号、编号);
简历(关键信息、信息);
返回ourDatabase.insert(DATABASE_TABLE,null,cv);
}
公共列表getData(){
字符串[]列=新字符串[]{KEY\u ROWID,KEY\u NUMBER,KEY\u MESSGAE};
游标c=ourDatabase.query(数据库表、列、null、null、,
空,空);
//int iRow=c.getColumnIndex(KEY_ROWID);
int iNumber=c.getColumnIndex(键号);
int iMessage=c.getColumnIndex(关键字消息);
Log.i(“COUNT值”,c.getCount()+);
列表=新的ArrayList();
c、 moveToFirst();
for(c.moveToFirst();!c.isAfterLast();c.moveToNext()){
添加(新的Person_数据)
.getString(iMessage));
}
c、 close();
退货清单;
}
}
适配器类:

    public class Adapter extends BaseAdapter {
        Context c;
        LayoutInflater inflaterr;
        public List<Person_Data> list = new ArrayList<Person_Data>();


        public Adapter(Context c) {
            this.c = c;
            MessageData md = new MessageData(c.getApplicationContext());
            md.open();
            Person_Data datatData;
            list = md.getData();
            Log.i("dasdasdad", list.size()+"");
            md.close();
            inflaterr = LayoutInflater.from(this.c);
            // TODO Auto-generated constructor stub
        }
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return list.size();
        }

        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return list.get(position);
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            ViewHolder holder = null;
            View singleview = convertView;
            if (convertView == null) {

                singleview = inflaterr.inflate(R.layout.main_list_view, parent,
                        false);
                holder = new ViewHolder(singleview);
                singleview.setTag(holder);
            }

            else {
                holder = (ViewHolder) singleview.getTag();

            }
            final Person_Data data = list.get(position);
            holder.Number.setText(data.Number);
            holder.callme.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    ExtractNumber(data.Message);

                }

                private void ExtractNumber(String src) {
                    StringBuilder builder = new StringBuilder();
                    int j = src.length();
                    for (int i = 0; i < j; i++) {
                        char c = src.charAt(i);
                        if (c == '+') {
                            builder.append(c);
                            for (int k = i; k < j; k++) {
                                char r = src.charAt(k);
                                if (!Character.isDigit(r)) {
                                    i = k;
                                    break;
                                }
                                builder.append(r);
                            }
                            if (builder.toString().length() > 8
                                    && builder.toString().length() < 14)
                                break;
                        }
                    }

                    Intent callIntent = new Intent(Intent.ACTION_CALL);
                    callIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    callIntent.setData(Uri.parse("tel:" + builder.toString()));
                    c.startActivity(callIntent);
                }

            });
            return singleview;
        }

        class ViewHolder {
            TextView Number, time;
            ImageView callme;

            public ViewHolder(View v) {
                // TODO Auto-generated constructor stub
                Number = (TextView) v.findViewById(R.id.rNum);
                callme = (ImageView) v.findViewById(R.id.callbutton);

            }
        }
    }
公共类适配器扩展了BaseAdapter{
上下文c;
更平坦的充气机;
public List=new ArrayList();
公共适配器(上下文c){
这个.c=c;
MessageData md=newmessagedata(c.getApplicationContext());
md.open();
个人数据;
list=md.getData();
Log.i(“dasdad”,list.size()+”);
md.close();
inflaterr=从(此.c)开始的更平坦的布局;
//TODO自动生成的构造函数存根
}
@凌驾
public int getCount(){
//TODO自动生成的方法存根
返回list.size();
}
@凌驾
公共对象getItem(int位置){
//TODO自动生成的方法存根
返回列表。获取(位置);
}
@凌驾
公共长getItemId(int位置){
//TODO自动生成的方法存根
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
//TODO自动生成的方法存根
ViewHolder=null;
视图单视图=转换视图;
if(convertView==null){
单视图=充气机充气(R.layout.main\u list\u视图,父视图,
假);
支架=新的视图支架(单视图);
singleview.setTag(支架);
}
否则{
holder=(ViewHolder)singleview.getTag();
}
最终人员\数据数据=列表。获取(位置);
holder.Number.setText(数据号);
holder.callme.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
//TODO自动生成的方法存根
提取号码(数据、报文);
}
私有空提取器编号(字符串src){
StringBuilder=新的StringB