每当我第二次尝试运行我的项目时(如果我改变了什么都无关紧要),我最终会崩溃。如果我更改了数据库名称或版本,应用程序将再次开始工作。
据我所知(我是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。我尝试了同样的方法,它对我有用。
现在,我必须为每次运行更改数据库名称或编号。
我的档案:
答案 0 :(得分:0)
每次创建Tables
的实例时,都会将数据插入数据库。这一般没有多大意义 - 可能你想把这个逻辑移到你onCreate()
类MySQLiteHelper
中。
如果出于某种原因,每次创建Tables
实例时, 都希望插入数据,则需要为PRIMARY KEY
列使用唯一值。您当前的代码会尝试每次为您的四行插入1
,2
,3
和4
。这将是第一次工作,但第二次,这些行已经存在,因此您获得了唯一约束违规。