未正确调用扩展ContentProvider的userDatabase的onCreate
以下是我的一些userBatabase代码:
public class userDatabase extends ContentProvider {
private MainDatabaseHelper mOpenHelper;
public userDatabase(){}
public static final class MainDatabaseHelper extends SQLiteOpenHelper{...}
@Override
public boolean onCreate() {
mOpenHelper = new MainDatabaseHelper(getContext());
return true;
}
@Override
public Uri insert(Uri uri, ContentValues values) {
long id = mOpenHelper.getWritableDatabase().insert("Users", null, values);
return Uri.withAppendedPath(CONTENT_URI, "" + id);
}
...
}
在我的主要活动中,我打电话:
userDatabase cpDatabase = new userDatabase();
但是当我尝试拨打cpDatabase.insert(userDatabase.CONTENT_URI, values);
调用mOpenHelper.getWritableDatabase().insert("Users", null, values);
时,插件内的所有内容都会崩溃。
我发现mOpenHelper.getWritableDatabase()
是问题所在,因为它本身不会运行,然后我发现这是因为mOpenHelper为空。
我在构造函数中实例化mOpenHelper,所以我认为它没有运行。一些日志消息确认了这一点,当我调用userDatabase cpDatabase = new userDatabase();
时,我的日志消息显示userDatabase()构造函数正常运行,但onCreate从未运行过,因此mOpenHelper从未实例化过。
(注意:有了这些日志消息,我注意到当我的应用程序启动时,我的userDatabase的构造函数和onCreate被调用。我不知道为什么或在哪里。我不明白为什么在我尝试创建之前运行它虽然它已经运行了,但是mOpenHelper仍然没有初始化,当我创建一个实例时,构造函数运行但是onCreate没有。)
可能会发生什么,以及如何让我的onCreate运行?
答案 0 :(得分:6)
由于您使用的是内容提供商,因此根据documentation
为所有注册的内容提供商调用此方法 应用程序启动时的应用程序主线程
您尝试使用内容提供商的方式似乎有误,并且 您无需手动实例化内容提供程序,一旦通过传递URI通过ContentResolver发出请求,系统将检查给定URI的权限并将请求传递给向权限注册的内容提供程序
例如
getContentResolver().delete(uri, null, null);
uri的位置,是要查询的完整URI。
This教程将指导您正确的方向