2

contentobserverSMSの監視に使用しています。それはすべて正常に動作します。これらの SMS をデータベースに保存しようとするとerror near "t" syntax error、特定の SMS のエラーが表示されます。この特定の SMS を削除しても問題はありません。インストール後、すべてのメッセージが順番に正しく表示されます。しかし、エラーは私の配列リストの最後に送られます。また、この後に私の電話から送信された 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;
  }
}

上記のコードは、受信トレイにある現在の SMS をデータベースに保存します。以下のコードは、新しい SMS が到着したときに受信トレイを更新するために使用されます。到着したメッセージをトーストしますが、データベースには挿入しません。

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

推測では、1 つの SMS にある種の制限された文字/単語が含まれていました。

問題に対処するには、準備済みステートメントを使用する必要があります。

例については、このSO Answerを参照してください。

表示順序に関する 2 番目の問題については、クエリで ORDER BY を変更または使用して、適切な順序を設定してください。

于 2012-06-30T12:03:46.830 に答える