繁体   English   中英

Android中SQLite onCreate()的问题

[英]Problem with SQLite onCreate() in Android

我正在扩展SQLiteOpenHelper类,以帮助我连接并完成数据库工作。 根据文档 ,仅当尚未创建数据库时才应调用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);
      }

注意:我正在学习一个教程 -我做的唯一不同的是将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语句之前检查表是否存在)

请让我知道我还可以发布其他代码来解决此问题...

是因为您只执行一次活动就此,而之后再也不会破坏数据库吗? 而第二轮您会遇到此错误。

数据库存储在/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
    }

代码源在这里

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM