2012-06-30 91 views
2

我正在使用contentobserver来监控SMS。它一切正常。当我尝试将这些短信保存到数据库时,它显示特定SMS的错误error near "t" syntax error。当我删除这个特定的SMS时,没有问题。安装后,它会按顺序正确显示所有消息。但是错误发送到我的数组列表的末尾。此后,从我的手机发送的短信在列表之间更新,而不是最后一个位置。请帮忙。arraylist未正确更新

adapter = new ArrayAdapter<String>(getApplicationContext(), android.R.layout.simple_list_item_1,list); 
setListAdapter(adapter); 
data = Incoming_outgoing_smsActivity.this.openOrCreateDatabase("Messages", MODE_PRIVATE, null); 
data.execSQL("CREATE TABLE IF NOT EXISTS recor(text varchar(300));"); 
Cursor cur = data.rawQuery("SELECT * FROM recor", null); 
while(cur.moveToNext()) { 
    String content = cur.getString(cur.getColumnIndex("text")); 
    backward_list.add(content); 
    list.add(content); 
} 
adapter.notifyDataSetChanged(); 
Cursor cursor = getContentResolver().query(Uri.parse("content://sms"), null, null, null, null); 
while(cursor.moveToNext()) { 
    String number = cursor.getString(cursor.getColumnIndex("address")); 
    String[] projection = new String[] {ContactsContract.PhoneLookup.DISPLAY_NAME}; 
    Uri contactUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)); 
    Cursor cursor_name = getContentResolver().query(contactUri, projection, null, null, null); 
    String body = cursor.getString(cursor.getColumnIndex("body")); 
    String type = cursor.getString(cursor.getColumnIndex("type")); 
    long date1= cursor.getLong(cursor.getColumnIndex("date")); 
    SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss.SSS"); 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(date1); 
    try { 
    int n = cursor.getInt(cursor.getColumnIndex("type")); 
    switch (n) { 
     case 1: 
     String message = "FROM "+number+"\n"+formatter.format(calendar.getTime())+"\n"+"Message:-"+body; 
     if(backward_list.contains(message)) { 
      continue; 
     } else { 
      list.add(message); 
      backward_list.add(message); 
      data.execSQL("INSERT INTO recor VALUES('"+message+"')"); 
     } 
     break; 
     case 2: 
     String messag = "TO "+number+"\n"+formatter.format(calendar.getTime())+"\n"+"Message:-"+body; 
     if(backward_list.contains(messag)) { 
      continue; 
     } else { 
      list.add(messag); 
      backward_list.add(messag); 
      data.execSQL("INSERT INTO recor VALUES('"+messag+"')"); 
     } 
     break; 
     default: 
     break; 
    } 
    } 
    catch (Exception e) { 
    // TODO: handle exception 
    Toast.makeText(getApplicationContext(), e.getMessage(), Toast.LENGTH_LONG).show(); 
    continue; 
    } 
} 

上面的代码保存在收件箱中,以数据库的当前短信。下面的代码用于在新短信到达时更新您的收件箱。它为到达的消息做烤面包,但不会将它们插入到数据库中。

data = Incoming_outgoing_smsActivity.this.openOrCreateDatabase("Messages", MODE_PRIVATE, null); 
data.execSQL("CREATE TABLE IF NOT EXISTS recor(text varchar(300));"); 
super.onChange(selfChange); 
Cursor cursor = getContentResolver().query(Uri.parse("content://sms"), null, null, null, null); 
while(cursor.moveToNext()) { 
    String number = cursor.getString(cursor.getColumnIndex("address")); 
    String[] projection = new String[] { 
    ContactsContract.PhoneLookup.DISPLAY_NAME}; 
    Uri contactUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)); 
    Cursor cursor_name = getContentResolver().query(contactUri, projection, null, null, null); 
    if(cursor_name.moveToFirst()) { 
     name = cursor_name.getString(cursor_name.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME)); 
    } 
    String body = cursor.getString(cursor.getColumnIndex("body")); 
    String type = cursor.getString(cursor.getColumnIndex("type")); 
    long date1= cursor.getLong(cursor.getColumnIndex("date")); 
    SimpleDateFormat formatter = new SimpleDateFormat("dd-MM-yyyy hh:mm:ss.SSS"); 
    Calendar calendar = Calendar.getInstance(); 
    calendar.setTimeInMillis(date1); 
    int n = cursor.getInt(cursor.getColumnIndex("type")); 
    switch (n) { 
     case 1: 
     String message = "FROM "+number+"\n"+formatter.format(calendar.getTime())+"\n"+"Message:-"+body; 
     if(backward_list.contains(message)) { 
      continue; 
     } else { 
      list.add(message); 
      backward_list.add(message); 
      data.execSQL("INSERT INTO recor VALUES('"+message+"')"); 
     } 
     break; 
     case 2: 
     String messag = "TO "+number+"\n"+formatter.format(calendar.getTime())+"\n"+"Message:-"+body; 
     if(backward_list.contains(messag)) { 
      continue; 
     } else { 
      list.add(messag); 
      backward_list.add(messag); 
      data.execSQL("INSERT INTO recor VALUES('"+messag+"')"); 
     } 
     break; 
     default: 
     break; 
    } 

回答

1

猜测在一个短信中有某种受限制的字符/字。

您应该使用预处理语句来处理该问题。

查看此SO Answer为例。

对于第二个关于显示顺序的问题,在查询中更改/使用ORDER BY来设置正确的顺序。