2011-03-07 105 views
0

我使用以下代碼來讀取聯繫人並將一些信息存儲在RAM中。在某些電話這不起作用。此代碼拋出異常。我認爲它來自moveToNext()。有人可能會查看它並告訴我他是否看到錯誤。代碼下方是開發人員控制檯中錯誤報告的堆棧跟蹤。在讀取聯繫人時在Cursor.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) 

回答

0

添加此PhoneContacts.movetofirst();循環前..和檢查將發生什麼..

1

使用循環如下..

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

告訴我,如果它的工作原理..

相關問題