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