DatabaseException: can't convert object of java.Lang.String to type












0














I'm trying to retrieve data from my Firebase Realtime Database but encountering this issue.



I'm suspecting I got this error due to my path in DatabaseReference. I tried different paths but none seemed to work.



Here's my database (The generated texts are userID)



enter image description here



My class that stores the data structure



public class ERDataStructure {
private String temperature;
private String humidity;

public ERDataStructure() {

}
public ERDataStructure(String temperature, String humidity) {
this.temperature = temperature;
this.humidity = humidity;
}

public String getTemperature(){

return temperature;
}
public void setTemperature(String temperature){

this.temperature = temperature;
}

public String getHumidity() {

return humidity;
}
public void setHumidity(String humidity) {

this.humidity = humidity;
}
}


My ReadingScreen.java (MainActivity)



import ...


public class ReadingScreen extends AppCompatActivity {

//Firebase Initialization
FirebaseAuth mAuth;
FirebaseAuth.AuthStateListener mAuthListener;
private DatabaseReference myRef;
private FirebaseDatabase mFirebaseDatabase;

private static final String TAG = "ReadingScreen";
ERDataStructure mData;
private TextView textViewTemperatureNumber, textViewHumidityNumber;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_reading_screen);
//Find Views
textViewHumidityNumber = (TextView) findViewById(R.id.humidity_number);
textViewTemperatureNumber = (TextView) findViewById(R.id.temperature_number);
// Initiate Firebase
mAuth = FirebaseAuth.getInstance();
mFirebaseDatabase = FirebaseDatabase.getInstance();
FirebaseUser user = mAuth.getCurrentUser();
String userID = user.getUid();

// Non-working Reference, but code works
//myRef = mFirebaseDatabase.getReference();
//myRef = mFirebaseDatabase.getReference().child(userID);

//Crashing Reference
myRef = mFirebaseDatabase.getReference().child(userID).child("ERDataStructure");
//myRef = mFirebaseDatabase.getReference("ERDataStructure");
//
retrieveData();
}
public void gotoMainMenu (View view)
{
Intent intent = new Intent(ReadingScreen.this, MainMenu.class);
startActivity(intent);
}
private void retrieveData(){
myRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
ERDataStructure ds = dataSnapshot.getValue(ERDataStructure.class);
textViewTemperatureNumber.setText("" +ds.getTemperature());
textViewHumidityNumber.setText(""+ds.getHumidity());

}

@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
ERDataStructure ds = dataSnapshot.getValue(ERDataStructure.class);
textViewTemperatureNumber.setText("" +ds.getTemperature());
textViewHumidityNumber.setText(""+ds.getHumidity());
}

@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

}

@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

}

@Override
public void onCancelled(@NonNull DatabaseError databaseError) {

}
});
myRef.addValueEventListener(new ValueEventListener() {

@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
List<ERDataStructure> arraylist = new ArrayList<ERDataStructure>();
if (dataSnapshot != null && dataSnapshot.getValue() != null){
//FirebaseUser user = mAuth.getCurrentUser();
//String userID = user.getUid();
for (DataSnapshot a : dataSnapshot.getChildren()){

ERDataStructure dataStructure = new ERDataStructure();
dataStructure.setTemperature(a.getValue(ERDataStructure.class).getTemperature());
dataStructure.setHumidity(a.getValue(ERDataStructure.class).getHumidity());
arraylist.add(dataStructure);
}
}
}

@Override
public void onCancelled(@NonNull DatabaseError databaseError) {

}
});
}
}


The error was recorded in



ERDataStructure ds = dataSnapshot.getValue(ERDataStructure.class);


Edit: After adding another level to my database, it manages to run



enter image description here










