onUpgrade Fehler bei DB

  • Hey
    ich möchte meine DB updaten und von einer alten Tabelle in eine neue Werte übernehmen. Dies wollte ich über die Methode onUpgrade machen. Wenn ich jetzt die Version auf 2 hoch setzte und eine Nachricht im Log über Log.v(... ausgeben lasse geht das super. Jetzt möchte ich aber die Werte der alten Tabelle in die neue schreiben mit ein paar formatierungen der Werte. Wenn ich jetzt .getWritableDatabase aufrufe, dann bekomme ich eine Laufzeitfehler mit der Nachricht "Database is locked" im Log. Wenn ich .getWritableDatabase nicht aufrufe bekomme ich eine null pointer exception, was ja klar ist da die DB erst mal geöffnet werden muss.
    Was muss ich denn machen, damit die Datenbank nicht gelocked wird oder ist?


    Schon mal vielen Dank im voraus :)


    LG
    Marco

  • Hi Marco,


    ich habe für den Datenbankzugriff eine eigene Klasse die von SQLiteOpenHelper erbt. die onUpgrade sieht so aus:


    Java
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    		String[] sqls = context.getResources().getStringArray(R.array.upgrade); 
    		for (String sql : sqls) {
    			db.execSQL(sql);
    		}
    	}


    Die Datenbank ist ein Übergabeparameter, mit der muss ich nichts weiter anstellen. Mein String[] enthält zwar nur UPDATE Anweisungen aber das müsste analog laufen. Wenn doch ein Lock drauf liegt der nicht weg will, kannst du dir nicht erst alle alten werte raus ziehen, formatieren wie du willst, in einer geeigneten Datenstruktur zwischenspeichern und dann in einer zweiten for-schleife in die nächste Datenbank klopfen?


    Schreib mal wie genau du die Datenbankverbindung aufbaust, ob du überhaupt SQLite benutzt (ich bin jetzt einfach mal davon ausgegangen) und wie deine onUpgrade bisher aussieht, falls es nicht geht.


    Gruß,
    matze

  • Hey Matthias danke für die schnelle Antwort :)


    das verstehe ich aber nicht ganz. Ich dachte einfach, dass die Methode aufgerufen wird wenn die Version hoch gesetzt wird. Das klappt ja auch bei mir. Und dann habe ich folgendes gemacht: (Ich schreibe jetzt mal den gesamten Quellcode meiner DB hier rein):


    So und damit kommt die Fehlermeldung "Database is locked" im Log, ohne das überhaupt die nachricht im Log ausgegeben wird, welche eigentlich ganz am Anfang von onUpgrade steht. Und wenn ich das "open()" unter der Log Nachricht in onUpgrade entferne, dann kommt besagte null pointer exception und auch keine Nachricht im Log.
    Ich bin ratlos ^^


    Irgendetwas mache ich wohl falsch :(


    LG
    Marco

  • Uff ^^


    Du nimmst ja deinen Übergabeparameter gar nicht her ...


    Java
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){
    	Log.v("DatabaseHelper", "Datenbank Upgrade von " + oldVersion + " auf " + newVersion);
    	open();   
    	if (oldVersion < 2 && newVersion == 2) {
    		Cursor CursorOldTable = fetchId();
    		CursorOldTable.moveToPosition(-1);
    		...	
    	}
    }


    Da in fetchId musst du den Übergabeparameter "db" mit geben bzw deine Variable "mDb" setzen.


    EDIT: und das open() gehört weg

  • Hey danke schon mal für die Tipps und die Zeit die du dir genommen hast :)


    Ich blicke da aber noch nicht ganz durch und habe noch ein paar Fragen :/


    Für was bracht man den Übergabeparameter? Was übergibt er und wo für? Wie benutze ich ihn, also wie implementiere ich in im Java Quell Text?


    Es wäre super wenn du mir diese paar Fragen noch beantworten könntest :)


    Vielen Dank noch mal :)
    LG
    Marco

  • Der Übergabeparameter SQLiteDatabase db ist eine bereits offene Verbindung zur Datenbank, die von SQLiteOpenHelper kommt. Betrachte es einfach als Geschenk, weil du dich jetzt selbst nicht mehr darum kümmern musst ;)


    Was du jetzt tun musst, ist in dein Methode folgendes einfügen:

    Java
    mDb = db;


    Damit setzt du die Instanz der SQLiteDatabase auf deine Membervariable und du kannst von überall aus in der Klasse zugreifen, so wie du es eh schon gehandhabt hast. Also im Prinzip nur folgendes:


    mDb ist jetzt nicht mehr null, du benutzt den Übergabeparameter, musst nicht selbst noch einmal mit open() eine Verbindung aufbauen weil dir bereits eine übergeben wurde und es müsste jetzt funktionieren.


    Gruß,
    matze

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!