Android中的SQLite onCreate()问题

时间:2010-11-27 20:43:13

标签: android database

我正在扩展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语句之前检查表是否存在)

请让我知道我可以发布的其他代码来解决这个问题......

3 个答案:

答案 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()方法。