1

我有一个类 DatabaseHandler。我已经使用以下代码覆盖了 onCreate(SQLiteDatabase db) 方法:

    String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_SONG + "(" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
                            SONG_TITLE + " TEXT," + ARTIST_NAME + " TEXT," + GENRE + " TEXT," +
                            SONG_PATH + " TEXT" + ")";
    db.execSQL(CREATE_TABLE);

但是我发现每次打开模拟器时都会在 TABLE_SONG 中附加额外的项目,结果即使我在 sdcard 中有 6 首歌曲,数据库也显示了 454 首歌曲。这迫使我放下桌子,想重新创建它。但是现在我被困住了,找不到表,或者说没有创建表。当我创建此类的对象时,不应该每次都调用 onCreate() 方法吗?

4

3 回答 3

1

参考SQLiteOpenHelper实现,该onCreate方法仅在找不到数据库文件时调用一次,导致它创建一个。稍后,onUpgrade每当发现数据库版本号增加时调用。

要快速解决您的问题,只需卸载并重新安装该应用程序即可。这将导致您的数据库消失,因此允许onCreate再次调用。

于 2012-10-29T14:43:48.220 回答
0

onCreate如果数据库已经创建,则不会被调用,例如在您之前运行应用程序期间。

卸载您的应用程序并重新安装 - 它也会删除 db 文件

或增加您的数据库版本,这将导致onUpgrade被调用。onUpgrade您可以删除所有表格并调用onCreate

于 2012-10-29T14:44:26.110 回答
0

我同意 waqas 请在下面找到示例代码

    @Override
        public void onCreate(SQLiteDatabase db) {
       String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME
                    + ... ) ";
db.execSQL(CREATE_TABLE);}

@Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // Drop older table if exists
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
                onCreate(db);
}

编辑 onUpgrade() 的使用

当你构造一个版本比打开的数据库版本新的 SQLiteOpenHelper 时,它会被调用。做什么取决于在旧版本和新版本之间对数据库所做的更改。唯一不删除已更改表的情况是,更改不仅仅是添加的列。然后您可以使用 ALTER TABLE 语句将新列添加到表签名中。

于 2012-10-29T14:49:04.290 回答