Autore Topic: Accedere al Database con SQLiteOpenHelper  (Letto 1345 volte)

Offline Auron

  • Utente junior
  • **
  • Post: 104
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Motorola Milestone Android 2.2.1
  • Sistema operativo:
    Windows
Accedere al Database con SQLiteOpenHelper
« il: 24 Dicembre 2011, 15:19:44 CET »
0
Buongiorno, mi chiedevo dove sbaglio nella creazione del DB:

Codice (Java): [Seleziona]
private final SQLiteOpenHelper dbHelper = new SQLiteOpenHelper(this,
                        "LAURA_DB", null, DB_VERSION) {

                @Override
                public void onCreate(SQLiteDatabase db) {
                        Log.i(TAG_LOG, "Inizio Creazione DB");
                        StringBuilder createQuery = new StringBuilder();
                       
                       
                        createQuery.append("CREATE TABLE IF NOT EXISTS "+NURSE_TABLE+" (");
                        createQuery.append("        \"_id\" INTEGER PRIMARY KEY AUTOINCREMENT,");
                        createQuery.append("        \"username\" TEXT NOT NULL,");
                        createQuery.append("        \"password\" TEXT NOT NULL,");
                        createQuery.append("        \"grade\" TEXT NOT NULL");
                        createQuery.append(")");
                       
                        createQuery.append("CREATE TABLE IF NOT EXISTS "+DOCTOR_TABLE+" (");
                        createQuery.append("        \"_id\" INTEGER PRIMARY KEY AUTOINCREMENT,");
                        createQuery.append("        \"username\" TEXT NOT NULL,");
                        createQuery.append("        \"password\" TEXT NOT NULL,");
                        createQuery.append("        \"specializzazione\" TEXT NOT NULL");
                        createQuery.append(")");
                       
                        db.execSQL(createQuery.toString());
                }

                @Override
                public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                        // Nope
                        //Log.i(TAG_LOG, "Aggiornamento non implementato");
                        db.execSQL("DROP TABLE IF EXISTS " + DOCTOR_TABLE);
                        db.execSQL("DROP TABLE IF EXISTS " + NURSE_TABLE);
                    onCreate(db);
                }

        };

}

Compila tutto correttamente senza errori ma creando solamente una tabella e non entrambe. Dalla prima volta che entra nell'onCreate la seconda volta che riapro l'app non viene più chiamata l'onCreate del dbHelper...perchè?

Se invece alla creazione del dbHelper aggiungo anche l'Override di onOpen,
Codice (Java): [Seleziona]
@Override
                public void onOpen(SQLiteDatabase db) {
                        // TODO Auto-generated method stub
                        onCreate(db);
                }

