Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在libgdx中使用SQLite_Android_Sqlite_Libgdx - Fatal编程技术网

Android 在libgdx中使用SQLite

Android 在libgdx中使用SQLite,android,sqlite,libgdx,Android,Sqlite,Libgdx,我正在开发一款具有多个世界和级别(每个级别都有各自的数据)的游戏,我希望将其存储在Android上的SQLite数据库中。我已经在一些非常基本的应用程序中实现了SQLite,但到目前为止,我无法让它与libgdx框架一起工作 我实际上所做的是维护一个资产类,该类有一些静态成员,可在其他类中使用。我有一个名为SQLHelper的私有静态嵌套类,当应用程序在Android手机/仿真器上运行时,它维护查询字符串和一些私有方法来处理SQLite数据库 以下是代码简介: public class Asse

我正在开发一款具有多个世界和级别(每个级别都有各自的数据)的游戏,我希望将其存储在Android上的SQLite数据库中。我已经在一些非常基本的应用程序中实现了SQLite,但到目前为止,我无法让它与libgdx框架一起工作

我实际上所做的是维护一个资产类,该类有一些静态成员,可在其他类中使用。我有一个名为SQLHelper的私有静态嵌套类,当应用程序在Android手机/仿真器上运行时,它维护查询字符串和一些私有方法来处理SQLite数据库

以下是代码简介:

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和桌面上同时处理数据库的简化方法。它位于: