2017-06-07 1 views
0

Je rencontre un problème étrange lors de la mise à jour de la base de données Firebase sur un nœud existant. il revient avec InvocationTargetException et plus loin en dessous d'une erreur stackoverflow (est-ce d'où le site tire son nom). Ive essayé tout ce que je pouvais penser et fouillé SO et ne peux toujours pas le réparer. Le problème ne semble pas être dans le fichier de construction. J'ai récemment changé le nom de mon paquet d'application et l'ai ajouté à la console de Firebase. Ive a également remarqué que la section de débogage du journal fait toujours référence à mon nom de package précédent com.example.shopper. cela pourrait-il le causer. Ou est-ce les deux lignes indiquées ci-dessous.erreur stackoverflow sur updatechildren() firebase android

else { 
     InventoryItem updatedItem = items.get(position).getInventoryItem(); 
     updatedItem.setPrice(price); 
     updatedItem.setQuantity(quantity); 
     updatedItem.setUnitName(unitType); 
     Map<String, Object> databaseUpdate = new HashMap<>(); 
     databaseUpdate.put(updatedItem.getName(), updatedItem); 
     Log.d(TAG, "done: updatedItem: "+updatedItem.toString()); 
     inventoryDatabaseReference=inventoryDatabaseReference.child(updatedItem.getCategory()); 
     Log.d(TAG, "done: updateNotWorking: "+inventoryDatabaseReference.toString()); 
     inventoryDatabaseReference.updateChildren(databaseUpdate).addOnFailureListener(new OnFailureListener() { 
      @Override 
      public void onFailure(@NonNull Exception e) { 
       Log.d(TAG, "onFailure: "+e.toString()); 
      } 
     }); 
    } 

C'est la ligne avec l'écouteur d'échec que me pointe la trace. J'ai ajouté l'écouteur pour voir ce qui n'allait pas, mais trouvé dès que la ligne est appelée, j'obtiens l'erreur comme dans le journal ci-dessus est l'opération finale réussie Pour obtenir les valeurs pour changer l'élément en utilisant un fragment de dialogue. Ce fragment est utilisé à plusieurs fins similaires, telles que le placement initial de ces données et fonctionne à cette fin. La trace ci-dessous il pointe à la première ligne d'appel donelistener.done

builder.setTitle(title).setPositiveButton("Done", new DialogInterface.OnClickListener() { 
     @Override 
     public void onClick(DialogInterface dialog, int which) { 
      if (setPrice || isUpdating) 
       doneListener.done(quantity, unitSelected, position, priceSet); 
      else { 
       priceInBasket = priceSet * quantityToBuy; 
       Log.d("n", "onClick: TotalPrice toBasket " + priceInBasket + "individiual price" + priceSet); 
       doneListener.done(quantityToBuy, buyerItemUnitName, position, priceInBasket); 
      } 
     } 
    }) 

Désolé si cela est une simple erreur et une perte de temps, mais Ive a passé toute la nuit dernière sur ce sujet et ne peut pas voir la solution. Tout ce que vous devrez peut-être me faire savoir La trace est comme ci-dessous

06-07 14:13:21.434 14585-14585/com.example.testing.shopper  D/CurrentInventory: done: updatedItem: InventoryItem{quantity=6, price=0.5, unitName='/100g'} 
06-07 14:13:21.435 14585-14585/com.example.testing.shopper D/CurrentInventory: done: updateNotWorking: https://shopper-a34fb.firebaseio.com/ShopInventory/-KkgxqStvYBMm1fz0lOZ/Energy%20Drinks 
06-07 14:13:21.764 14585-14585/com.example.testing.shopper I/dalvikvm: threadid=1: stack overflow on call to Ljava/lang/AbstractStringBuilder;.enlargeBuffer:VI 
06-07 14:13:21.764 14585-14585/com.example.testing.shopper I/dalvikvm: method requires 28+20+20=68 bytes, fp is 0x419a2334 (52 left) 
06-07 14:13:21.764 14585-14585/com.example.testing.shopper I/dalvikvm: expanding stack end (0x419a2300 to 0x419a2000) 
06-07 14:13:21.764 14585-14585/com.example.testing.shopper I/dalvikvm: Shrank stack (to 0x419a2300, curFrame is 0x419a248c) 
06-07 14:13:21.765 14585-14585/com.example.testing.shopper D/AndroidRuntime: Shutting down VM 
06-07 14:13:21.765 14585-14585/com.example.testing.shopper D/dalvikvm: threadid=1: detach (group=0x41aa3ce0) 
06-07 14:13:21.765 14585-14585/com.example.testing.shopper W/dalvikvm: threadid=1: thread exiting with uncaught exception (group=0x41aa3ce0) 
06-07 14:13:21.765 14585-14585/com.example.testing.shopper W/dalvikvm: threadid=1: uncaught exception occurred 
06-07 14:13:21.765 14585-14585/com.example.testing.shopper W/System.err: java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 
06-07 14:13:21.772 14585-14585/com.example.testing.shopper W/System.err:  at com.google.android.gms.internal.zzbqi$zza.zzaF(Unknown Source) 

