2

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

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;
    }
4

1 回答 1

1

猜测在一条短信中存在某种受限制的字符/单词。

您应该使用准备好的语句来处理该问题。

有关示例,请参见此SO Answer 。

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

于 2012-06-30T12:03:46.830 回答