代码之家  ›  专栏  ›  技术社区  ›  tpow

Android中的SQLite onCreate()有问题

  •  1
  • tpow  · 技术社区  · 14 年前

    我正在扩展SQLiteOpenHelper类,以帮助我连接和执行数据库工作。根据 documentation ,只有在尚未创建数据库时才应调用OnCreate方法。然而,我的问题是,当我试图执行一个查询来插入一个记录时,我得到了这个错误。

    ERROR/Database(214): Failure 1 (table Sample already exists) on 0x218688 when preparing 
    'CREATE TABLE Sample (RecId INT, SampleDesc TEXT);'.
    

    这个创建查询在代码中使用的唯一地方是OnCreate方法,它如下所示。

     @Override
          public void onCreate(SQLiteDatabase db) {
              db.execSQL(SAMPLE_TABLE_CREATE);
          }
    

    注: 我在跟踪一个 tutorial -我所做的唯一不同的事情是将SQLiteDatabase对象设置为public而不是private,这样我就可以为每个实体扩展这个类,让继承的DataHelper类中的public 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());   
                }
        }
    

    有人能告诉我我做错了什么吗?或者可能是黑客(即在执行CREATE语句之前检查表是否存在)

    请让我知道什么其他代码,我可以张贴解决这个。。。

    3 回复  |  直到 14 年前
        1
  •  1
  •   SteD    14 年前

    是不是因为你只执行了一次你的活动,之后就再也没有销毁数据库? 第二次跑步你就会犯这个错误。

    /data/data/YOUR_PACKAGE/databases/ 因此,一个解决办法是检查DB是否存在,然后再创建它。

        //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

        2
  •  0
  •   Connor Tumbleson    14 年前

    第一个错误非常简单,因为您正在创建一个已经存在的表,所以是的,在创建表之前添加一个检查将是很好的。创建或创建SQLite dB后,它将一直保留到有人或某物删除它,这与默认的onCreate()调用不同,后者类似于重新创建或绘制屏幕。

        3
  •  -2
  •   Vladimir Ivanov    14 年前

    每次调用getWritableDatabase()onCreate()方法时都会被调用。