un tas de ces

06-07 14:13:21.859 14585-14585/com.example.testing.shopper D/dalvikvm: GC_FOR_ALLOC freed 5052K (46469), 38% free 8607K/13700K, paused 34ms, total 35ms 
06-07 14:13:21.860 14585-14585/com.example.testing.shopper W/System.err:  at com.google.android.gms.internal.zzbqi.zzaE(Unknown Source) 
06-07 14:13:21.860 14585-14585/com.example.testing.shopper W/System.err:  at com.google.android.gms.internal.zzbqi$zza.zzaF(Unknown Source) 
06-07 14:13:21.860 14585-14585/com.example.testing.shopper W/System.err:  at com.google.android.gms.internal.zzbqi.zzax(Unknown Source) 
06-07 14:13:21.860 14585-14585/com.example.testing.shopper W/System.err:  at com.google.android.gms.internal.zzbqi.zzaE(Unknown Source) 

Il montre ensuite les lignes où mon code est ci-dessus est

06-07 14:13:21.877 14585-14585/com.example.testing.shopper W/System.err:  at com.google.android.gms.internal.zzbqi$zza.zzaF(Unknown Source) 
06-07 14:13:21.877 14585-14585/com.example.testing.shopper W/System.err:  at com.google.android.gms.internal.zzbqi.zzax(Unknown Source) 
06-07 14:13:21.877 14585-14585/com.example.testing.shopper W/System.err:  at com.google.android.gms.internal.zzbqi.zzax(Unknown Source) 
06-07 14:13:21.877 14585-14585/com.example.testing.shopper W/System.err:  at com.google.android.gms.internal.zzbqi.zzaF(Unknown Source) 
06-07 14:13:21.877 14585-14585/com.example.testing.shopper W/System.err:  at com.google.firebase.database.DatabaseReference.zza(Unknown Source) 
06-07 14:13:21.877 14585-14585/com.example.testing.shopper W/System.err:  at com.google.firebase.database.DatabaseReference.updateChildren(Unknown Source) 
06-07 14:13:21.878 14585-14585/com.example.testing.shopper W/System.err:  at com.aihsoftware.shopper.CurrentInventoryFragment.done(CurrentInventoryFragment.java:288) 
06-07 14:13:21.878 14585-14585/com.example.testing.shopper W/System.err:  at com.aihsoftware.shopper.DialogFragments.AddItemToInventoryDialogFragment$2.onClick(AddItemToInventoryDialogFragment.java:145) 
06-07 14:13:21.878 14585-14585/com.example.testing.shopper W/System.err:  at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:157) 
06-07 14:13:21.878 14585-14585/com.example.testing.shopper W/System.err:  at android.os.Handler.dispatchMessage(Handler.java:110) 
06-07 14:13:21.878 14585-14585/com.example.testing.shopper W/System.err:  at android.os.Looper.loop(Looper.java:193) 
06-07 14:13:21.878 14585-14585/com.example.testing.shopper W/System.err:  rr:  at java.lang.reflect.Method.invoke(Method.java:515) 
06-07 14:13:21.894 14585-14585/com.example.testing.shopper W/System.err: ... 557 more 
06-07 14:13:21.895 14585-14585/com.example.testing.shopper W/System.err: Caused by: java.lang.StackOverflowError 
06-07 14:13:21.906 14585-14585/com.example.testing.shopper W/System.err:  at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:163) 
06-07 14:13:21.906 14585-14585/com.example.testing.shopper W/System.err:  at java.lang.StringBuilder.append(StringBuilder.java:311) 
06-07 14:13:21.906 14585-14585/com.example.testing.shopper W/System.err:  at android.net.Uri.encode(Uri.java:1864) 
06-07 14:13:21.906 14585-14585/com.example.testing.shopper W/System.err:  at android.net.Uri$PathPart.getEncoded(Uri.java:2112) 
06-07 14:13:21.906 14585-14585/com.example.testing.shopper W/System.err:  at android.net.Uri$HierarchicalUri.appendSspTo(Uri.java:1216) 
06-07 14:13:21.906 14585-14585/com.example.testing.shopper W/System.err:  at android.net.Uri$HierarchicalUri.makeSchemeSpecificPart(Uri.java:1205) 
06-07 14:13:21.906 14585-14585/com.example.testing.shopper W/System.err:  at android.net.Uri$HierarchicalUri.getSsp(Uri.java:1188) 
06-07 14:13:21.906 14585-14585/com.example.testing.shopper W/System.err:  at android.net.Uri$HierarchicalUri.getSchemeSpecificPart(Uri.java:1197) 
06-07 14:13:21.906 14585-14585/com.example.testing.shopper W/System.err: ... 559 more 
06-07 14:13:21.906 14585-14585/com.example.testing.shopper W/dalvikvm: threadid=1: calling UncaughtExceptionHandler 

