Исключение в Cursor.moveToNext () при чтении контактов - PullRequest
0 голосов
/ 07 марта 2011

Я использую следующий код для чтения контактов и сохранения некоторой информации в оперативной памяти. На некоторых телефонах это не работает. Исключение выдается из этого кода. Я думаю, что это происходит от moveToNext (). Может кто-то может взглянуть на это и сказать мне, если он видит что-то не так. Ниже приведен код трассировки стека из отчета об ошибках в консоли разработчика.

String[] ContactsProjection = new String[] {ContactsContract.Contacts._ID,
                                        ContactsContract.Contacts.DISPLAY_NAME};
String[] PhoneProjection    = new String[] {Phone.NUMBER, Phone.TYPE, Phone.IS_PRIMARY};

/* Make a query for all contacts that have at least one phone number */
Cursor PhoneContacts = theActivity.managedQuery(ContactsContract.Contacts.CONTENT_URI,                    
                     ContactsProjection,
                     ContactsContract.Contacts.HAS_PHONE_NUMBER + " = '1'",
                     null, null);

if(PhoneContacts == null)
return false;

String Id, Name;

/* Iterate through contacts and store them in RAM */
while(PhoneContacts.moveToNext()
{
/* ID and name can already be stored. Because there has to be least one phone number */ 
Id   = PhoneContacts.getString( 
                      PhoneContacts.getColumnIndex(ContactsContract.Contacts._ID));
Name = PhoneContacts.getString( 
                 PhoneContacts.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

if((Id != null) && (Name != null))
{
/* Now get all available phone numbers for the current contact*/
Cursor Numbers = theActivity.managedQuery(Phone.CONTENT_URI, PhoneProjection, 
                                          Phone.CONTACT_ID + " = " + Id, null, null);

if(Numbers != null)
{
  while(Numbers.moveToNext()) /* Store all phone numbers */
  {
    String Number = Numbers.getString(Numbers.getColumnIndex(Phone.NUMBER));
    int    Type   = Numbers.getInt(Numbers.getColumnIndex(Phone.TYPE));
mCallOptions.add(new CallOption(Id, Name, Number, Type));
      }
    }
   }
 }

Получение ошибок следующим образом:

java.lang.IllegalStateException: attempt to re-open an already-closed object: android.database.sqlite.SQLiteQuery (mSql = SELECT _id, display_name FROM view_htc_contacts_restricted WHERE ((has_phone_number = '1') AND (( ext_account_Type<>'DeviceOnly' ) OR ( ext_account_Type IS NULL ) )))
at android.os.Parcel.readException(Parcel.java:1255)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:160)
at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:114)
at android.database.BulkCursorProxy.getWindow(BulkCursorNative.java:217)
at android.database.BulkCursorToCursorAdaptor.onMove(BulkCursorToCursorAdaptor.java:109)
at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:188)
at android.database.AbstractCursor.moveToNext(AbstractCursor.java:256)
at android.database.CursorWrapper.moveToNext(CursorWrapper.java:196)
at CallCommandHandler.boInit(CallCommandHandler.java:84)
at VoiceProcessor$1.run(VoiceProcessor.java:86)
at java.lang.Thread.run(Thread.java:1102)

Ответы [ 2 ]

1 голос
/ 07 марта 2011

Используйте цикл как показано ниже.

if(PhoneContacts.moveToFirst()){
        do{
            //YOUR CODE HERE                 
        }while(PhoneContacts.moveToNext());
    }

Скажите, если это работает ..

0 голосов
/ 07 марта 2011

добавить этот PhoneContacts.movetofirst (); перед циклом .. и проверьте, что будет ..

...