Autore Topic: Problema apertura database  (Letto 781 volte)

Offline sdullaz

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxy s2
  • Sistema operativo:
    windows 7
Problema apertura database
« il: 27 Agosto 2012, 12:04:51 CEST »
0
Salve,
sto implementando un servizio che automaticamente salva in un database la latitudine e la longitudine presi da un oggetto location. Vi posto il codice del servizio e della classe che estende il SQLiteHelper:

SERVIZIO:
Codice: [Seleziona]
[code=java]
import it.helloworld.tour.DatabaseGPS.MetaData;
import android.app.Service;
import android.content.ContentValues;
import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.os.IBinder;

public class Servizio extends Service {
       
        private String providerId = LocationManager.GPS_PROVIDER;
        private Location location;
        private LocationManager locationManager;
        private SQLiteDatabase db;
        private LocationListener listener = new LocationListener() {
                public void onStatusChanged(String provider, int status, Bundle extras) {
                     
                  }
                   public void onProviderEnabled(String provider) {
                 
                  }
                   public void onProviderDisabled(String provider) {
               
                  }
                   public void onLocationChanged(Location location) {
                           aggiornaPosizione(location);
                  }
        };
       
        public IBinder onBind(Intent intent) {
                   return null;
        }
       
        public void onCreate(){
                super.onCreate();
                db =(new DatabaseGPS(this,"databaseProva")).getWritableDatabase();
                locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);
                locationManager.requestLocationUpdates(providerId, 5*1000, 15, listener);
                location = locationManager.getLastKnownLocation(providerId);
                aggiornaPosizione(location);
                       
        }
       
        private void aggiornaPosizione(Location location){
                ContentValues cv=new ContentValues();
        cv.put(MetaData.LATITUDINE_KEY, location.getLatitude());
        cv.put(MetaData.LONGITUDINE_KEY, location.getLongitude());
        db.insert(MetaData.GPS_TABLE, null, cv);
        }
       
        public void onDestroy(){
                db.close();
        }
       
               
}
[/code]

Codice: [Seleziona]
[code=java]
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DatabaseGPS extends SQLiteOpenHelper {
       
    private static final String DB_NAME="databaseGPS";
    private static final int DB_VERSION=1;
    private static String titolo;
       
    static class MetaData {
            static final String GPS_TABLE = titolo;
        static final String ID = "_id";
        static final String LATITUDINE_KEY = "latitudine";
        static final String LONGITUDINE_KEY = "longitudine";
    }
   
    private static final String GPS_TABLE_CREATE = "CREATE TABLE IF NOT EXISTS "+ MetaData.GPS_TABLE + " ("+ MetaData.ID+ " integer primary key autoincrement, "+ MetaData.LATITUDINE_KEY + " REAL not null, "+ MetaData.LONGITUDINE_KEY + " REAL not null);";
   
    public DatabaseGPS(Context context, String t) {
        super(context, DB_NAME, null, DB_VERSION);
        titolo = t;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(GPS_TABLE_CREATE);
    }
       
    @Override
    public void onUpgrade(SQLiteDatabase _db, int oldVersion, int newVersion) {
        //qui mettiamo eventuali modifiche al db, se nella nostra nuova versione della app, il db cambia numero di versione

    }
}
[/code]

A runtime l'applicazione crasha e il logcat riporta un errore nella riga db =(new DatabaseGPS(this,"databaseProva")).getWritableDatabase();
vi posto anche il log:

