Error fetching SQLite ID from Spinner

1

Book object

public class Livros {
private int id;
private String nome;

public Livros() {}

public Livros (int id, String nome) {
    this.id = id;
    this.nome = nome;
}
public int getId () {
    return id;
}
public int setId (int id) {
    return id;
}
public int getNome () {
    return nome;
}
public int setNome (String nome) {
    return nome;
}

openHelper class

public List<Livros> buscarLivros() {
    SQLiteDatabase sqLiteDatabase = getReadableDatabase();

    List<Livros> listLivros = new ArrayList<>();
    Cursor cursor = sqLiteDatabase.rawQuery(ConsultasSQL.getRegistrosTabLivros(), null);

    if (cursor.moveToFirst()) {
        do {
            Livros livros = new Livros();
            livros.setId(cursor.getInt(0));
            livros.setNome(cursor.getString(1));

            listLivros.add(livro);
        } while (cursor.moveToNext());

    }
    sqLiteDatabase.close();
    return listLivros;
}

Main

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    dataBase baseDeDados = new dataBase(this);
    SQLiteDatabase connection = baseDeDados.getWritableDatabase();

    Spinner spnLivros = (Spinner) findViewById(R.id.spinnerLivros);

    ArrayList<Livros> arrayLivros = (ArrayList<Livros>) baseDeDados.buscarLivros();

    ArrayAdapter<String> adpLivros = new ArrayAdapter<String>(this, android.R.layout.simple_spinner_item);
    adpLivros .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spnLivros.setAdapter(adpLivros);

    for (Livros livros : arrayLivros) {
        adpLivros.add(livros.toString());
    }
}

Spinner select method

public onItemSelected (AdapterView<?> parent, View view, int p, long id) {
    Livros livros = (Livros) parent.getSelectedItem();
    String buscaIdNome = "ID:" + livros.getId() + "Nome:" + livros.getNome();
    Log.i("TESTE:", buscaIdNome);
}

Error:

java.lang.ClassCastException: java.lang.String cannot be cast to com.example.Livro

Before posting this question I checked numerous sites, including this one, but none of them found the solution to my problem.

    
asked by anonymous 14.09.2016 / 00:21

1 answer

0

Your Adapter manages objects of type String , it is declared as ArrayAdapter<String> .

So when you do

Livros livros = (Livros) parent.getSelectedItem();

You are trying to convert an object of type String into Books , hence the error:

  

java.lang.ClassCastException: java.lang.String can not be cast to com.example.Library

For the parent.getSelectedItem() method to return Books , the Adapter should be declared as ArrayAdapter<Livros> and the array that it manages to be of type ArrayList<Livros> . This array should be passed to the constructor when creating the ArrayAdapter .

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ....
    ....    
    ArrayList<Livros> arrayLivros = (ArrayList<Livros>) baseDeDados.buscarLivros();

    ArrayAdapter<Livros> adpLivros = 
        new ArrayAdapter<Livros>(this, android.R.layout.simple_spinner_item, arrayLivros);

    adpLivros.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spnLivros.setAdapter(adpLivros);

    //Não é necessário, foi passado o array com os livros ao Adapter
    //for (Livros livros : arrayLivros) {
    //    adpLivros.add(livros.toString());
    //}
}

ArrayAdapter uses the toString() method of the class referred to in the Array to get the value of each Spinner item >. Therefore, the Books class must override this method to return this value.

Add to Books class:

@Override
public String toString()
{
    return nome;
}

Now that Adapt manages objects of type Books , it is now possible to cast the object returned by parent.getSelectedItem() to Books .

Note:

The Book class should be called Book, since it is a book that it represents and not a set /     

14.09.2016 / 17:12