Autore Topic: Problema con DataBase  (Letto 1034 volte)

Offline pdinox

  • Utente junior
  • **
  • Post: 51
  • Respect: 0
    • paoletto987
    • pdinox
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Play Store ID:
    Paolo Di Nocera
  • Sistema operativo:
    windows 8 and Maveriks
Problema con DataBase
« il: 31 Dicembre 2013, 13:30:00 CET »
0
Ragazzi ho completato un DB e lo volevo provare. Ma non va! Il progetto è semplice, proprio perché volevo prima provarlo e poi adattarlo al mio uso! Avviandolo sul cellulare Nexus 4 si blocca prima si aprirsi, fa lo stesso anche sull'emulatore.
Riuscite a trovare il problema? Ci sto impazzendo  arghhhhh :-\

Questa è la classe DBHelper:

Codice (Java): [Seleziona]
package com.example.provadb;

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

public class DBHelper extends SQLiteOpenHelper {
       

       
        //Nome del DB
        public static final String NOME_DB = "contatore_db";

        //Versione del DB
        public static final int VERSIONE_DB = 1;
       
        //Stringa per creare la tabella
        private static final String CREARE_TABELLA_CONTATORE = Contatore.STEP + "TEXT" + Contatore.VOLTE + "TEXT";
       
        //Costruttore dell'Helper
        public DBHelper(Context context) {
       
                super(context, NOME_DB, null, VERSIONE_DB);
       
    }
       


        //Creiamo il DB se non esiste
        @Override
        public void onCreate(SQLiteDatabase db)
        {
               
                db.execSQL(CREARE_TABELLA_CONTATORE);
               
        }
       
        //Aggiorniamo il database se il numero della versione è maggiore del vecchio
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion )
        {
               
                db.execSQL("DROP TABLE IF EXISTS" + Contatore.TABELLA);
                onCreate(db);
               
        }
       
}

Classe Contatore:

Codice (Java): [Seleziona]
package com.example.provadb;

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

public class Contatore {
       
        //Campi della tabella libri
        public static final String ID = "_id";
        public static final String STEP = "step";
        public static final String VOLTE = "volte";
       
        public static final String TABELLA = "contatore";
       
        //le colonne
        public static final String[] COLONNE = new String[]{ID, STEP, VOLTE};
       
        //inseriamo un nuovo valore nel db
        public static void insertContatore(SQLiteDatabase db, int step, int volte)
        {
               
                ContentValues v = new ContentValues();
                v.put(STEP, step);
                v.put(VOLTE, volte);
       
                db.insert(TABELLA, null, v);
        }
       
        //questa funziona ritorna un cursore che punta a tutti i valori nella tabella
        public static Cursor getAllContatori(SQLiteDatabase db)
        {
               
                return db.query(TABELLA, COLONNE, null, null, null, null, null);
               
        }
       
        //cancella il valore del contatore che ha l'ID passato come parametro
        public static boolean deleteContatore(SQLiteDatabase db, long id)
        {
               
                return db.delete(TABELLA, ID + "=" + id, null) > 0;
               
        }
       
        //punta al contatore che ha lìID passato come parametro
        public static Cursor getContatore(SQLiteDatabase db, long id) throws SQLException
        {
               
                Cursor c = db.query(true, TABELLA, COLONNE,  ID + "=" + id, null, null, null, null, null);
               
                                if (c!=null)
                                {
                                        c.moveToFirst();
                                }
                return c;
        }
       
        public static boolean updateContatore (SQLiteDatabase db, long id, int step, int volte )
        {
               
                ContentValues v = new ContentValues();
                v.put(STEP, step);
                v.put(VOLTE, volte);
               
                return db.update(TABELLA, v, ID + "=" + id, null) > 0;
               
        }

}

Infine l'activity principale prova:

