2011-09-08 15 views
7

私はAndroidアプリのユニットテストを行っており、連絡先とはたくさん仕事をしています。 Androidのコンテンツプロバイダに連絡先を挿入し、テストを実行した後に連絡先を削除する必要があります。トラブルは、彼らが実際には削除されません、次のとおりです。Android 2.xでの連絡先の削除

挿入:

ArrayList<ContentProviderOperation> contactOps = new ArrayList<ContentProviderOperation>(); 

int backRefIndex = 0; 

Random r = new Random(); 

    contactOps.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) 
              .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null) 
              .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null) 
              .build());  
    contactOps.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 
              .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, backRefIndex) 
              .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) 
              .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, "Sample Name" + r.nextInt()) 
              .build()); 

    contactOps.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 
         .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, backRefIndex) 
         .withValue(ContactsContract.CommonDataKinds.Phone.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) 
         .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, "020" + r.nextInt()) 
         .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, r.nextInt(20) 
         .build()); 

    try { 
     ContentProviderResult[] result = context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, contactOps); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

削除方法1は、(原材料の連絡先の数を返しますが、彼らは実際には削除されません):

int deletedRawContacts = context.getContentResolver().delete(ContactsContract.RawContacts.CONTENT_URI, ContactsContract.RawContacts._ID + " >= ?", new String[]{"0"}); 

削除方法2(削除方法1と同じ結果ですが、別の方法):

private static int deleteAllRawContacts(Context context) { 
    ContentResolver cr = context.getContentResolver(); 
    Cursor cur = cr.query(ContactsContract.RawContacts.CONTENT_URI, null, null, null, null); 
    int count = 0; 
    while (cur.moveToNext()) { 
     try { 
      String contactId = cur.getString(cur.getColumnIndex(ContactsContract.RawContacts._ID)); 
       count += cr.delete(ContactsContract.RawContacts.CONTENT_URI, ContactsContract.RawContacts._ID + " = ?", new String[]{contactId}); 
     } catch (Exception e) { 
      System.out.println(e.getStackTrace()); 
     } 
    } 
    return count; 
} 

連絡先の削除メソッドは機能しますが、未処理の連絡先の削除メソッドはfalse値を返します。それはすべての連絡先を削除したことを「教えてくれ」ますが、次のテストケースを実行すると古いRaw連絡先が見つかることがあります(挿入された連絡先と現在の連絡先の数が間違っています)。注:すべてのテストはAndroidエミュレータで行われます。

これを解決する方法はありますか?

私は同様の質問をここで見ました:How to delete a contact? - しかし解決策は、与えられた問題を解決するようにも思われません。

答えて

19

wiseidealはすでにあなたのrawcontactsを削除する方法を説明したようにはあなたがする必要がどのような1

に-flagを「削除」に設定されます。このように、真のおURIにcaller_is_syncadapterフラグを設定することです:

RawContacts.CONTENT_URI.buildUpon().appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true").build() 

[削除-メソッドを呼び出すために、この新しいURIを使用します。

int deletedRawContacts = context.getContentResolver().delete(RawContacts.CONTENT_URI.buildUpon().appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true").build(), ContactsContract.RawContacts._ID + " >= ?", new String[]{"0"}); 

ドキュメントに対応する部分がhere(あるO perations-> delete)を実行します。

・ホープ、このことができますし、コーディング幸せ:)

+0

L0rdAli3n、あなただけ絶望的な男性を助けるために、いくつかの良いカルマを獲得した:) –

+0

私は、私はちょうど私がこの答えをマークするのを忘れて実現:) –

+0

を助けることができるうれしいです正しいのですか?クリストフハフナーは決して遅くない方が良いですか? – benfwirtz

0

私は同じ削除を行っています。私は削除した列が1に設定されていることがわかりました。私はcontentresolverが物理的にrawcontactデータを削除しないと思うので、削除フラグを設定します。これらのタグ。

関連する問題