我最近在SQLiteDatabase
和SQLiteOpenHelper
课上练习了很多,有些东西让我感到很困惑。
我有constructor
和onCreate()
方法:
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()
方法,并且一切都会贯彻。
请注意,我没有获得任何类型的SQLExceptions
或errors
。
所以我在活动的onCreate()
方法中尝试了这个:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
DataBaseHandler handler = new DataBaseHandler(getApplicationContext());
handler.populateMeasurementTable();
}
我在SQLite
浏览器中打开了数据库文件,不仅表格在那里,而且数据也在那里......
所以我想我的问题有三个方面:
onCreate()
方法吗?因为这就是为什么不创建表以及没有插入数据的原因?目前我猜第一个问题有答案(如果有意义的话)
答案 0 :(得分:0)
仅仅实例化数据库处理程序还不足以调用其onCreate方法吗?因为这就是为什么没有创建表以及没有插入数据的原因?
是的,除了创建助手之外,请致电getWritableDatabase()
。如果数据库文件不存在,则调用onCreate()
回调。
在getWritableDatabase()
中调用onCreate()
或从中调用的方法存在错误。你会得到一个关于递归调用的例外。将db
参数传递给onCreate()
,以防您需要使用其他方法处理数据库。
另请参阅:When is SQLiteOpenHelper onCreate() / onUpgrade() run?
如果实例化足以调用该方法,那么为什么不创建表并用数据填充它。
这还不够。
最后针对第三个问题,有没有一种方法可以简单地实例化它并让它运行初始化方法?因为populate方法是众多中的第一个,我不想在活动中调用它们,所以感觉不适合进入。
将数据库填充在数据库助手onCreate()
中。