package de.fau.cs.mad.fly.db; import java.util.ArrayList; import java.util.List; import com.badlogic.gdx.Gdx; import com.badlogic.gdx.sql.Database; import com.badlogic.gdx.sql.DatabaseCursor; import com.badlogic.gdx.sql.DatabaseFactory; /** * Manages the database of fly * * @ Qufang Fan */ public class FlyDBManager { private static final String DATABASE_NAME = "faumadfly01.db"; private static final int DATABASE_VERSION = 1; private static final int LASTEST_DATABASE_VERSION = 2; final Database dbHandler; private FlyDBManager() { Gdx.app.log("FlyDBManager", "setupDatabase begin " + System.currentTimeMillis()); String createTablePlayer = "create table if not exists player(player_id integer primary key autoincrement, fly_id text, name text not null, total_score integer not null default 0, total_geld integer not null default 0, current_levelgroup_id integer not null default 1, current_level_id integer not null default 1," + "passed_levelgroup_id integer not null default 1, passed_level_id integer not null default 1)"; String createTableScore = "create table if not exists score(player_id integer not null, level_group_id integer not null, level_id integer not null, score integer not null, compare_score text, reached_date date, is_uploaded integer not null default 0, server_score_id integer)"; // String createTableScoreDetail = // "create table if not exists score_detail(scoredetail_id integer primary key autoincrement, level_group_id integer not null, player_id integer not null, level_id integer not null,score_detail text not null, _value text)"; String createTablePlaneEquiped = "create table if not exists fly_plane_equiped(player_id integer not null, plane_id integer, equiped_name text not null, _count integer not null default 0)"; String createTablePlaneUpdates = "create table if not exists fly_plane_upgrade(player_id integer not null, plane_id integer, update_name text not null, _count integer not null default 0)"; String createTableVersion = "create table if not exists fly_db_version(_version integer not null)"; String insertDBVersion = "insert into fly_db_version values(1)"; List<String> createSQLs = new ArrayList<String>(); createSQLs.add(createTablePlayer); createSQLs.add(createTableScore); // createSQLs.add(createTableScoreDetail); createSQLs.add(createTablePlaneEquiped); createSQLs.add(createTablePlaneUpdates); createSQLs.add(createTableVersion); createSQLs.add(insertDBVersion); dbHandler = DatabaseFactory.getNewDatabase(DATABASE_NAME, DATABASE_VERSION, createSQLs, null); synchronized (dbHandler) { dbHandler.setupDatabase(); Gdx.app.log("FlyDBManager", "setupDatabase end " + System.currentTimeMillis()); dbHandler.openOrCreateDatabase(); Gdx.app.log("FlyDBManager", "database opened " + System.currentTimeMillis()); int dbVersion = getDBVersion(); // if(dbVersion <2 ) { // //add version 2 sql // } // // if(dbVersion <3 ) { // //add version 3 sql // } // ... if (dbVersion < LASTEST_DATABASE_VERSION) { // change LASTEST_DATABASE_VERSION amd add db update sql here // when new version needs dbHandler.execSQL("ALTER TABLE player ADD COLUMN secret_key text"); dbHandler.execSQL("ALTER TABLE player ADD COLUMN is_newname_uploaded integer not null default 1"); updateDBversion(LASTEST_DATABASE_VERSION); } } } private static FlyDBManager Instance = new FlyDBManager(); private int getDBVersion() { DatabaseCursor cursor = dbHandler.rawQuery("select _version from fly_db_version"); if (cursor != null && cursor.getCount() > 0) { cursor.next(); int ret = cursor.getInt(0); cursor.close(); return ret; } return 0; } private void updateDBversion(int version) { dbHandler.execSQL("update fly_db_version set _version=" + version); } public static FlyDBManager getInstance() { if (Instance == null) Instance = new FlyDBManager(); return Instance; } /* * execute one SQL without return value. please don't forget to call the * open and close database methods. */ public void execSQL(String sql) { // Gdx.app.log("FlyDBManager.execSQL", "execSQL begin " + // System.currentTimeMillis()); Gdx.app.log("FlyDBManager.execSQL", sql); synchronized (dbHandler) { dbHandler.execSQL(sql); } // Gdx.app.log("FlyDBManager.execSQL", "execSQL end " + // System.currentTimeMillis()); } public void openDatabase() { // Gdx.app.log("FlyDBManager.openDatabase", "open db begin " + // System.currentTimeMillis()); synchronized (dbHandler) { dbHandler.openOrCreateDatabase(); } // Gdx.app.log("FlyDBManager.openDatabase", "open db end " + // System.currentTimeMillis()); } /* * execute one select SQL. please don't forget to call the open and close * database methods. */ public DatabaseCursor selectData(String selectSQL) { // Gdx.app.log("FlyDBManager.selectData", "selectData begin " + // System.currentTimeMillis()); DatabaseCursor cursor = null; // Gdx.app.log("FlyDBManager.selectData", selectSQL); synchronized (dbHandler) { cursor = dbHandler.rawQuery(selectSQL); } // Gdx.app.log("FlyDBManager.selectData", "selectData end " + // System.currentTimeMillis()); return cursor; } protected void closeDatabase() { try { synchronized (dbHandler) { dbHandler.closeDatabase(); } } catch (Exception e) { Gdx.app.error("FlyDBManager.closeDatabase", e.toString()); } // Gdx.app.log("FlyDBManager.closeDatabase", "close db at:" + // System.currentTimeMillis()); } public void dispose() { closeDatabase(); Instance = null; Gdx.app.log("FlyDBManager", "db is closed and disposed"); } }