2014-04-30 37 views
0

最近我一直在用SQLiteDatabaseSQLiteOpenHelper類練習很多,有些東西讓我很困惑。Android沒有寫入數據庫中的表 - 直到

我有此constructoronCreate()方法:

public DataBaseHandler(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

@Override 
    public void onCreate(SQLiteDatabase db) { 
     String create_table = "CREATE TABLE " + MEASUREMENT_TYPE_TABLE + 
       "(" + idCol + " integer primary key autoincrement, " + 
       typeCol + " varchar(255) not null) "; 

     db.execSQL(create_table); 

     populateMeasurementTable(); 

} 

該方法被稱爲在端部是如下:

public void populateMeasurementTable() { 
     SQLiteDatabase db = this.getWritableDatabase(); 
     for(int i = 0; i < measurementType.length; i++) { 
      ContentValues values = new ContentValues(); 
      values.put(typeCol, measurementType[i]); 
      db.insert(MEASUREMENT_TYPE_TABLE, null, values); 
     } 
} 

該方法的要點是填充所創建的表在onCreate()方法。但是,當我在IntelliJ中訪問tools -> Android -> Monitor (DDMS included)並查看數據庫文件時,它不包含表或任何數據(當然)。

measurementType僅僅是正在通過迭代的數組:

private static final String[] measurementType = new String[] {"acceleration", "angles", "area", "astronomical", 
      "density", "energy", "force", "frequency", "length/distance", "power", "pressure", "speed", 
      "temperature", "torque", "volume", "weight"}; 

我試圖使參考所述數據庫是這樣的:

populateMeasurementTable(db);

和在該方法中除去該語句:

db = this.getWriteableDatabse();

我很肯定它會抱怨已經打開連接,否則。但它仍然沒有填充創建表或填充它。

活動中的onCreate()方法是這樣的:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     DataBaseHandler handler = new DataBaseHandler(getApplicationContext()); 
} 

沒什麼特別的,只是實例化處理類。我的理解是,在這一點上,onCreate()方法將被調用,並且所有事情都會經過。

請記住,我沒有得到任何形式的SQLExceptionserrors

所以,我想這不是活動的onCreate()方法:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     DataBaseHandler handler = new DataBaseHandler(getApplicationContext()); 
     handler.populateMeasurementTable(); 
} 

我從一個SQLite瀏覽器中打開數據庫文件,而不是隻在那裏的表,但數據是在那裏以及.. 。

所以我的問題我想是在三個方面:

  • 簡直是實例數據庫處理程序不足以援引其onCreate()方法?因爲這就是爲什麼沒有創建表以及未插入數據的原因?
  • 如果實例化足以調用該方法,那爲什麼它不創建表並使用數據填充它。

在我猜測,第一個問題的回答(如果是有道理的)

  • 最後,對於第三個問題的那一刻,有我可以簡單的實例並有它的方式運行初始化方法?因爲這種填充方法是許多方法中的第一種,我不想在活動中調用它們,所以不覺得好的設計習慣正在進入。

回答

0

是簡單地實例化數據庫處理程序不足以調用其onCreate方法嗎?因爲這就是爲什麼不創建表以及未插入數據的原因?

是的,除了創建幫手,請致電getWritableDatabase()。如果數據庫文件不存在,則調用onCreate()回調。

調用getWritableDatabase()onCreate()或調用的方法有錯誤。你會得到一個關於遞歸調用的例外。如果您需要使用其他方法處理數據庫,請將db參數傳遞給onCreate()

參見:When is SQLiteOpenHelper onCreate()/onUpgrade() run?

如果實例化就足以調用的方法,那麼爲什麼沒有把它創建表並用數據填充它。

這還不夠。

最後,對於第三個問題,是否有一種方法,我可以簡單地實例化它並讓它運行初始化方法?因爲這種填充方法是許多方法中的第一種,我不想在活動中調用它們,所以不覺得好的設計習慣正在進入。

在數據庫幫助程序onCreate()中有數據庫人口。

+0

完美謝謝。 – user2405469