我正在使用SQLite Asset Helper库来处理设置和升级我的应用程序数据库的繁琐工作。它工作得非常好,但不幸的是我还没有找到一种方法来通知用户何时库:
A) 首次加载数据库(通过从 \assets\databases\ 文件夹中解压缩)
或者
B) 升级数据库(使用 \assets\datates 中升级的数据库文件中的信息)
我尝试将此代码放在我的应用程序的主 Activity.onCreate() 中,认为我可以在主线程上加载数据库(如果它不存在),同时使用不可关闭的 AlertDialog 分散用户的注意力:
File dbFile=this.getDatabasePath("gShoJMDict");
Boolean dbExists = dbFile.exists();
Log.i("ActivityStartScreen", String.valueOf(dbExists));
if(!dbExists)
{
DialogFirstRun dialogFirstRun = new DialogFirstRun();
dialogFirstRun.show(getSupportFragmentManager(), "dialogFirstRun");
dialogFirstRun.setCancelable(false);
DictHelper helper = new DictHelper(this);
helper.getReadableDatabase();
helper.close();
dialogFirstRun.dismiss();
}
不幸的是,SQLite Asset Helper 似乎在 onCreate() 之前检查数据库是否存在(基于 LogCat 条目),因此当上述代码块运行时,数据库已经存在,因此对话框永远不会出现。
我正在使用 ContentProvider,并且我已经验证我只是从 query() 或 update() 中调用 getReadableDatabase()。我的 ContentProvider 的 onCreate() 看起来像这样......
@Override
public boolean onCreate()
{
// Load our database
gdb = new JMDictHelper(getContext());
return true;
}
...但尽管移动gdb = new JMDictHelper(getContext());进入 query() 或 update(),SQLite Asset Helper 库仍然会在我通知用户之前加载数据库。
在这种情况下我可以做些什么来拦截数据库的初始设置或升级并通知用户应用程序正忙于执行这些任务?现在,该应用程序只是坐在那里,直到库完成之前什么都不做——这对于测试来说很好,因为我知道可以期待它,但是当我准备好让应用程序上线时,我不能就这样离开它。