我试图创建一个数据库,我需要我的数据库被创建,而我打开我的应用程序不被任何Onclick方法触发。我真的可以使用一些帮助?
我试图通过主类onCreate调用它,但它退出了应用程序。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DataBaseHelper dbh = new DataBaseHelper(MainActivity.this);
dbh.onCreate();
}
1条答案
按热度按时间vuktfyat1#
简而言之,不要试图调用
onCreate
方法,这样做会在数据库还没有创建的时候调用它,因此可能会得到一个空指针异常。更具体地说,当您示例化DataBaseHelper时,它实际上并不创建数据库,它只在您尝试访问数据库时创建数据库,并且在打开数据库的情况下调用
getWritableDatabase
或getReadableDatabase
。getReadableDatabase
将获得一个可写的数据库。细微的区别在于,getReadableDatabase可能在某些罕见的情况下返回一个只能读取的数据库。如果在打开数据库的过程中,数据库不存在,则在创建数据库**之后调用
onCreate
方法,**并且传递给onCreate
方法的SQLiteDatabase是一个现有数据库。然后,onCreate
方法允许您向数据库添加表、索引、视图、触发器。onCreate
之前,它将具有2个表sqlite_master(模式)和android_metadata(存储设备的区域设置),这些是系统表)。修复
不要调用
onCreate
方法,而是让SQLiteOpenHelper在需要时调用onCreate
方法。您可以使用
getWritableDatabase()
或getReadableDatabase()
强制执行此操作,而无需执行任何其他操作。例如,您可以有:-示范
下面是一个演示上述内容的示例。DataBaseHelper为:-
即一个非常基本的类,它扩展了SQLiteOpenhelper,而不是
doesDBExist
方法,检查作为数据库的基础文件是否存在,并记录结果。1.在创建单个表之前,
onCreate
方法从sqlite_master表(数据库模式)中提取现有组件。所使用的活动代码与您的类似,但有额外的方法调用/代码来记录信息:-
结果
作为新安装运行时,日志包含:-
getWritableDatabase
方法时,根据第二个集合,将自动调用onCreate
方法,并转储模式,唯一存在的表是android_metadata(实际上sqlite_master存在,并且它必须存在)。doesDBExist
的第二次调用显示该文件确实存在。onCreate
方法创建的。后续运行
如果应用程序再次运行,则日志包含:-
即,数据库存在并且已被保留/持久化。未调用
onCreate
(因为数据库现在存在)并且表存在。