enfin un tas de ceci en rouge

06-07 14:13:21.927 14585-14585/com.example.testing.shopper E/AndroidRuntime: FATAL EXCEPTION: main 
                     Process: com.example.testing.shopper, PID: 14585 
                     java.lang.RuntimeException: java.lang.reflect.InvocationTargetException 
                      at com.google.android.gms.internal.zzbqi$zza.zzaF(Unknown Source) 
                      at com.google.android.gms.internal.zzbqi.zzax(Unknown Source) 
                      at com.google.android.gms.internal.zzbqi.zzaE(Unknown Source) 
                      at com.google.android.gms.internal.zzbqi$zza.zzaF(Unknown Source) 
                      at com.google.android.gms.internal.zzbqi.zzax(Unknown Source) 

Merci à l'avance tout le monde

EDIT: fait creuser un peu plus et la cible d'invocation est une enveloppe autour de l'erreur stackoverflow. oublié de signaler cela. Cela signifie qu'il y a un problème avec les URI et le stringbuilder. base de données firebase .updateChildren() ne fonctionne pas avec les URI

+0

Votre InventoryItem est probablement pas une valeur autorisée à Firebase. Vous pouvez uniquement mettre Chaîne, Long, Double, Booléen, Carte et Liste dans les valeurs Firebase (voir: firebase.google.com/docs/database/android/read-and-write) Conseil: Vous pouvez utilisez auto-value-firebase pour vous convertir facilement pojo Java: s en Firebase valeur – Peter

Répondre

0

J'ai trouvé un problème. Im heureux cela fonctionne mais pas que je ne sais toujours pas pourquoi l'erreur de stackoverflow se produit. J'ai changé le updateChildren() pour pointer vers chaque membre de données de l'objet au lieu de l'objet lui-même. Cela a fonctionné mais il y avait d'abord une erreur qui lors de la mise à jour d'un article plus d'une fois conduit à un autre arbre. Par exemple, j'ai catégorie: { article: { prix: 1 quantité : 1 } } et il en résulterait catégorie: { catégorie: { prix: 2 (mise à jour) quantité: 2 (mise à jour) } article: { prix: 1 quantité : 1 }} Cela ne cesse de répéter autant de mises à jour au besoin, et je crois que la question est là est venu. Cependant, je ne peux pas comprendre quelle est l'erreur dans mon code. J'utilise toujours updateChildren() comme meilleure pratique. Tout ce que je peux penser est ces lignes sont le problème causant de multiples subcategories.I placé la catégorie dans ces deux variations que

databaseUpdate.put(updatedItem.getName(), updatedItem); 
    inventoryDatabaseReference=inventoryDatabaseReference.child(updatedItem.getCategory()); 

C'est ce qui a fonctionné

databaseUpdate.put(updatedItem.getCategory()+"/"+updatedItem.getName()+"/price",price); 
     databaseUpdate.put(updatedItem.getCategory()+"/"+updatedItem.getName()+"/quantity",quantity); 
     databaseUpdate.put(updatedItem.getCategory()+"/"+updatedItem.getName()+"/unitName",unitType); 
inventoryDatabaseReference.updateChildren(databaseUpdate) 
+0

Vérifiez mon commentaire ci-dessus – Peter