【问题标题】:Android Java - OnCreate executes, but fails to create tables?Android Java - OnCreate 执行,但无法创建表?
【发布时间】:2016-03-02 08:33:32
【问题描述】:

我正在开发我的第一个 Android 项目(完全公开,这是一个学校项目)。我必须承认,我发现它比我预期的要复杂得多。无论如何,这是我的问题。

我创建了一个 DBHelper 类:

public class DBHelper extends SQLiteOpenHelper {
    private static final String DB_NAME = "asteroids.sqlite";
    private static final int DB_VERSION = 1;

    public DBHelper(Context context)
    {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db)
    {
        System.out.println("DB HELPER ON CREATE FUNCTION HERE!!!!");
        db.beginTransaction();
        resetAsteroidsTable(db);
        // Call functions to create each table.
        // Create/Reset BGObject Table
        resetBGObjectsTable(db);
        // GameLevels
        resetGameLevelsTable(db);
        // Level Objects
        resetLevelObjectsTable(db);
        // Level Asteroids
        resetLevelAsteroidsTable(db);
        // Main Bodies
        resetMainBodiesTable(db);
        // Cannons
        resetCannonsTable(db);
        // Extra Parts
        resetExtraPartsTable(db);
        // Engines
        resetEnginesTable(db);
        // Power Cores
        resetPowerCoresTable(db);
        db.setTransactionSuccessful();
        db.endTransaction();
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)       {
        return;
    }

用于创建单个表的函数的格式如下:

   public void resetAsteroidsTable(SQLiteDatabase db)


   {
        // Create/Reset Asteroids Table
        final String SQL =
                "DROP TABLE IF EXISTS ASTEROIDS; " +

                        "CREATE TABLE ASTEROIDS " +
                        "(" +
                        "        ID INTEGER PRIMARY KEY AUTOINCREMENT, " +
                        "        IMAGEPATH TEXT NOT NULL, " +
                        "        IMAGEWIDTH INTEGER NOT NULL, " +
                        "        IMAGEHEIGHT INTEGER NOT NULL, " +
                        "        ASTYPE TEXT NOT NULL " +
                        ");";
        System.out.println("Create the ASTEROIDS database!");
        System.out.println(SQL);
        db.execSQL(SQL);

我已经手动检查了创建表 SQL 语句,它们确实有效。

但是,当我调用这个函数时,也发现在 DBHelper 中将数据插入到其中一个表中。

public boolean executeSqlStatement(String SQLStatement)
{
    SQLiteDatabase db = this.getWritableDatabase();
    db.beginTransaction();
    db.execSQL(SQLStatement);
    db.setTransactionSuccessful();
    db.endTransaction();
    return true;
}

我得到错误:

 android.database.sqlite.SQLiteException: no such table: ASTEROIDS (code 1):

我很困惑,因为我知道 onCreate 会被调用,因为我在 logcat 中看到了我的打印语句。每次我运行正在执行此操作的测试时,我都会清除应用程序数据,并且我确实可以访问使用 humpty 脚本获得的数据库转储。数据库架构仅显示一个名为 android_metadata 的表,该表是空的。我已经在网上查找了几个小时,我非常感谢这里的任何指针。

【问题讨论】:

  • 据我所知,不一样。在这里,我实际上进入了 onCreate 函数,在 oncreate 过程中没有抛出任何错误。表仍然不存在。

标签: android sql sqlite oncreate


【解决方案1】:

exeqSQL() 只执行一条 SQL 语句。您需要将 SQL 拆分为单独的调用,一个用于DROP TABLE,另一个用于CREATE TABLE。请注意,onCreate() 仅在数据库文件不存在时调用,因此实际上不需要 DROP TABLE

另一个问题是SQLiteOpenHelper 生命周期方法(如onCreate())在事务中被调用。您不应该自己启动嵌套事务。 SQLite 本身不支持嵌套事务,Android 的 SQLite 包装器只增加了对事务嵌套的部分支持。

【讨论】:

  • 谢谢,我继续从 onCreate 中删除了交易内容,问题仍然存在。附带说明一下,我什么时候需要使用交易功能?仅使用原始 sql?
  • 尝试使用execSQL() 执行多个 SQL 语句还有另一个问题。更新了答案。
  • 谢谢!这给了我我需要的突破。我只是在执行 drop table 语句。从而呈现一个空的数据库。
猜你喜欢
  • 2013-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
  • 2015-05-30
  • 1970-01-01
相关资源
最近更新 更多