Codice (Java): [Seleziona]
package com.example.provadb;

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.EditText;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class prova extends Activity {
       

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_prova);
               
                final EditText step_ = (EditText) findViewById(R.id.edit_step);
                final EditText volte_ = (EditText) findViewById(R.id.edit_volte);
               
                int step_var = Integer.valueOf(step_.getText().toString());
                int volte_var = Integer.valueOf(volte_.getText().toString());
               
                //creo l'helper per aprire il database
                DBHelper databaseHelper = new DBHelper(this);
               
                //apro il database sia in lettura che in scrittura
                SQLiteDatabase db = databaseHelper.getWritableDatabase();
               
                //riempio il database che un po' di dati
                Contatore.insertContatore(db, 10, 100);
                Contatore.insertContatore(db, step_var, volte_var);
               
                //System.err.println("Inseriti 2 valori");
               
                //Assegno ad un cirsore tutti i libri trovati all'interno del db
                Cursor c = Contatore.getAllContatori(db);
               
                try
                {
                       
                        //System.err.println("Elenco libri:");
            stampaAll(c);
           
            //System.err.println("Cancello libro con id 1");
            Contatore.deleteContatore(db, 1);
 
            c = Contatore.getAllContatori(db);
            //System.err.println("Elenco libri, deve mancare id 1:");
            stampaAll(c);
 
            //System.err.println("Modifico libro con id 2, metto prezzo a 23");
            Contatore.updateContatore(db, 2, 23, 24);
 
            c = Contatore.getAllContatori(db);
            //System.err.println("Elenco libri, il prezzo di id 2 deve essere 23:");
            stampaAll(c);
                }
                finally
                {
                       
                        //chiudo il cursore e il database
                        c.close();
                        db.close();
                        //System.err.println("Ho chiuso il cursore e il db");
                       
                }
           
        }
       
        public void stampaAll(Cursor c){
        while (c.moveToNext())
        {
            //System.err.println("informaticoonline.it " + c.getLong(0) + " " +
                //c.getString(1) + " " + c.getString(2) + " " + c.getString(3));
        }
    }

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

}

questo è il LogCat:

12-31 07:29:14.421: I/Process(2657): Sending signal. PID: 2657 SIG: 9
12-31 07:29:17.561: D/AndroidRuntime(2696): Shutting down VM
12-31 07:29:17.561: W/dalvikvm(2696): threadid=1: thread exiting with uncaught exception (group=0x41465700)
12-31 07:29:17.571: E/AndroidRuntime(2696): FATAL EXCEPTION: main
12-31 07:29:17.571: E/AndroidRuntime(2696): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.provadb/com.example.provadb.prova}: java.lang.NumberFormatException: Invalid int: ""
12-31 07:29:17.571: E/AndroidRuntime(2696):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
12-31 07:29:17.571: E/AndroidRuntime(2696):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
12-31 07:29:17.571: E/AndroidRuntime(2696):    at android.app.ActivityThread.access$600(ActivityThread.java:141)
12-31 07:29:17.571: E/AndroidRuntime(2696):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
12-31 07:29:17.571: E/AndroidRuntime(2696):    at android.os.Handler.dispatchMessage(Handler.java:99)
12-31 07:29:17.571: E/AndroidRuntime(2696):    at android.os.Looper.loop(Looper.java:137)
12-31 07:29:17.571: E/AndroidRuntime(2696):    at android.app.ActivityThread.main(ActivityThread.java:5103)
12-31 07:29:17.571: E/AndroidRuntime(2696):    at java.lang.reflect.Method.invokeNative(Native Method)
12-31 07:29:17.571: E/AndroidRuntime(2696):    at java.lang.reflect.Method.invoke(Method.java:525)
12-31 07:29:17.571: E/AndroidRuntime(2696):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
12-31 07:29:17.571: E/AndroidRuntime(2696):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-31 07:29:17.571: E/AndroidRuntime(2696):    at dalvik.system.NativeStart.main(Native Method)
12-31 07:29:17.571: E/AndroidRuntime(2696): Caused by: java.lang.NumberFormatException: Invalid int: ""
12-31 07:29:17.571: E/AndroidRuntime(2696):    at java.lang.Integer.invalidInt(Integer.java:138)
12-31 07:29:17.571: E/AndroidRuntime(2696):    at java.lang.Integer.parseInt(Integer.java:359)
12-31 07:29:17.571: E/AndroidRuntime(2696):    at java.lang.Integer.parseInt(Integer.java:332)
12-31 07:29:17.571: E/AndroidRuntime(2696):    at java.lang.Integer.valueOf(Integer.java:490)
12-31 07:29:17.571: E/AndroidRuntime(2696):    at com.example.provadb.prova.onCreate(prova.java:23)
12-31 07:29:17.571: E/AndroidRuntime(2696):    at android.app.Activity.performCreate(Activity.java:5133)
12-31 07:29:17.571: E/AndroidRuntime(2696):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
12-31 07:29:17.571: E/AndroidRuntime(2696):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175)
12-31 07:29:17.571: E/AndroidRuntime(2696):    ... 11 more
« Ultima modifica: 31 Dicembre 2013, 13:51:09 CET da pdinox »
Pdinox

Offline eagledeveloper

  • Translate Team
  • Utente senior
  • ****
  • Post: 516
  • Respect: +37
    • Google+
    • 347516210
    • dark_pinz
    • @WandDStudios
    • Mostra profilo
    • W&D Studios
  • Dispositivo Android:
    HTC One X e HTC One
  • Play Store ID:
    W%26D+Studios
  • Sistema operativo:
    Ubuntu / Windows 7