Viene fuori il seguente errore:
LogCat:
Codice: [Seleziona]
12-24 14:06:14.203: ERROR/Database(282): Failure 1 (near "CREATE": syntax error) on 0x217dc0 when preparing 'CREATE TABLE IF NOT EXISTS NURSE (        "_id" INTEGER PRIMARY KEY AUTOINCREMENT,        "username" TEXT NOT NULL,        "password" TEXT NOT NULL,        "grade" TEXT NOT NULL)CREATE TABLE IF NOT EXISTS DOCTOR (        "_id" INTEGER PRIMARY KEY AUTOINCREMENT,        "username" TEXT NOT NULL,        "password" TEXT NOT NULL,        "specializzazione" TEXT NOT NULL)'.
12-24 14:06:14.235: DEBUG/AndroidRuntime(282): Shutting down VM
12-24 14:06:14.235: WARN/dalvikvm(282): threadid=1: thread exiting with uncaught exception (group=0x4001d800)
12-24 14:06:14.304: ERROR/AndroidRuntime(282): FATAL EXCEPTION: main
12-24 14:06:14.304: ERROR/AndroidRuntime(282): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.laura/com.laura.LoginActivity}: android.database.sqlite.SQLiteException: near "CREATE": syntax error: CREATE TABLE IF NOT EXISTS NURSE (        "_id" INTEGER PRIMARY KEY AUTOINCREMENT,        "username" TEXT NOT NULL,        "password" TEXT NOT NULL,        "grade" TEXT NOT NULL)CREATE TABLE IF NOT EXISTS DOCTOR (        "_id" INTEGER PRIMARY KEY AUTOINCREMENT,        "username" TEXT NOT NULL,        "password" TEXT NOT NULL,        "specializzazione" TEXT NOT NULL)
12-24 14:06:14.304: ERROR/AndroidRuntime(282):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
12-24 14:06:14.304: ERROR/AndroidRuntime(282):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
12-24 14:06:14.304: ERROR/AndroidRuntime(282):     at android.app.ActivityThread.access$2300(ActivityThread.java:125)
12-24 14:06:14.304: ERROR/AndroidRuntime(282):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
12-24 14:06:14.304: ERROR/AndroidRuntime(282):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-24 14:06:14.304: ERROR/AndroidRuntime(282):     at android.os.Looper.loop(Looper.java:123)
12-24 14:06:14.304: ERROR/AndroidRuntime(282):     at android.app.ActivityThread.main(ActivityThread.java:4627)
12-24 14:06:14.304: ERROR/AndroidRuntime(282):     at java.lang.reflect.Method.invokeNative(Native Method)
12-24 14:06:14.304: ERROR/AndroidRuntime(282):     at java.lang.reflect.Method.invoke(Method.java:521)
12-24 14:06:14.304: ERROR/AndroidRuntime(282):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
12-24 14:06:14.304: ERROR/AndroidRuntime(282):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
12-24 14:06:14.304: ERROR/AndroidRuntime(282):     at dalvik.system.NativeStart.main(Native Method)
12-24 14:06:14.304: ERROR/AndroidRuntime(282): Caused by: android.database.sqlite.SQLiteException: near "CREATE": syntax error: CREATE TABLE IF NOT EXISTS NURSE (        "_id" INTEGER PRIMARY KEY AUTOINCREMENT,        "username" TEXT NOT NULL,        "password" TEXT NOT NULL,        "grade" TEXT NOT NULL)CREATE TABLE IF NOT EXISTS DOCTOR (        "_id" INTEGER PRIMARY KEY AUTOINCREMENT,        "username" TEXT NOT NULL,        "password" TEXT NOT NULL,        "specializzazione" TEXT NOT NULL)
12-24 14:06:14.304: ERROR/AndroidRuntime(282):     at android.database.sqlite.SQLiteDatabase.native_execSQL(Native Method)
12-24 14:06:14.304: ERROR/AndroidRuntime(282):     at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1727)
12-24 14:06:14.304: ERROR/AndroidRuntime(282):     at com.laura.LoginActivity$1.onCreate(LoginActivity.java:259)
12-24 14:06:14.304: ERROR/AndroidRuntime(282):     at com.laura.LoginActivity$1.onOpen(LoginActivity.java:231)
12-24 14:06:14.304: ERROR/AndroidRuntime(282):     at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:117)
12-24 14:06:14.304: ERROR/AndroidRuntime(282):     at com.laura.LoginActivity.onCreate(LoginActivity.java:65)
12-24 14:06:14.304: ERROR/AndroidRuntime(282):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
12-24 14:06:14.304: ERROR/AndroidRuntime(282):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
12-24 14:06:14.304: ERROR/AndroidRuntime(282):     ... 11 more
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;-)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Accedere al Database con SQLiteOpenHelper
« Risposta #1 il: 24 Dicembre 2011, 15:59:07 CET »
0
nella create table non servono i " per i vari campi :)

Offline Auron

  • Utente junior
  • **
  • Post: 104
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Motorola Milestone Android 2.2.1
  • Sistema operativo:
    Windows
Re:Accedere al Database con SQLiteOpenHelper
« Risposta #2 il: 24 Dicembre 2011, 16:55:57 CET »
0
Ora ho fatto il wipe dell'emulatore così da aver disinstallato l'app e aver "pulito" tutto.

Le ho messe così adesso:

Codice (Java): [Seleziona]
createQuery.append("CREATE TABLE IF NOT EXISTS "+DOCTOR_TABLE+" (_id INTEGER PRIMARY KEY AUTOINCREMENT,username TEXT NOT NULL,password TEXT NOT NULL,specializzazione TEXT NOT NULL)");
                        createQuery.append("CREATE TABLE IF NOT EXISTS "+NURSE_TABLE+" (_id INTEGER PRIMARY KEY AUTOINCREMENT,username TEXT NOT NULL,password TEXT NOT NULL,grade TEXT NOT NULL)");

