Android 在libgdx中使用SQLite
我正在开发一款具有多个世界和级别(每个级别都有各自的数据)的游戏,我希望将其存储在Android上的SQLite数据库中。我已经在一些非常基本的应用程序中实现了SQLite,但到目前为止,我无法让它与libgdx框架一起工作 我实际上所做的是维护一个资产类,该类有一些静态成员,可在其他类中使用。我有一个名为SQLHelper的私有静态嵌套类,当应用程序在Android手机/仿真器上运行时,它维护查询字符串和一些私有方法来处理SQLite数据库 以下是代码简介:Android 在libgdx中使用SQLite,android,sqlite,libgdx,Android,Sqlite,Libgdx,我正在开发一款具有多个世界和级别(每个级别都有各自的数据)的游戏,我希望将其存储在Android上的SQLite数据库中。我已经在一些非常基本的应用程序中实现了SQLite,但到目前为止,我无法让它与libgdx框架一起工作 我实际上所做的是维护一个资产类,该类有一些静态成员,可在其他类中使用。我有一个名为SQLHelper的私有静态嵌套类,当应用程序在Android手机/仿真器上运行时,它维护查询字符串和一些私有方法来处理SQLite数据库 以下是代码简介: public class Asse
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的新手。SQLite是专门用于移动设备的轻量级数据库。我认为您的错误是在SQLite不支持的表之间建立了关系,因此它引发了一个异常。因此,请删除关系建立语句,如外键和引用。SQLite是一个专门用于移动设备的轻量级数据库。我认为您的错误是在SQLite不支持的表之间建立了关系,因此它引发了一个异常。因此,请删除关系建立语句,如外键和引用。我通过跟踪这个问题,因为我也在寻找类似问题的解决方案 最终,试图在libGDX中实现SQLite的人需要创建一个包装器,以便在从Android设备运行时可以使用类似SQLDroid的东西,但在从桌面运行时可以使用标准JDBC驱动程序
您可以查看有关创建此“包装器”的教程。我在中跟踪了这个问题,因为我也在寻找类似问题的解决方案 最终,试图在libGDX中实现SQLite的人需要创建一个包装器,以便在从Android设备运行时可以使用类似SQLDroid的东西,但在从桌面运行时可以使用标准JDBC驱动程序
您可以查看创建此“包装器”的教程。这里是一个实现桌面和android驱动程序的JDBC示例:
这里是一个实现桌面和android驱动程序的JDBC示例:
这不是真正的问题。这不是真正的问题。我已经编写了一个扩展,它抽象了所有这些实现细节,并提供了一种简化的方法来同时在Android和桌面上处理数据库。它位于:我已经编写了一个扩展,它抽象了所有这些实现细节,并提供了一种在Android和桌面上同时处理数据库的简化方法。它位于: