MyContentProvider.onCreate()没有被调用?

时间:2012-09-29 02:27:51

标签: java android database android-contentprovider sqliteopenhelper

未正确调用扩展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运行?

1 个答案:

答案 0 :(得分:6)

由于您使用的是内容提供商,因此根据documentation

  

为所有注册的内容提供商调用此方法   应用程序启动时的应用程序主线程

您尝试使用内容提供商的方式似乎有误,并且 您无需手动实例化内容提供程序,一旦通过传递URI通过ContentResolver发出请求,系统将检查给定URI的权限并将请求传递给向权限注册的内容提供程序

例如

getContentResolver().delete(uri, null, null);

uri的位置,是要查询的完整URI。

This教程将指导您正确的方向

相关问题