# Löschen einer Tabelle bei PlayStore update



## kuzdu (20. Okt 2014)

Hallo Community,

ich betreibe eine App, bei der mit jedem Update eine Datenbank mit zahlreichen Begriffen aktualisiert werden soll. Dafür gebe ich die Datenbank Verwaltung.db mit. In der Verwaltung ist die Tabelle Begriffe.

Die Struktur von Begriffe war in der 1. Version: ID, x,x
Für die 2. Version habe ich die Struktur wegen eines Tutorials verändert in: _id,x,x

Das Update hat die App total zerstört, weil im Code meine Abfragen einer _id galten. Allerdings war in der Tabelle noch die ID-Spalte existent, weshalb folgender Fehler erschien: 

android.database.sqlite.SQLiteException: no such column: _id: , while compiling: SELECT _id, FRAGE, KATEGORIE, KATEGORIEID, LASTACCES, LASTUPDATE FROM KATEGORIEN ORDER BY LASTUPDATE DESC limit 1

D.h. die ursprüngliche Tabelle Begriffe wurde nicht gelöscht. Der Fehler ist klar. Allerdings sollte folgender Code eigentlich dafür sorgen, dass die Datenbank neu aufgesetzt wird:



```
@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			Log.w(MySQLiteHelper.class.getName(),
				"Upgrading database from version " + oldVersion + " to "
						+ newVersion + ", which will destroy all old data");
			
		
		db.execSQL("DROP TABLE IF EXISTS " + DATABASE_NAME);
		System.out.println("TABLE GEDROPPT");
		onCreate(db);
	}
```

Das 1. Update hat also dafür gesorgt, dass jeder der die App schon besaß, sie nochmal umständlich über den Play Store laden musste und nicht einfach upgraden konnte. Weil die Anzahl der aktiven Benutzer nun schon deutlich gewachsen ist, möchte ich denselben Fehler beim 2. Update nicht nochmal machen.

Was übersehen ich bei meinem Code? Ich dachte die onUpgrade-Methode wird bei jedem Appaufruf einmal automatisch abgefragt? Kann mich jemand aufklären?

Oder muss ich ein SQLite-Update iwie im Manifest mitteilen?

Mir kommt es so vor, dass wenn ich über eclipse die App auf mein Handy spiele, das nicht derselbe Prozess ist wie wenn man über den Play Store eine App upgradet? Kann das sein? 

Mir ist nur wichtig, dass die Benutzer ein Upgrade so komfortabel wie möglich genießen


----------



## dzim (20. Okt 2014)

Ich hab den Code unserer App gerade mal gecheckt und wir machen es da auf die selbe Tour... Kann also von der Seite her kein Problem bei dir entdecken.

Und nein: Die Methode wird nicht jedes mal Aufgerufen, sondern nur, wenn sich deine DB-Version ändert. Ob die sich geändert hat legt man ja im Konstuctor fest. Da du deinen Code nur in Auszügen hier zu stehen hast, kann ich natürlich nicht sagen, ob es da noch ein Problem gibt.


```
public class MyDBOpenHelper extends SQLiteOpenHelper {

  private static final in DB_VERSION = 2;

  public MyDBOpenHelper(Context c) {
    super(c, "myDatabase.db", null, DB_VERSION);
  }

  @Override
  public void onCreate(SQLiteDatabase db) {
    db.execSQL("<some-create-stmt>");
  }

  @Override
  public void onUpdate(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("<some-drop-stmt>");
    onCreate(db);
  }
}
```

Das wichtige ist, das sich DB_VERSION ändert: Wenn du signifikante Änderungen an der DB hast, dann setzt du im nächsten Build einfach die Zahl von jetzt "2" auf z.B. "3".
Bei mir hat es jedenfalls so immer geklappt.


----------



## kuzdu (21. Okt 2014)

> Das wichtige ist, das sich DB_VERSION ändert: Wenn du signifikante Änderungen an der DB hast, dann setzt du im nächsten Build einfach die Zahl von jetzt "2" auf z.B. "3".
> Bei mir hat es jedenfalls so immer geklappt.



Das wird es wohl gewesen sein. Das habe ich nie beachtet, naja jetzt bin ich wieder klüger. Vielen Dank! 

Wohl unwichtig, aber mein Konstruktor sieht so aus:


```
public MySQLiteHelper(Context context) {
			super(context, DATABASE_NAME, null, DATABASE_VERSION);
			this.myContext = context;
		}

	@Override
		public void onCreate(SQLiteDatabase database) {
			
			database.execSQL(TABLE_CREATE_KATEGORIEN);
			System.out.println("Tabelle KATEGORIEN erfolgreich erstellt");
			database.execSQL(TABLE_CREATE_RATE);
			System.out.println("Tabelle RATE erfolgreich erstellt");
			database.execSQL(TABLE_CREATE_FULLVERSION);
			System.out.println("Tabelle FULLVERSION erfolgreich erstellt");
		
		}
```


----------

