Работа с SQLite в libgdx - PullRequest
       14

Работа с SQLite в libgdx

1 голос
/ 14 февраля 2012

Я нахожусь в процессе разработки игры с несколькими мирами и уровнями (каждый из которых имеет свои индивидуальные данные), которую я хочу сохранить в базе данных SQLite на Android.Я реализовал SQLite в некоторых очень простых приложениях, но до сих пор не могу заставить его работать вместе с инфраструктурой libgdx.

Что я на самом деле сделал, так это то, что я поддерживаю класс Assets, который имеет некоторые статические члены дляиспользовать в классах в других местах.У меня есть частный статический вложенный класс по имени SQLHelper, который поддерживает строки запроса и некоторые частные методы для обработки базы данных SQLite, когда приложение работает на телефоне / эмуляторе Android.

Вот пример кода:

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.

Ответы [ 3 ]

1 голос
/ 22 января 2013

Я отслеживал этот вопрос на форумах libGDX , поскольку я тоже искал решение для чего-то подобного.

В конечном счете, кто-то, пытающийся внедрить SQLite в libGDX, должен создать обертку, чтобы можно было использовать что-то вроде SQLDroid при запуске с устройства Android, но стандартные драйверы JDBC можно использовать при запуске с рабочего стола.

Вы можете просмотреть учебник по созданию этой "оболочки" здесь .

0 голосов
/ 09 апреля 2013

Вот пример JDBC реализации драйверов для настольных ПК и Android: http://code.google.com/p/libgdx-users/wiki/SQLite

0 голосов
/ 05 апреля 2012

SQLite - это легковесная база данных для мобильных устройств.Я думаю, что ваша ошибка заключалась в том, чтобы установить связь между таблицами, которая не поддерживалась SQLite, и по этой причине он вызывает исключение.Поэтому удалите оператор установления отношений, такой как FOREIGN Key и REFERENCES.

...