Hallo zusammen,
also ich habe folgendes Problem:
Ich möchte meine mySQL DB mit einer lokalen SQLite DB synchronisieren.
Dazu leere ich die SQLite Tabelle und will in einer for-Schleife die Daten aus der MySQL DB auslesen und dann Objekt für Objekt in die SQLite DB schreiben.
Das leeren funktioniert und das einfügen eigentlich auch, allerdings sagen meine LogCat Ausgaben etwas anderes.
Hier mal meine Funktionen.
In der Activity sieht das Ganze so aus:
private class SyncTask extends AsyncTask<Void, Void, Boolean> {
private Access access;
Boolean res;
protected void onPreExecute() {
access = new Access();
mProgressDialog = ProgressDialog.show(ScheduleActivity.this, "Daten aktualisieren...", "Bitte warten...");
}
protected Boolean doInBackground(Void... arg0)
{
try{
res = access.syncGames(ScheduleActivity.this);
}
catch (Exception e){
res = false;
e.printStackTrace();
}
return res;
}
protected void onPostExecute(Boolean result) {
if (result)
{
mProgressDialog.dismiss();
Toast.makeText(ScheduleActivity.this, "Erfolgreich aktualisiert!", Toast.LENGTH_LONG).show();
loadListView();
}
else if (!result)
{
mProgressDialog.dismiss();
Toast.makeText(ScheduleActivity.this, "Fehler bei Aktualisierung!", Toast.LENGTH_LONG).show();
loadListView();
}
else
{
mProgressDialog.dismiss();
}
}
}
Alles anzeigen
Das ist also eine ASyncTask, die solange einen ProgressDialog anzeigt, bis das Synchronisieren fertig ist.
Hier wird die Funktion access.syncGames(ScheduleActivity.this) aufgerufen. Die sieht wie folgt aus:
public Boolean syncGames(Context context){
Boolean res;
String result = DatabaseConnection.connect("game", context);
JSONArray jArray;
sqLiteAccess.clearGameTable(context);
try{
jArray = new JSONArray(result);
JSONObject json_data=null;
for(int i=0;i<jArray.length();i++){
json_data = jArray.getJSONObject(i);
String homeTeam = json_data.getString("HOMETEAM");
String guestTeam = json_data.getString("GUESTTEAM");
String place = json_data.getString("PLACE");
String referee = json_data.getString("REFEREE");
String gameDate = json_data.getString("DATE");
String time = json_data.getString("TIME");
try{
sqLiteAccess.insertGame(homeTeam, guestTeam, place, referee, gameDate, time, context);
}
catch (Exception e)
{
e.printStackTrace();
}
}
res = true;
}
catch(JSONException e1){
System.out.println("Keine Daten gefunden - Meldung: " + e1.getMessage());
res = false;
} catch (ParseException e1) {
System.out.println("Parse Exception in DatabseRequest.syncGames: " + e1.getMessage());
e1.printStackTrace();
res = false;
}
return res;
}
Alles anzeigen
Hier wird als erstes mit
die SQLite Tabelle geleert. Dann wird in der for-Schleife nach und nach mit
die Spiele in die SQLite DB eingefügt.
Diese beiden Funktionen bestehen wieder aus AsyncTasks die wie folgt aussehen:
private class SyncTaskClearGameTable extends AsyncTask<Void, Void, Boolean> {
GameDataSource gameDataSource;
Boolean res;
private SyncTaskClearGameTable(Context context)
{
gameDataSource = new GameDataSource(context);
}
protected void onPreExecute()
{
gameDataSource.open();
}
protected Boolean doInBackground(Void... arg0)
{
try{
gameDataSource.clearGameTable();
res = true;
}
catch (Exception e)
{
//TODO Exception
res = false;
}
return res;
}
protected void onPostExecute(Boolean result) {
if (result)
{
gameDataSource.close();
System.out.println("clearGameTable funktioniert!");
}
else
{
gameDataSource.close();
System.out.println("clearGameTable funktioniert nicht!");
}
}
}
Alles anzeigen
und
private class SyncTaskInsertGame extends AsyncTask<Void, Void, Boolean>{
GameDataSource gameDataSource;
private SyncTaskInsertGame(Context context)
{
gameDataSource = new GameDataSource(context);
}
protected void onPreExecute()
{
gameDataSource.open();
}
protected Boolean doInBackground(Void... arg0)
{
try
{
gameDataSource.insertGame(homeTeam, guestTeam, place, referee, gameDate, time);
res = true;
}
catch (Exception e)
{
//TODO Exception
res = false;
}
return res;
}
protected void onPostExecute(Boolean result) {
if (result)
{
gameDataSource.close();
System.out.println("InsertGame funktioniert!");
}
else
{
gameDataSource.close();
System.out.println("InsertGame funktioniert nicht!");
}
}
}
Alles anzeigen
Die Funktionen die dahinter liegen sind:
public void clearGameTable()
{
gameDataBase.execSQL("DELETE FROM '"+phpFileName+"'");
gameDataBase.execSQL("VACUUM");
}
und
public Game insertGame(String home, String guest, String place, String referee, String date, String time)
{
Game currentGame;
ContentValues values = new ContentValues();
values.put("HOME", home);
values.put("GUEST", guest);
values.put("PLACE", place);
values.put("REFEREE", referee);
values.put("DATE", date);
values.put("TIME", time);
long insertId = gameDataBase.insert(phpFileName, null, values);
Cursor cursor = gameDataBase.query(phpFileName, allColumns,
"_id = " + insertId, null, null, null, null, null);
cursor.moveToFirst();
currentGame = cursorToSetting(cursor);
cursor.close();
return currentGame;
}
Alles anzeigen
Also mein Problem ist nun folgendes: LogCat sagt mir:
1. clearGameTable funktioniert
2. sqlite returned: error code = 17, msg = statement aborts at 14: [SELECT VALUE FROM SETTINGS WHERE SETTING = 'team'] database schema has changed
3. insertGameTable funktioniert nicht!
Dieses Setting holt mir einfach nur den Datanbank Präfix aus der SQLite DB.
Wie gesagt das Ganze funktioniert eigentlich, aber der LogCat sagt halt was anderes.
Jemand eine Idee was das bedeuten könnte? Ich hoffe das war nicht zuviel Code auf einmal, aber ich habe ewig bei Google gesucht und alles ausprobiert und Ihr seid (hoffentlich) meine letzte Rettung!!
Besten Dank schonmal!
Gruß
M3doXX