2

連絡先電話番号のクエリ中に、次の sqlite 例外が発生します。

05-05 04:25:47.276: E/AndroidRuntime(7369): android.database.sqlite.SQLiteException: near "s": syntax error: , while compiling:
 SELECT data1, data2 FROM view_data_restricted data WHERE (1 AND mimetype = 'vnd.android.cursor.item/phone_v2') AND ( DISPLAY_NAME = 'Seller's Permit Rose Agent')
05-05 04:25:47.276: E/AndroidRuntime(7369):     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:158)
05-05 04:25:47.276: E/AndroidRuntime(7369):     at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114)
05-05 04:25:47.276: E/AndroidRuntime(7369):     at android.content.ContentProviderProxy.bulkQueryInternal(ContentProviderNative.java:330)
05-05 04:25:47.276: E/AndroidRuntime(7369):     at android.content.ContentProviderProxy.query(ContentProviderNative.java:366)
05-05 04:25:47.276: E/AndroidRuntime(7369):     at android.content.ContentResolver.query(ContentResolver.java:245)

直接使用していないため、sqliteについては何も知りません。カーソルを使用しています。例外のルートは次の行です。

phoneCursor = contentResolver.query(Phone.CONTENT_URI, new String[] { Phone.NUMBER, Phone.TYPE },
                " DISPLAY_NAME = '" + name + "'", null, null);

完全な方法は

public ArrayList<Contact> getContacts() {
    ArrayList<Contact> data = new ArrayList<Contact>();

    contactCursor = contentResolver.query(Contacts.CONTENT_URI, new String[] { Contacts.DISPLAY_NAME, BaseColumns._ID }, null, null, null);
    if (contactCursor != null) {
      String name = null;
      String phoneString = null;
      long phoneNumber = -1;
      long id;
      InputStream image = null;
      while (contactCursor.moveToNext()) {
        name = contactCursor.getString(contactCursor.getColumnIndex(Contacts.DISPLAY_NAME));
        image = Contacts.openContactPhotoInputStream(contentResolver, ContentUris.withAppendedId(Contacts.CONTENT_URI,
            contactCursor.getLong(contactCursor.getColumnIndex(BaseColumns._ID))));
        id = contactCursor.getLong(contactCursor.getColumnIndex(BaseColumns._ID));

        phoneCursor = contentResolver.query(Phone.CONTENT_URI, new String[] { Phone.NUMBER, Phone.TYPE },
            " DISPLAY_NAME = '" + name + "'", null, null);
        while (phoneCursor.moveToNext()) {
          ...
        }
      }
    }
    return data;
  }
4

3 に答える 3

2

android.database.sqlite.SQLiteException: 「s」の近く: 構文エラー: 、コンパイル中: SELECT data1, data2 FROM view_data_restricted data WHERE (1 AND mimetype = 'vnd.android.cursor.item/phone_v2') AND ( DISPLAY_NAME = '販売者許可証 Rose Agent')

表示名に一重引用符が含まれているため、例外が発生しました

これを試して

name=name.replace("'","''");

その後

 phoneCursor = contentResolver.query(Phone.CONTENT_URI, new String[] { Phone.NUMBER, Phone.TYPE },
            " DISPLAY_NAME = '" + name + "'", null, null);
于 2013-05-05T11:47:07.350 に答える
1

name文字列の一重引用符が原因です。1 つの方法は単一引用符を取り除くことですが、それは正しい方法ではありません。一重引用符と二重引用符が含まれていてもコードが機能するようにするには、.query() メソッドを使用する代わりに rawQuery() を使用してみてください。上記の 2 つのスレッドを参照してください: SQL クエリ文字列内の Android の引用符、単一引用符が含まれる項目のクエリの処理。彼らは同じ問題を扱っています。

于 2013-05-05T11:47:27.120 に答える
0

理想的には、

phoneCursor = contentResolver.query(Phone.CONTENT_URI, new String[] { Phone.NUMBER, Phone.TYPE }, " DISPLAY_NAME = ?", new String[] {name}, null); 
于 2013-05-05T12:03:20.557 に答える