2010-07-20 6 views
5

Die vollständige Ausnahme, die ich bekommen ist:Wie finde ich heraus, welches Feld NullPointerException verursacht, wenn ein benutzerdefiniertes Feld in die Kontakte-Datentabelle eingefügt wird?

07-16 19:19:17.244: ERROR/DatabaseUtils(151): java.lang.NullPointerException 
07-16 19:19:17.244: ERROR/DatabaseUtils(151):  at com.android.providers.contacts.ContactsProvider2.insertData(ContactsProvider2.java:3069) 
07-16 19:19:17.244: ERROR/DatabaseUtils(151):  at com.android.providers.contacts.ContactsProvider2.insertInTransaction(ContactsProvider2.java:2930) 
07-16 19:19:17.244: ERROR/DatabaseUtils(151):  at com.android.providers.contacts.CContactsProvider2.insertInTransaction(CContactsProvider2.java:156) 
07-16 19:19:17.244: ERROR/DatabaseUtils(151):  at com.android.providers.contacts.HtcContactsProvider2.insertInTransaction(HtcContactsProvider2.java:1281) 
07-16 19:19:17.244: ERROR/DatabaseUtils(151):  at com.android.providers.contacts.SQLiteContentProvider.insert(SQLiteContentProvider.java:90) 
07-16 19:19:17.244: ERROR/DatabaseUtils(151):  at com.android.providers.contacts.ContactsProvider2.insert(ContactsProvider2.java:2737) 
07-16 19:19:17.244: ERROR/DatabaseUtils(151):  at android.content.ContentProvider$Transport.insert(ContentProvider.java:150) 
07-16 19:19:17.244: ERROR/DatabaseUtils(151):  at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:170) 
07-16 19:19:17.244: ERROR/DatabaseUtils(151):  at android.os.Binder.execTransact(Binder.java:287) 
07-16 19:19:17.244: ERROR/DatabaseUtils(151):  at dalvik.system.NativeStart.run(Native Method) 

Der Code, den ich verwenden:

public void saveFormality() { 
    ContentValues values = new ContentValues(); 
    values.put(Data.DATA1, this.getFormality() ? "1" : "0"); 
    saveDataWithMimeType(clsContacts.MIMETYPE_FORMALITY, values, this.getId()); 
} 


private void saveDataWithMimeType(String mimetype, ContentValues values, String contactid) { 
    try { 
     int mod = ctx.getContentResolver().update(
       Data.CONTENT_URI, 
       values, 
       ContactsContract.Data.RAW_CONTACT_ID + "=" + contactid + " AND " + ContactsContract.Data.MIMETYPE + "= '" 
         + mimetype + "'", null); 

     if (mod == 0) { 
      values.put(Data.RAW_CONTACT_ID, contactid); 
      values.put(Data.MIMETYPE, mimetype); 
      // this is where exception occurs 
      Uri u=ctx.getContentResolver().insert(Data.CONTENT_URI, values); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Dies nur am Telefon geschieht, und nicht in dem Emulator. Alle Felder wurden überprüft und keine von ihnen sind Nullen. Was könnte der Grund sein?

+0

Auf welcher API-Ebene geschieht dies? – ognian

+0

API-Ebene ist 2.1 – Pentium10

+0

Dies muss ein gerätspezifischer Fehler sein, da in der ursprünglichen Android-Quelle ContactsProvider2.java3069 nicht die Methode insertData() ist. – ognian

Antwort

-1

Teilen Sie die Zeile ContactsProvider2.java:3069 in mehrere, die nur einen einzelnen Punkt enthalten. Auf diese Weise stimmt die Zeilennummer mit einer einzelnen Felddereferenz überein, die Ihnen direkt mitteilt, welches Feld null ist.

+0

Leider ist das im Android SDK System eingebaut und ich habe keinen Zugriff darauf. – Pentium10

+0

Suchen Sie in Ihrem SDK nach der Quelle dieser Datei und überprüfen Sie den Code. –

+0

Wie in der Frage angegeben, geschieht dies nur auf dem Telefon, ich habe keinen Zugriff auf diese Dateien auf dem Telefon. Ognian sagte, dass es sich um einen gerätespezifischen Fehler handeln könnte. – Pentium10

10

Ermittelt durch einen enormen Prozess des Stöberns in den Rohdaten für manuell hinzugefügte Kontakte, gefolgt von Versuch und Irrtum, um herauszufinden, auf welche Daten der Inhaltsanbieter bestanden hat. Es ist einfach genug:

Wenn Sie einen neuen Telefoneintrag einfügen, müssen Sie müssen geben Sie eine Data.Type (die Spalte namens "data2"). Wenn Sie dies nicht angeben, stürzt HTC Contacts ContentProvider mit einer NullPointerException ab. Der Bestand Android Contents ContentProvider stürzt nicht ab, sondern wird standardmäßig auf TYPE_OTHER gesetzt.

Verdammt und sprengen HTC für (a) Implementierung eines anderen Contents ContentProvider, der nicht spielt nach den dokumentierten Regeln und (b) für nur die Freigabe des Kernel-Quellcodes. Wir brauchen HtcContactsProvider2.java, um zu sehen, was ihr Code das Problem denkt.

+0

Konfrontiert mit dem gleichen Problem. Danke, dass Sie die Lösung hier gepostet haben! – Mus

+0

Wie legt man den Datentyp fest? – Indhu

+0

Ich verlasse immer CommonDataKinds.Phone.TYPE, aber People-App stürzt immer noch auf HTC One X, nicht sicher, was zu tun ist :( – Y2i

Verwandte Themen