2

Androidの内部データベーステーブルからエントリを削除したいのですがContactsContract、誕生日などのイベントを連絡先のエントリから削除する必要があります。

次のコードはかなりうまく機能しますが、一部のユーザー(約1%)はこれを。でクラッシュさせSQLExceptionます。それで、私のコードに何か問題がありますか、それとも彼らのデバイスがAndroidをContactsContract正しくサポートしていないというだけですか?

try {
    ArrayList<Long> rawContactIDs = getRawContactID(o.getID());
    int rawContactCount = rawContactIDs.size();
    for (int r = 0; r < rawContactCount; r++) {
        long rawContactID = rawContactIDs.get(r);
        String where = ContactsContract.Data.MIMETYPE+" = ? AND "+ContactsContract.Data.RAW_CONTACT_ID+" = ? AND "+ContactsContract.CommonDataKinds.Event.TYPE+" = ?";
        String[] selection = new String[] { ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE, String.valueOf(MY_RAW_CONTACT_ID), String.valueOf(ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY) };
        getContentResolver().delete(ContactsContract.Data.CONTENT_URI, where, selection);
    }
}
catch (Exception e) {}

スローされる例外は次のとおりです。

android.database.sqlite.SQLiteException: no such column: mimetype: , while
compiling: DELETE FROM data WHERE mimetype = ? AND raw_contact_id = ? AND
data2 = ?
at
android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:158)
at
android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114)
at
android.content.ContentProviderProxy.delete(ContentProviderNative.java:472)
at android.content.ContentResolver.delete(ContentResolver.java:700)
at ... MY_ACTIVITY ...
4

2 に答える 2

1

ContactsContract APIはレベル5から利用可能です。この問題を報告しているユーザーがレベル5未満(ドーナツ、カップケーキ)である可能性はありますか?

于 2012-08-23T17:33:10.377 に答える
1

デバイスメーカーはContentProvider、AOSPに同梱されているの実装を変更することができます。理論的には、これらの変更は互換性テストスイート(CTS)によってキャッチされるため、Playストアから出荷された場合、APIを壊さないデバイスのみがアプリを実行します。

そうは言っても...

  • CTSは完全にはほど遠い
  • Playストア以外にアプリを意図的に配布し、互換性のないデバイスを使用している誰かがアプリを実行した場合、CTSはユーザーを保護しません
  • Playストア以外に意図せずにアプリを配布した場合(つまり、アプリが海賊版になっている場合)、互換性のないデバイスを使用している誰かがアプリを実行した場合、CTSはユーザーを保護しません。
  • さまざまなデバイスメーカーがPlayストアアプリ自体を海賊版にしています

したがって、OSが提供する内部から発生しているように見える問題が表示されてもContentProvider、それらの問題がまれであるか、認識されていないデバイスにある場合でも、慌てる必要はありません。この場合でも(失敗した呼び出しを独自の例外ハンドラーでラップすることにより)正常に失敗することを選択することもできますが、コードが実際に問題の原因である可能性は低いです。

于 2012-08-26T11:17:18.643 に答える