share|improve this question





























    0














    I'm trying to retrieve data from my Firebase Realtime Database but encountering this issue.



    I'm suspecting I got this error due to my path in DatabaseReference. I tried different paths but none seemed to work.



    Here's my database (The generated texts are userID)



    enter image description here



    My class that stores the data structure



    public class ERDataStructure {
    private String temperature;
    private String humidity;

    public ERDataStructure() {

    }
    public ERDataStructure(String temperature, String humidity) {
    this.temperature = temperature;
    this.humidity = humidity;
    }

    public String getTemperature(){

    return temperature;
    }
    public void setTemperature(String temperature){

    this.temperature = temperature;
    }

    public String getHumidity() {

    return humidity;
    }
    public void setHumidity(String humidity) {

    this.humidity = humidity;
    }
    }


    My ReadingScreen.java (MainActivity)



    import ...


    public class ReadingScreen extends AppCompatActivity {

    //Firebase Initialization
    FirebaseAuth mAuth;
    FirebaseAuth.AuthStateListener mAuthListener;
    private DatabaseReference myRef;
    private FirebaseDatabase mFirebaseDatabase;

    private static final String TAG = "ReadingScreen";
    ERDataStructure mData;
    private TextView textViewTemperatureNumber, textViewHumidityNumber;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_reading_screen);
    //Find Views
    textViewHumidityNumber = (TextView) findViewById(R.id.humidity_number);
    textViewTemperatureNumber = (TextView) findViewById(R.id.temperature_number);
    // Initiate Firebase
    mAuth = FirebaseAuth.getInstance();
    mFirebaseDatabase = FirebaseDatabase.getInstance();
    FirebaseUser user = mAuth.getCurrentUser();
    String userID = user.getUid();

    // Non-working Reference, but code works
    //myRef = mFirebaseDatabase.getReference();
    //myRef = mFirebaseDatabase.getReference().child(userID);

    //Crashing Reference
    myRef = mFirebaseDatabase.getReference().child(userID).child("ERDataStructure");
    //myRef = mFirebaseDatabase.getReference("ERDataStructure");
    //
    retrieveData();
    }
    public void gotoMainMenu (View view)
    {
    Intent intent = new Intent(ReadingScreen.this, MainMenu.class);
    startActivity(intent);
    }
    private void retrieveData(){
    myRef.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
    ERDataStructure ds = dataSnapshot.getValue(ERDataStructure.class);
    textViewTemperatureNumber.setText("" +ds.getTemperature());
    textViewHumidityNumber.setText(""+ds.getHumidity());

    }

    @Override
    public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
    ERDataStructure ds = dataSnapshot.getValue(ERDataStructure.class);
    textViewTemperatureNumber.setText("" +ds.getTemperature());
    textViewHumidityNumber.setText(""+ds.getHumidity());
    }

    @Override
    public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

    }

    @Override
    public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
    });
    myRef.addValueEventListener(new ValueEventListener() {

    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
    List<ERDataStructure> arraylist = new ArrayList<ERDataStructure>();
    if (dataSnapshot != null && dataSnapshot.getValue() != null){
    //FirebaseUser user = mAuth.getCurrentUser();
    //String userID = user.getUid();
    for (DataSnapshot a : dataSnapshot.getChildren()){

    ERDataStructure dataStructure = new ERDataStructure();
    dataStructure.setTemperature(a.getValue(ERDataStructure.class).getTemperature());
    dataStructure.setHumidity(a.getValue(ERDataStructure.class).getHumidity());
    arraylist.add(dataStructure);
    }
    }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
    });
    }
    }


    The error was recorded in



    ERDataStructure ds = dataSnapshot.getValue(ERDataStructure.class);


    Edit: After adding another level to my database, it manages to run



    enter image description here










    share|improve this question



























      0












      0








      0







      I'm trying to retrieve data from my Firebase Realtime Database but encountering this issue.



      I'm suspecting I got this error due to my path in DatabaseReference. I tried different paths but none seemed to work.



      Here's my database (The generated texts are userID)



      enter image description here



      My class that stores the data structure



      public class ERDataStructure {
      private String temperature;
      private String humidity;

      public ERDataStructure() {

      }
      public ERDataStructure(String temperature, String humidity) {
      this.temperature = temperature;
      this.humidity = humidity;
      }

      public String getTemperature(){

      return temperature;
      }
      public void setTemperature(String temperature){

      this.temperature = temperature;
      }

      public String getHumidity() {

      return humidity;
      }
      public void setHumidity(String humidity) {

      this.humidity = humidity;
      }
      }


      My ReadingScreen.java (MainActivity)



      import ...


      public class ReadingScreen extends AppCompatActivity {

      //Firebase Initialization
      FirebaseAuth mAuth;
      FirebaseAuth.AuthStateListener mAuthListener;
      private DatabaseReference myRef;
      private FirebaseDatabase mFirebaseDatabase;

      private static final String TAG = "ReadingScreen";
      ERDataStructure mData;
      private TextView textViewTemperatureNumber, textViewHumidityNumber;

      @Override
      protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_reading_screen);
      //Find Views
      textViewHumidityNumber = (TextView) findViewById(R.id.humidity_number);
      textViewTemperatureNumber = (TextView) findViewById(R.id.temperature_number);
      // Initiate Firebase
      mAuth = FirebaseAuth.getInstance();
      mFirebaseDatabase = FirebaseDatabase.getInstance();
      FirebaseUser user = mAuth.getCurrentUser();
      String userID = user.getUid();

      // Non-working Reference, but code works
      //myRef = mFirebaseDatabase.getReference();
      //myRef = mFirebaseDatabase.getReference().child(userID);

      //Crashing Reference
      myRef = mFirebaseDatabase.getReference().child(userID).child("ERDataStructure");
      //myRef = mFirebaseDatabase.getReference("ERDataStructure");
      //
      retrieveData();
      }
      public void gotoMainMenu (View view)
      {
      Intent intent = new Intent(ReadingScreen.this, MainMenu.class);
      startActivity(intent);
      }
      private void retrieveData(){
      myRef.addChildEventListener(new ChildEventListener() {
      @Override
      public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
      ERDataStructure ds = dataSnapshot.getValue(ERDataStructure.class);
      textViewTemperatureNumber.setText("" +ds.getTemperature());
      textViewHumidityNumber.setText(""+ds.getHumidity());

      }

      @Override
      public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
      ERDataStructure ds = dataSnapshot.getValue(ERDataStructure.class);
      textViewTemperatureNumber.setText("" +ds.getTemperature());
      textViewHumidityNumber.setText(""+ds.getHumidity());
      }

      @Override
      public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

      }

      @Override
      public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

      }

      @Override
      public void onCancelled(@NonNull DatabaseError databaseError) {

      }
      });
      myRef.addValueEventListener(new ValueEventListener() {

      @Override
      public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
      List<ERDataStructure> arraylist = new ArrayList<ERDataStructure>();
      if (dataSnapshot != null && dataSnapshot.getValue() != null){
      //FirebaseUser user = mAuth.getCurrentUser();
      //String userID = user.getUid();
      for (DataSnapshot a : dataSnapshot.getChildren()){

      ERDataStructure dataStructure = new ERDataStructure();
      dataStructure.setTemperature(a.getValue(ERDataStructure.class).getTemperature());
      dataStructure.setHumidity(a.getValue(ERDataStructure.class).getHumidity());
      arraylist.add(dataStructure);
      }
      }
      }

      @Override
      public void onCancelled(@NonNull DatabaseError databaseError) {

      }
      });
      }
      }


      The error was recorded in



      ERDataStructure ds = dataSnapshot.getValue(ERDataStructure.class);


      Edit: After adding another level to my database, it manages to run



      enter image description here










      share|improve this question















      I'm trying to retrieve data from my Firebase Realtime Database but encountering this issue.



      I'm suspecting I got this error due to my path in DatabaseReference. I tried different paths but none seemed to work.



      Here's my database (The generated texts are userID)



      enter image description here



      My class that stores the data structure



      public class ERDataStructure {
      private String temperature;
      private String humidity;

      public ERDataStructure() {

      }
      public ERDataStructure(String temperature, String humidity) {
      this.temperature = temperature;
      this.humidity = humidity;
      }

      public String getTemperature(){

      return temperature;
      }
      public void setTemperature(String temperature){

      this.temperature = temperature;
      }

      public String getHumidity() {

      return humidity;
      }
      public void setHumidity(String humidity) {

      this.humidity = humidity;
      }
      }


      My ReadingScreen.java (MainActivity)



      import ...


      public class ReadingScreen extends AppCompatActivity {

      //Firebase Initialization
      FirebaseAuth mAuth;
      FirebaseAuth.AuthStateListener mAuthListener;
      private DatabaseReference myRef;
      private FirebaseDatabase mFirebaseDatabase;

      private static final String TAG = "ReadingScreen";
      ERDataStructure mData;
      private TextView textViewTemperatureNumber, textViewHumidityNumber;

      @Override
      protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_reading_screen);
      //Find Views
      textViewHumidityNumber = (TextView) findViewById(R.id.humidity_number);
      textViewTemperatureNumber = (TextView) findViewById(R.id.temperature_number);
      // Initiate Firebase
      mAuth = FirebaseAuth.getInstance();
      mFirebaseDatabase = FirebaseDatabase.getInstance();
      FirebaseUser user = mAuth.getCurrentUser();
      String userID = user.getUid();

      // Non-working Reference, but code works
      //myRef = mFirebaseDatabase.getReference();
      //myRef = mFirebaseDatabase.getReference().child(userID);

      //Crashing Reference
      myRef = mFirebaseDatabase.getReference().child(userID).child("ERDataStructure");
      //myRef = mFirebaseDatabase.getReference("ERDataStructure");
      //
      retrieveData();
      }
      public void gotoMainMenu (View view)
      {
      Intent intent = new Intent(ReadingScreen.this, MainMenu.class);
      startActivity(intent);
      }
      private void retrieveData(){
      myRef.addChildEventListener(new ChildEventListener() {
      @Override
      public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
      ERDataStructure ds = dataSnapshot.getValue(ERDataStructure.class);
      textViewTemperatureNumber.setText("" +ds.getTemperature());
      textViewHumidityNumber.setText(""+ds.getHumidity());

      }

      @Override
      public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
      ERDataStructure ds = dataSnapshot.getValue(ERDataStructure.class);
      textViewTemperatureNumber.setText("" +ds.getTemperature());
      textViewHumidityNumber.setText(""+ds.getHumidity());
      }

      @Override
      public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

      }

      @Override
      public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

      }

      @Override
      public void onCancelled(@NonNull DatabaseError databaseError) {

      }
      });
      myRef.addValueEventListener(new ValueEventListener() {

      @Override
      public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
      List<ERDataStructure> arraylist = new ArrayList<ERDataStructure>();
      if (dataSnapshot != null && dataSnapshot.getValue() != null){
      //FirebaseUser user = mAuth.getCurrentUser();
      //String userID = user.getUid();
      for (DataSnapshot a : dataSnapshot.getChildren()){

      ERDataStructure dataStructure = new ERDataStructure();
      dataStructure.setTemperature(a.getValue(ERDataStructure.class).getTemperature());
      dataStructure.setHumidity(a.getValue(ERDataStructure.class).getHumidity());
      arraylist.add(dataStructure);
      }
      }
      }

      @Override
      public void onCancelled(@NonNull DatabaseError databaseError) {

      }
      });
      }
      }


      The error was recorded in



      ERDataStructure ds = dataSnapshot.getValue(ERDataStructure.class);


      Edit: After adding another level to my database, it manages to run



      enter image description here







      java android firebase firebase-realtime-database






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Nov 23 at 17:36

























      asked Nov 22 at 18:04









      Duc Nguyen

      327




      327
























          1 Answer
          1






          active

          oldest

          votes


















          1














          You need to use ValueEventListener instead of ChildEventListener, so change it to this:



          myRef = mFirebaseDatabase.getReference().child(userID).child("ERDataStructure");

          myRef.addValueEventListener(new ValueEventListener() {
          @Override
          public void onDataChange(DataSnapshot dataSnapshot) {
          ERDataStructure ds = dataSnapshot.getValue(ERDataStructure.class);
          }
          @Override
          public void onCancelled(DatabaseError databaseError) {
          }
          });


          In this case you use ValueEventListener, because when you use childEventListener you are basically looping inside this snapshot and returning the value of humidity as type String. It is like looping over dataSnapshot.getChildren() in the valueventlistener.






          share|improve this answer





















            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            autoActivateHeartbeat: false,
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














            draft saved

            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53436235%2fdatabaseexception-cant-convert-object-of-java-lang-string-to-type%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown

























            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes









            1














            You need to use ValueEventListener instead of ChildEventListener, so change it to this:



            myRef = mFirebaseDatabase.getReference().child(userID).child("ERDataStructure");

            myRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
            ERDataStructure ds = dataSnapshot.getValue(ERDataStructure.class);
            }
            @Override
            public void onCancelled(DatabaseError databaseError) {
            }
            });


            In this case you use ValueEventListener, because when you use childEventListener you are basically looping inside this snapshot and returning the value of humidity as type String. It is like looping over dataSnapshot.getChildren() in the valueventlistener.






            share|improve this answer


























              1














              You need to use ValueEventListener instead of ChildEventListener, so change it to this:



              myRef = mFirebaseDatabase.getReference().child(userID).child("ERDataStructure");

              myRef.addValueEventListener(new ValueEventListener() {
              @Override
              public void onDataChange(DataSnapshot dataSnapshot) {
              ERDataStructure ds = dataSnapshot.getValue(ERDataStructure.class);
              }
              @Override
              public void onCancelled(DatabaseError databaseError) {
              }
              });


              In this case you use ValueEventListener, because when you use childEventListener you are basically looping inside this snapshot and returning the value of humidity as type String. It is like looping over dataSnapshot.getChildren() in the valueventlistener.






              share|improve this answer
























                1












                1








                1






                You need to use ValueEventListener instead of ChildEventListener, so change it to this:



                myRef = mFirebaseDatabase.getReference().child(userID).child("ERDataStructure");

                myRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                ERDataStructure ds = dataSnapshot.getValue(ERDataStructure.class);
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {
                }
                });


                In this case you use ValueEventListener, because when you use childEventListener you are basically looping inside this snapshot and returning the value of humidity as type String. It is like looping over dataSnapshot.getChildren() in the valueventlistener.






                share|improve this answer












                You need to use ValueEventListener instead of ChildEventListener, so change it to this:



                myRef = mFirebaseDatabase.getReference().child(userID).child("ERDataStructure");

                myRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                ERDataStructure ds = dataSnapshot.getValue(ERDataStructure.class);
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {
                }
                });


                In this case you use ValueEventListener, because when you use childEventListener you are basically looping inside this snapshot and returning the value of humidity as type String. It is like looping over dataSnapshot.getChildren() in the valueventlistener.







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 22 at 18:16









                Peter Haddad

                20.3k84056




                20.3k84056






























                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Stack Overflow!


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.





                    Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


                    Please pay close attention to the following guidance:


                    • Please be sure to answer the question. Provide details and share your research!

                    But avoid



                    • Asking for help, clarification, or responding to other answers.

                    • Making statements based on opinion; back them up with references or personal experience.


                    To learn more, see our tips on writing great answers.




                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53436235%2fdatabaseexception-cant-convert-object-of-java-lang-string-to-type%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest















                    Required, but never shown





















































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown

































                    Required, but never shown














                    Required, but never shown












                    Required, but never shown







                    Required, but never shown







                    Popular posts from this blog

                    What visual should I use to simply compare current year value vs last year in Power BI desktop

                    Alexandru Averescu

                    Trompette piccolo