Codice: [Seleziona]
08-27 12:01:46.740: I/SqliteDatabaseCpp(21282): sqlite returned: error code = 1, msg = near "null": syntax error, db=xxx
08-27 12:01:46.740: D/AndroidRuntime(21282): Shutting down VM
08-27 12:01:46.740: W/dalvikvm(21282): threadid=1: thread exiting with uncaught exception (group=0x40c2b1f8)
08-27 12:01:46.745: E/AndroidRuntime(21282): FATAL EXCEPTION: main
08-27 12:01:46.745: E/AndroidRuntime(21282): java.lang.RuntimeException: Unable to create service it.helloworld.tour.Servizio: android.database.sqlite.SQLiteException: near "null": syntax error: , while compiling: CREATE TABLE IF NOT EXISTS null (_id integer primary key autoincrement, latitudine REAL not null, longitudine REAL not null);
08-27 12:01:46.745: E/AndroidRuntime(21282):         at android.app.ActivityThread.handleCreateService(ActivityThread.java:2275)
08-27 12:01:46.745: E/AndroidRuntime(21282):         at android.app.ActivityThread.access$1600(ActivityThread.java:127)
08-27 12:01:46.745: E/AndroidRuntime(21282):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1213)
08-27 12:01:46.745: E/AndroidRuntime(21282):         at android.os.Handler.dispatchMessage(Handler.java:99)
08-27 12:01:46.745: E/AndroidRuntime(21282):         at android.os.Looper.loop(Looper.java:137)
08-27 12:01:46.745: E/AndroidRuntime(21282):         at android.app.ActivityThread.main(ActivityThread.java:4507)
08-27 12:01:46.745: E/AndroidRuntime(21282):         at java.lang.reflect.Method.invokeNative(Native Method)
08-27 12:01:46.745: E/AndroidRuntime(21282):         at java.lang.reflect.Method.invoke(Method.java:511)
08-27 12:01:46.745: E/AndroidRuntime(21282):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:790)
08-27 12:01:46.745: E/AndroidRuntime(21282):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
08-27 12:01:46.745: E/AndroidRuntime(21282):         at dalvik.system.NativeStart.main(Native Method)
08-27 12:01:46.745: E/AndroidRuntime(21282): Caused by: android.database.sqlite.SQLiteException: near "null": syntax error: , while compiling: CREATE TABLE IF NOT EXISTS null (_id integer primary key autoincrement, latitudine REAL not null, longitudine REAL not null);
08-27 12:01:46.745: E/AndroidRuntime(21282):         at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method)
08-27 12:01:46.745: E/AndroidRuntime(21282):         at android.database.sqlite.SQLiteCompiledSql.<init>(SQLiteCompiledSql.java:68)
08-27 12:01:46.745: E/AndroidRuntime(21282):         at android.database.sqlite.SQLiteProgram.compileSql(SQLiteProgram.java:134)
08-27 12:01:46.745: E/AndroidRuntime(21282):         at android.database.sqlite.SQLiteProgram.compileAndbindAllArgs(SQLiteProgram.java:361)
08-27 12:01:46.745: E/AndroidRuntime(21282):         at android.database.sqlite.SQLiteStatement.acquireAndLock(SQLiteStatement.java:260)
08-27 12:01:46.745: E/AndroidRuntime(21282):         at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:84)
08-27 12:01:46.745: E/AndroidRuntime(21282):         at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:2025)
08-27 12:01:46.745: E/AndroidRuntime(21282):         at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1965)
08-27 12:01:46.745: E/AndroidRuntime(21282):         at it.helloworld.tour.DatabaseGPS.onCreate(DatabaseGPS.java:29)
08-27 12:01:46.745: E/AndroidRuntime(21282):         at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:165)
08-27 12:01:46.745: E/AndroidRuntime(21282):         at it.helloworld.tour.Servizio.onCreate(Servizio.java:41)
08-27 12:01:46.745: E/AndroidRuntime(21282):         at android.app.ActivityThread.handleCreateService(ActivityThread.java:2265)
08-27 12:01:46.745: E/AndroidRuntime(21282):         ... 10 more

Qualcuno sa dirmi dove sbaglio? Grazie.

Offline MarcoDuff

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1073
  • Respect: +202
    • Google+
    • marcoduff
    • Mostra profilo
    • MarcoDuff's Blog
  • Dispositivo Android:
    Samsung Galaxy Nexus
  • Play Store ID:
    MarcoDuff
  • Sistema operativo:
    Windows 7
Re:Problema apertura database
« Risposta #1 il: 27 Agosto 2012, 12:15:31 CEST »
0
Il tuo è un problema di linguaggio java.

Tu inizializzi la costante GPS_TABLE in questo modo:

Codice (Java): [Seleziona]
static final String GPS_TABLE = titolo;
Leggendo il codice ho notato che non inizializzi la variabile statica titolo:

Codice (Java): [Seleziona]
private static String titolo;
che ottiene valore null.

Di conseguenza anche la costante GPS_TABLE avrà sempre e solo valore null.

Qui le mie domande:
visto che GPS_TABLE ottiene valori diversi in base a come viene costruito l'oggetto DatabaseGPS
Come mai GPS_TABLE l'hai definita come costante?
Come mai GPS_TABLE l'hai definita come statica?
A cosa ti serve la variabile statica titolo?
Come mai titolo l'ahi definito statico?

Visto che sei alle prime armi ti consiglio di leggere una guida di java (ne trovi una gratuita qui: Planet PDF - Thinking in Java).

Offline sdullaz

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    samsung galaxy s2
  • Sistema operativo:
    windows 7
Re:Problema apertura database
« Risposta #2 il: 27 Agosto 2012, 12:34:14 CEST »
0
Come sempre incappo nelle banalità  :-), ti ringrazio per l'aiuto!!