该文档指出,如果提供程序成功加载,我们应该返回true,否则返回false。在我的实现中,如果DatabaseHelper == null,我将返回false。
假设现在在onCreate中返回DatabaseHelper == null
和 false ,并在稍后的代码中的某处查询提供程序,仍在查询提供程序,因为它会崩溃。
我的问题是在ContentProvider的OnCreate中返回false有什么用? 在onCreate失败后,我应该如何处理查询?在查询中再次运行onCreate?
答案 0 :(得分:12)
在ContentProvider的OnCreate中返回false有什么用?
通过快速浏览Android源代码,我发现,就像现在一样,返回的内容并不重要,它会被忽略,再次至于现在。
在测试和ActivityThread
上,attachInfo
之后立即调用newInstance
,因此,如果您查看ContentProvider
来源at line 1058,则onCreate
是叫做和看起来像:
/**
* After being instantiated, this is called to tell the content provider
* about itself.
*
* @param context The context this provider is running in
* @param info Registered information about this content provider
*/
public void attachInfo(Context context, ProviderInfo info) {
/*
* We may be using AsyncTask from binder threads. Make it init here
* so its static handler is on the main thread.
*/
AsyncTask.init();
/*
* Only allow it to be set once, so after the content service gives
* this to us clients can't change it.
*/
if (mContext == null) {
mContext = context;
mMyUid = Process.myUid();
if (info != null) {
setReadPermission(info.readPermission);
setWritePermission(info.writePermission);
setPathPermissions(info.pathPermissions);
mExported = info.exported;
}
ContentProvider.this.onCreate();
}
}
请记住,如果文档说明了谁知道,也许这将在以后的版本中使用/修复。
在onCreate失败后如何处理查询?在查询中再次运行onCreate?
我会说是,不一定是onCreate
,而是你自己的方法初始化一次并确保你的DatabaseHelper
左右,这将是你最好的努力,我的意思是根据{{1 }}
您应该推迟非常重要的初始化(例如打开,升级和扫描数据库),直到使用内容提供程序
所以从技术上来说,你会按照预期的方式进行,但那里很安全,所以要安全。