2012-02-14 10 views
1

私は、Android上のSQLiteデータベースに保存したい複数の世界とレベル(それぞれがそれぞれのデータを持つ)を持つゲームを開発中です。私はいくつかの非常に基本的なアプリケーションでSQLiteを実装していますが、これまでのところ、libgdxフレームワークと連携して動作させることはできません。libgdxでSQLiteを使って作業する

私が実際に行ったことは、他のクラスのクラスで使用する静的メンバーがあるAssetsクラスを維持していることです。私は、アプリケーションがAndroidの電話機/エミュレータで実行されているときにSQLiteデータベースを処理するためのクエリ文字列といくつかのプライベートメソッドを維持するSQLHelperの名前で、プライベート静的ネストされたクラスを持っています。ここで

は、コードを垣間見るです:

public class Assets { 
//A lot of code (unrelated to SQLHelper class) and to be used in classes elsewhere 

SQLiteDatabase database; 

//SQLHelper class 
private static class SQLHelper { 

    private static String createTableSettings = "CREATE TABLE IF NOT EXISTS settings(settingID INTEGER PRIMARY KEY, settingName VARCHAR(15) NOT NULL, settingParamOne INTEGER NULL, settingParamTwo INTEGER NULL, settingParamThree INTEGER NULL);"; 
    private static String createTableWorldData = "CREATE TABLE IF NOT EXISTS worldData(worldID INTEGER PRIMARY KEY, worldScore INTEGER DEFAULT 0, worldStars INTEGER DEFAULT 0);"; 
    private static String createTableLevelData = "CREATE TABLE IF NOT EXISTS levelData(levelID INTEGER PRIMARY KEY, levelStars INTEGER DEFAULT 0, worldID INTEGER NOT NULL, FOREIGN KEY(worldID) REFERENCES worldData(worldID));"; 

    @SuppressWarnings("static-access") 
    private static void openDatabase() { 
     try { 
      database.openDatabase("gameName", null, database.CREATE_IF_NECESSARY); 
     } catch (Exception e) { 
      Gdx.app.log("Exception in opening databases", "This should not happen on an Android Device (This is fine on java.)"); 
      e.printStackTrace(); 
     } 
    } 

    private static void createTables() { 

     try { 
      database.execSQL("PRAGMA foreign_keys=ON;"); 

      database.execSQL(createTableSettings, null); 
      database.execSQL(createTableWorldData, null); 
      database.execSQL(createTableLevelData, null); 

     } catch (SQLException e) { 
      Gdx.app.log("Exception in createTables", "This should not happen on an Android Device (This is fine on java.)"); 
      e.printStackTrace(); 
     } 

    } 
} 
} 

public static void load() { 
    myManager = new AssetManager(); 

    SQLHelper.openDatabase(); 
    SQLHelper.createTables();  

    loadTextures(); 


} 

そして私はlogcatによって登録された例外のこれらのタイプを取得しています:

02-14 22:45:53.261: E/SqliteDatabaseCpp(578): sqlite3_open_v2("gameName", &handle, 6, NULL) failed 

Failed to open the database. Closing it. 

02-14 22:45:53.291: E/SQLiteDatabase(578): 
android.database.sqlite.SQLiteCantOpenDatabaseException: unable to open database file 

私はに新しいですと、この点で私を助けてくださいlibgdx/SQLite。

答えて

1

私もこのような解決策を探していたので、私はこの質問をlibGDX forumsで追跡しました。

最終的にlibGDXにSQLiteを実装しようとする人は、Androidデバイスから実行するときにSQLDroidのようなものを使用できるようにラッパーを作成する必要がありますが、デスクトップから実行するときは標準のJDBCドライバを使用できます。

この「ラッパー」を作成するためのチュートリアルを表示できますhere

+0

私はこれらすべての実装の詳細を抽象化し、AndroidとDesktopのデータベースを同時に処理するための簡単な方法を提供する拡張機能を書いています。 https://github.com/mrafayaleem/gdx-sqliteにあります。 – Rafay

0

SQLiteは、特にモバイルデバイス用の軽量データベースです。あなたの間違いは、SQLiteによってサポートされていないテーブル間の関係を確立することであったと考えられます。そのため、例外が発生します。したがって、FOREIGNキーとREFERENCESのような関係確立文を削除してください。

+0

これは実際には本当の問題ではありませんでした。 – Rafay

関連する問題