创建表时应用程序崩溃,直到更改SQLite数据库名称或版本

时间:2014-04-13 18:56:26

标签: android sqlite

每当我第二次尝试运行我的项目时(如果我改变了什么都无关紧要),我最终会崩溃。如果我更改了数据库名称或版本,应用程序将再次开始工作。

据我所知(我是Android开发新手),在你执行getWritableDatabase()之后,实际上创建了数据库。之后,如果第一次创建数据库,则在helper类中调用onCreate方法,否则调用onUpgrade(请在最后一个短语上更正)。现在我的OnCreate和OnUpgrade非常简单:

    @Override
    public void onCreate(SQLiteDatabase db) {
            db.execSQL(CREATE_TABLE_TOI);
            db.execSQL(CREATE_TABLE_HINDU);
            db.execSQL(CREATE_TABLE_NEWSPAPER);
            db.execSQL(CREATE_TABLE_CATEGORY);
            db.execSQL(CREATE_TABLE_NEWSPAPER_CATEGORY);

            Log.d(TAG, "in onCreate MySQLhelper");

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
                            + newVersion + ", which will destroy all data");

            db.execSQL("DROP TABLE IF EXISTS " + TABLE_TOI);
            db.execSQL("DROP TABLE IF EXISTS " + TABLE_HINDU);
            db.execSQL("DROP TABLE IF EXISTS " + TABLE_NEWSPAPER);
            db.execSQL("DROP TABLE IF EXISTS " + TABLE_CATEGORY);
            db.execSQL("DROP TABLE IF EXISTS " + TABLE_NEWSPAPER_CATEGORY);
            onCreate(db);

    }

在我的DAO类中的getWritableDatabase命令之后,我调用了一个类TABLE,我使用SQLiteStatement来预加载表。这是应用程序崩溃的地方。从logcat,错误是"由以下引起:android.database.sqlite.SQLiteConstraintException:PRIMARY KEY必须是唯一的(代码19)"。

我不记得在哪里,但我在StackOverflow上读到了一个问题(我也不记得这个问题),答案是更改数据库名称并尝试,它已经适用于OP。我尝试了同样的方法,它对我有用。

现在,我必须为每次运行更改数据库名称或编号。

我的档案:

Logcat

Tables.java

MySQLiteHelper.java

1 个答案:

答案 0 :(得分:0)

每次创建Tables的实例时,都会将数据插入数据库。这一般没有多大意义 - 可能你想把这个逻辑移到你onCreate()MySQLiteHelper中。

如果出于某种原因,每次创建Tables实例时, 都希望插入数据,则需要为PRIMARY KEY列使用唯一值。您当前的代码会尝试每次为您的四行插入1234。这将是第一次工作,但第二次,这些行已经存在,因此您获得了唯一约束违规。