Autore Topic: Errore lettura dati da DB  (Letto 291 volte)

Offline Mate13

  • Nuovo arrivato
  • *
  • Post: 16
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Sistema operativo:
    Mac OS X 10.11
Errore lettura dati da DB
« il: 31 Dicembre 2015, 20:01:38 CET »
0
Risalve a tutti,
mi trovo davanti ad un altro problema che è uscito dopo la compilazione dell'ultima activity.
Sto aggiungendo alla mia app scolastica un database per implementare un libretto elettronico che salvi i voti delle materie e mi calcoli le medie. Ho creato la classe Voto:
Codice (Java): [Seleziona]
package it.matmacsystem.scienzeapplicatemotta.libretto;

public class Voto {

    //Table

    public static final String TABLE = "Voti";


    //Table Colums

    public static final String KEY_ID="id";
    public static final String KEY_MATERIA="materia";
    public static final String KEY_DATAVOTO="data_voto";
    public static final String KEY_TIPOLOGIA="tipologia";
    public static final String KEY_VOTO="voto";

    public int voto_ID;
    public String materia;
    public String data_voto;
    public String tipologia;
    public int voto;
}

Ho fatto la classe DBHelper:
Codice (Java): [Seleziona]
package it.matmacsystem.scienzeapplicatemotta.libretto;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;


public class DBHelper extends SQLiteOpenHelper {

    //version number to upgrade database version
    private static final int DATABASE_VERSION = 1;

    //Database Name
    private static final String DATABASE_NAME = "libretto.db";