Re:Problema con DataBase
« Risposta #1 il: 31 Dicembre 2013, 13:51:13 CET »
0
Il problema è qui:

Codice (Java): [Seleziona]
int step_var = Integer.valueOf(step_.getText().toString());
Il valore della EditText step_ è vuoto. Dovrei dargli un valore oppure andare a prendere quello valore solo quando è stato valoralizzato.
I numeri contano molto di più del seme.

Offline pdinox

  • Utente junior
  • **
  • Post: 51
  • Respect: 0
    • paoletto987
    • pdinox
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Play Store ID:
    Paolo Di Nocera
  • Sistema operativo:
    windows 8 and Maveriks
Re:Problema con DataBase
« Risposta #2 il: 31 Dicembre 2013, 14:23:18 CET »
0
grazie mille provo subito! :)

Post unito: 31 Dicembre 2013, 14:33:01 CET
non va :( ho provato così:

Codice (Java): [Seleziona]
final EditText step_ = (EditText) findViewById(R.id.edit_step);
                final EditText volte_ = (EditText) findViewById(R.id.edit_volte);

        if ((step_==null) && (volte_==null)){
        step_var = 3;
        volte_var = 3;
        }
        else{
                step_var = Integer.valueOf(step_.getText().toString());
                volte_var = Integer.valueOf(volte_.getText().toString());
        }
               

e poi ho provato assegnando direttamente i valori "int" da inserire nella tabella, ma nulla da fare...forse è da qualche altra parte qualche cavolo di errore!!! arghhhh :(
« Ultima modifica: 31 Dicembre 2013, 14:33:02 CET da pdinox, Reason: Merged DoublePost »
Pdinox

Offline aledpa

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
Re:Problema con il DB
« Risposta #3 il: 31 Dicembre 2013, 14:37:14 CET »
0
da una prima (e velocissima lettura) ho visto che nelle stringa di costruzione della query tra un campo e l'altro non hai messo la virgola e che tra nome del campo e il tipo non metti lo spazio:
private static final String CREARE_TABELLA_CONTATORE = Contatore.STEP + "TEXT" + Contatore.VOLTE + "TEXT";

prova con

private static final String CREARE_TABELLA_CONTATORE = "CREATE TABLE IF NOT EXISTS nome_tabella (Contatore.STEP + " TEXT," + Contatore.VOLTE + " TEXT)";
« Ultima modifica: 31 Dicembre 2013, 15:56:37 CET da aledpa »

Offline pdinox

  • Utente junior
  • **
  • Post: 51
  • Respect: 0
    • paoletto987
    • pdinox
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
  • Play Store ID:
    Paolo Di Nocera
  • Sistema operativo:
    windows 8 and Maveriks
Re:Problema con DataBase
« Risposta #4 il: 31 Dicembre 2013, 16:13:13 CET »
0
Ragazzi nemmeno va...e non riesco a capire l'errore...sembra che sia implementato tutto bene!  :'(

Post unito: 31 Dicembre 2013, 16:58:45 CET
Ragazzi provo a postarvi anche il manifest!

Codice (XML): [Seleziona]
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.provadb"
   android:versionCode="1"
   android:versionName="1.0" >

    <uses-sdk
       android:minSdkVersion="14"
       android:targetSdkVersion="18" />

    <application
       android:allowBackup="true"
       android:icon="@drawable/ic_launcher"
       android:label="@string/app_name"
       android:theme="@style/AppTheme" >
        <activity
           android:name="com.example.provadb.prova"
           android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name="com.example.provadb.Contatore"></activity>
    </application>

</manifest>
« Ultima modifica: 31 Dicembre 2013, 16:58:45 CET da pdinox, Reason: Merged DoublePost »
Pdinox

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Problema con DataBase
« Risposta #5 il: 31 Dicembre 2013, 17:38:23 CET »
0
Ragazzi nemmeno va...e non riesco a capire l'errore...sembra che sia implementato tutto bene!  :'(

Post unito: 31 Dicembre 2013, 16:58:45 CET
Ragazzi provo a postarvi anche il manifest!

Per avere maggiori speranze di ricevere risposta devi sempre postare il LogCat dell'errore.  ;-)
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline aledpa

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: 0
    • Mostra profilo
Re:Problema con DataBase
« Risposta #6 il: 31 Dicembre 2013, 17:40:15 CET »
0
un errore è dovuto al parsing da stringa a int!
prova a usare la funzione  Integer.parseInt() al posto di valueOf