簡體   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