    public DBHelper (Context context) {
        super (context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate (SQLiteDatabase db) {
        String CREATE_TABLE_VOTI = "CREATE TABLE" + Voto.TABLE + "("
                + Voto.KEY_ID + " INTEGER PRIMARY KEY AUTOINCREMENT ,"
                + Voto.KEY_MATERIA + " TEXT, "
                + Voto.KEY_DATAVOTO + " TEXT, "
                + Voto.KEY_TIPOLOGIA + " TEXT, "
                + Voto.KEY_VOTO + " INTEGER )";
        db.execSQL(CREATE_TABLE_VOTI);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        db.execSQL("DROP TABLE IF EXISTS " + Voto.TABLE);

        onCreate(db);
    }
}

una classe VotoRepo con le funzioni necessarie ad ottenere i dati dal database:
Codice (Java): [Seleziona]
package it.matmacsystem.scienzeapplicatemotta.libretto;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import java.util.ArrayList;
import java.util.HashMap;


public class VotoRepo {

    private DBHelper dbHelper;

    public VotoRepo (Context context){
        dbHelper = new DBHelper(context);
    }

    //Inserimento nuovo voto secondo la materia selezionata
    public int insert (Voto voto){
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(Voto.KEY_MATERIA, voto.materia);
        values.put(Voto.KEY_DATAVOTO, voto.data_voto);
        values.put(Voto.KEY_TIPOLOGIA, voto.tipologia);
        values.put(Voto.KEY_VOTO, voto.voto);

        long voto_Id = db.insert(Voto.TABLE, null, values);
        db.close();
        return (int) voto_Id;
    }

    //Eliminazione voto
    public void delete(int voto_Id) {

        SQLiteDatabase db = dbHelper.getWritableDatabase();
        db.delete(Voto.TABLE, Voto.KEY_ID + "=" + voto_Id, null);
        db.close();
    }

    public void update(Voto voto) {

        SQLiteDatabase db = dbHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put(Voto.KEY_MATERIA, voto.materia);
        values.put(Voto.KEY_DATAVOTO, voto.data_voto);
        values.put(Voto.KEY_TIPOLOGIA, voto.tipologia);
        values.put(Voto.KEY_VOTO, voto.voto);

        db.update(Voto.TABLE, values, Voto.KEY_ID + "=" + voto.voto_ID, null);
        db.close();
    }


    public ArrayList getVotoByMateria(String materia) {

        SQLiteDatabase db = dbHelper.getReadableDatabase();

        String selectQuery = "SELECT " +
                Voto.KEY_ID + ", " +
                //Voto.KEY_MATERIA + ", " +
                Voto.KEY_DATAVOTO + ", " +
                Voto.KEY_TIPOLOGIA + ", " +
                Voto.KEY_VOTO +
                " FROM" +Voto.TABLE +
                " WHERE " + Voto.KEY_MATERIA + "=" + materia;

        ArrayList votiList = new ArrayList();

        Cursor cursor = db.rawQuery(selectQuery, null);

        if (cursor.moveToFirst()){
            do{
               votiList.add(cursor.getString(cursor.getColumnIndex(Voto.KEY_ID)) + "_" +
                    cursor.getString(cursor.getColumnIndex(Voto.KEY_DATAVOTO)) + "_" +
                    cursor.getString(cursor.getColumnIndex(Voto.KEY_TIPOLOGIA)) + "_" +
                    cursor.getString(cursor.getColumnIndex(Voto.KEY_VOTO)));
            } while (cursor.moveToNext());

        }

        cursor.close();
        db.close();
       return votiList;
    }

    //Ottenere lista voti specifica materia
    public ArrayList<HashMap<String, String>> getVotiListByMateria(String materia){

        SQLiteDatabase db = dbHelper.getReadableDatabase();
        String selectQuery = "SELECT " +
                Voto.KEY_ID + ", " +
                Voto.KEY_MATERIA + ", " +
                Voto.KEY_DATAVOTO + ", " +
                Voto.KEY_TIPOLOGIA + ", " +
                Voto.KEY_VOTO +
                " FROM" + Voto.TABLE +
                " WHERE " + Voto.KEY_MATERIA + "=" + materia;
        ArrayList<HashMap<String, String>> votiList = new ArrayList<HashMap<String, String>>();

    Cursor cursor = db.rawQuery(selectQuery, null);

    if(cursor.moveToFirst()){
        do{
            HashMap<String, String> voti = new HashMap<String, String>();
            voti.put("id", cursor.getString(cursor.getColumnIndex(Voto.KEY_ID)));
            voti.put("datavoto", cursor.getString(cursor.getColumnIndex(Voto.KEY_DATAVOTO)));
            voti.put("tipologia", cursor.getString(cursor.getColumnIndex(Voto.KEY_TIPOLOGIA)));
            voti.put("voto", cursor.getString(cursor.getColumnIndex(Voto.KEY_VOTO)));
            votiList.add(voti);
        } while (cursor.moveToNext());
    }
    cursor.close();



        db.close();

        return votiList;
    }

    //Ottenere un voto preciso in base all'id
    public Voto getVotoById(int Id){
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        String selectQuery =  "SELECT " +
                Voto.KEY_ID + ", " +
                Voto.KEY_MATERIA + ", " +
                Voto.KEY_DATAVOTO + ", " +
                Voto.KEY_TIPOLOGIA + ", " +
                Voto.KEY_VOTO +
                " FROM" +Voto.TABLE +
                " WHERE " + Voto.KEY_ID + "=" + Id;

        Voto voto = new Voto();

        Cursor cursor = db.rawQuery(selectQuery, null);

        if (cursor.moveToFirst()){
            do{
                voto.voto_ID = cursor.getInt(cursor.getColumnIndex(Voto.KEY_ID));
                voto.materia = cursor.getString(cursor.getColumnIndex(Voto.KEY_MATERIA));
                voto.data_voto = cursor.getString(cursor.getColumnIndex(Voto.KEY_DATAVOTO));
                voto.tipologia = cursor.getString(cursor.getColumnIndex(Voto.KEY_TIPOLOGIA));
                voto.voto = cursor.getInt(cursor.getColumnIndex(Voto.KEY_VOTO));

            } while (cursor.moveToNext());
        }

        cursor.close();
        db.close();

        return voto;
    }
}

Poi ho una ActivityMain che contiene una listview con materie da me decise (che serviranno poi a compilare automaticamente il campo "materia" nel database):
Codice (Java): [Seleziona]
package it.matmacsystem.scienzeapplicatemotta.activity;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import it.matmacsystem.scienzeapplicatemotta.R;
import it.matmacsystem.scienzeapplicatemotta.Messaggi;

public class LibrettoVoti extends ActionBarActivity {
    private Toolbar mToolbar;
    TextView materiaName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.libretto_voti);

        mToolbar = (Toolbar) findViewById(R.id.toolbar_libretto);

        setSupportActionBar(mToolbar);
        getSupportActionBar().setHomeButtonEnabled(true);



        ListView lista = (ListView) findViewById(R.id.libretto_materie);

        final String[] materie = {"Arte","Filosofia","Informatica","Matematica","Inglese","Italiano","Scienze","Storia","Educazione Fisica","Fisica"};

        String media_momentana = "N/D";

        String[] from = {"media","nome"};
        int[] to = {R.id.media_materia, R.id.nome_materia};

        final SimpleAdapter adapter;

        List<HashMap<String, String>> fillMaps = new ArrayList<HashMap<String, String>>();

        for (int i = 0; i < 10; i++){
            HashMap<String, String> map = new HashMap<String, String>();
            map.put("nome", materie[i]);
            map.put("media", media_momentana);
            fillMaps.add(map);
        }

        adapter = new SimpleAdapter(this, fillMaps, R.layout.libretto_materie_element, from, to);
        lista.setAdapter(adapter);

        lista.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                materiaName = (TextView)view.findViewById(R.id.nome_materia);
                String materia = materiaName.getText().toString();

                Intent selectedMateria = new Intent(getApplicationContext(),LibrettoMateria.class);
                selectedMateria.putExtra("nome_materia", materia);
                startActivity(selectedMateria);
            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_libretto_voti, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
       switch (id){
           case R.id.quit:
               finish();
               break;
           case R.id.action_settings_libretto:
               Messaggi messaggio = new Messaggi();
               messaggio.toastMessage(LibrettoVoti.this, "Nessun'impostazione disponibile per il momento");
               break;
       }

        return super.onOptionsItemSelected(item);
    }

}