L'errore è rimasto tale e quale del LogCat. Nel File Explorer dell'emulatore viene creato il DB ma ovviamente vuoto
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;-)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Accedere al Database con SQLiteOpenHelper
« Risposta #3 il: 24 Dicembre 2011, 17:06:58 CET »
0
Prova così:

Codice (Java): [Seleziona]
createQuery.append("CREATE TABLE IF NOT EXISTS  "+DOCTOR_TABLE+"  ( _id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL, password TEXT NOT NULL, specializzazione TEXT NOT NULL);");
createQuery.append("CREATE TABLE IF NOT EXISTS  "+NURSE_TABLE+"  ( _id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL, password TEXT NOT NULL, grade TEXT NOT NULL);");

Offline Auron

  • Utente junior
  • **
  • Post: 104
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Motorola Milestone Android 2.2.1
  • Sistema operativo:
    Windows
Re:Accedere al Database con SQLiteOpenHelper
« Risposta #4 il: 24 Dicembre 2011, 17:24:31 CET »
0
L'errore è scomparso ma mi crea solamente la tabella doctor.
da File Explorer ho selezionato il DB e ho cliccato su "Pull a file from the device" poi l'ho aperto con Sqliteman e mi fa vedere solo la tabella doctor.... :-(
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;-)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Accedere al Database con SQLiteOpenHelper
« Risposta #5 il: 24 Dicembre 2011, 17:35:24 CET »
+1
Codice (Java): [Seleziona]
private final SQLiteOpenHelper dbHelper = new SQLiteOpenHelper(this,
                        "LAURA_DB", null, DB_VERSION) {

                @Override
                public void onCreate(SQLiteDatabase db) {
                        Log.i(TAG_LOG, "Inizio Creazione DB");

                        String sql = "CREATE TABLE IF NOT EXISTS  "+DOCTOR_TABLE+"  ( _id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL, password TEXT NOT NULL, specializzazione TEXT NOT NULL);";

                        db.execSQL(sql);

                        sql = "CREATE TABLE IF NOT EXISTS  "+NURSE_TABLE+"  ( _id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL, password TEXT NOT NULL, grade TEXT NOT NULL);";
                       
                        db.execSQL(sql));
                }

                @Override
                public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                        // Nope
                        //Log.i(TAG_LOG, "Aggiornamento non implementato");
                        db.execSQL("DROP TABLE IF EXISTS " + DOCTOR_TABLE);
                        db.execSQL("DROP TABLE IF EXISTS " + NURSE_TABLE);
                    onCreate(db);
                }

        };

}

Offline Auron

  • Utente junior
  • **
  • Post: 104
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Motorola Milestone Android 2.2.1
  • Sistema operativo:
    Windows
Re:Accedere al Database con SQLiteOpenHelper
« Risposta #6 il: 24 Dicembre 2011, 17:39:44 CET »
0
Ti stavo rispondendo che avevo risolto :-P l'alternativa "brutale" se si dovesse usare lo string builder sarebbe:

Codice (Java): [Seleziona]
createQuery.append("CREATE TABLE IF NOT EXISTS  "+DOCTOR_TABLE+"  ( _id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL, password TEXT NOT NULL, specializzazione TEXT NOT NULL);");
db.execSQL(createQuery.toString());
createQuery.delete(0, createQuery.toString().length());
createQuery.append("CREATE TABLE IF NOT EXISTS  "+NURSE_TABLE+"  ( _id INTEGER PRIMARY KEY AUTOINCREMENT, username TEXT NOT NULL, password TEXT NOT NULL, grade TEXT NOT NULL);");

Perchè bisogna azzerare la stringa ogni volta che si fa una nuova execSQL. Per non fare ogni volta questo è più semplice fare stringhe separate per ogni query e ad ognuna fare la propria execSQL ;-)

Grazie comunque
È stata trovata una soluzione al tuo problema?Evidenzia il post più utile premendo . È un ottimo modo per ringraziare chi ti ha aiutato ;-)

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +506
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:Accedere al Database con SQLiteOpenHelper
« Risposta #7 il: 24 Dicembre 2011, 17:42:06 CET »
+2
Se azzarare lo StringBuilder basta chiamare il metodo setLenght(0) invece che fare come hai fatto.
Solo che per come la usi tu non benefici della StringBuilder perchè dentro usi il + per concatenate, tanto vale usare direttamente un tipo String.