我正在扩展SQLiteOpenHelper类以帮助我连接并完成数据库工作。根据{{3}},只有在尚未创建数据库时才应调用OnCreate方法。然而,我的问题是,当我尝试执行查询以插入记录时,我收到此错误。
ERROR/Database(214): Failure 1 (table Sample already exists) on 0x218688 when preparing
'CREATE TABLE Sample (RecId INT, SampleDesc TEXT);'.
在代码中使用此Create查询的唯一位置是OnCreate方法,如下所示。
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(SAMPLE_TABLE_CREATE);
}
注意:我正在关注documentation - 我唯一做的就是将SQLiteDatabase对象设为public而不是private,以便我可以为每个实体扩展此类,让来自继承的DataHelper类的公共SQLiteDatabase对象完成所有工作
这是使调用失败的方法。
//This method is in the class that extends DataHelper (See note on tutorial)
public void createSample(Sample sample)//next action form
{
String id = sample.getId();
String name = sample.getSummary();
String query = "INSERT INTO " + SAMPLE_TABLE_NAME + "( " + SAMPLE_Id + "," +
SAMPLE_NAME + ") " + " VALUES (" + id + "," + name + ")";
try{
data.rawQuery(query, null);
}
catch(SQLException e){
Log.i("Sample", "Errors: Sample LN60: " + e.getMessage());
}
}
有人可以告诉我我做错了什么吗?或者也许是一个hack(即在执行create语句之前检查表是否存在)
请让我知道我可以发布的其他代码来解决这个问题......
答案 0 :(得分:1)
是否因为你曾经执行过你的活动而在此之后永远不会破坏数据库? 第二次运行你就会遇到这个错误。
数据库存储在/data/data/YOUR_PACKAGE/databases/
中,因此解决方法是在创建数据库之前检查数据库是否存在。
//The Android's default system path of your application database.
private static String DB_PATH = "/data/data/YOUR_PACKAGE/databases/";
private static String DB_NAME = "myDBName";
SQLiteDatabase checkDB = null;
String myPath = DB_PATH + DB_NAME;
checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
if(checkDB){
//do nothing
}else{
//create DB
}
代码来源here
答案 1 :(得分:0)
第一个错误很简单,因为您正在创建一个已经存在的表,所以是在创建表之前添加一个检查表是否存在将是好的。一旦创建或创建SQLite dB,它将保留,直到有人或某些东西删除它,这与默认的onCreate()调用类似,类似于重新创建或绘制屏幕。
答案 2 :(得分:-2)
每次调用getWritableDatabase()时都会调用onCreate()方法。