E per finire l'activity che si apre mediante intent che fa crasciare l'app, è un errore dovuto al richiamo di getVotiListByMateria ma non riesco a capire il perché:
Codice (Java): [Seleziona]
package it.matmacsystem.scienzeapplicatemotta.activity;


import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.support.v7.widget.Toolbar;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.SimpleAdapter;

import java.util.ArrayList;
import java.util.HashMap;

import it.matmacsystem.scienzeapplicatemotta.R;
import it.matmacsystem.scienzeapplicatemotta.libretto.VotoRepo;


public class LibrettoMateria extends ActionBarActivity {
    private Toolbar mToolbar;
    String nome_materia;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.libretto_materia);

        mToolbar = (Toolbar) findViewById(R.id.toolbar_libretto);

        setSupportActionBar(mToolbar);
        getSupportActionBar().setHomeButtonEnabled(true);

        Intent materia = getIntent();
        nome_materia = materia.getStringExtra("nome_materia");

        ListView lista = (ListView) findViewById(R.id.libretto_voti_materia);

        VotoRepo repo = new VotoRepo(this);

        ArrayList<HashMap<String, String>> votiList = repo.getVotiListByMateria(nome_materia);

        ListAdapter adapter = new SimpleAdapter(getApplicationContext(), votiList, R.layout.libretto_materie_element,
                new String[] {"id", "datavoto", "tipologia", "voto"}, new int[] {R.id.id_voto, R.id.data_voto, R.id.tipologia_voto, R.id.voto_prova});
        lista.setAdapter(adapter);

    }
}

Scusate se ho postato così tanto codice ma non riesco a capire da quale parte venga generato l'errore. Spero che qualcuno mi possa aiutare
« Ultima modifica: 31 Dicembre 2015, 20:04:25 CET da Mate13 »

Offline maverik1408

  • Utente junior
  • **
  • Post: 99
  • Respect: +1
    • Mostra profilo
    • MaverikApps
  • Dispositivo Android:
    NEXUS 5
  • Play Store ID:
    Maverik
Re:Errore lettura dati da DB
« Risposta #1 il: 04 Gennaio 2016, 13:21:47 CET »
0
quale errore ti restituisce?? e dove?
Maverik @ Google Play Store