4

我的扩展 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);调用时,所有内容都在 insert 内崩溃。

我发现这mOpenHelper.getWritableDatabase()是问题所在,因为它甚至无法自行运行,然后我发现这是因为 mOpenHelper 为空。

我在构造函数中实例化 mOpenHelper,所以我认为它没有运行。一些日志消息证实了这一点,当我调用userDatabase cpDatabase = new userDatabase();我的日志消息时,显示 userDatabase() 构造函数运行正常,但 onCreate 从未运行,因此 mOpenHelper 从未实例化。

(注意:通过这些日志消息,我注意到我的 userDatabase 的构造函数和 onCreate 在我的应用程序启动时被调用。我不知道为什么或在哪里。我不明白为什么在我尝试创建实例之前运行它。和即使它运行了,mOpenHelper 仍然没有初始化,当我创建一个实例时,构造函数运行但 onCreate 没有。)

可能会发生什么,我怎样才能让我的 onCreate 运行?

4

1 回答 1

7

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

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

而且您尝试使用内容提供者的方式似乎是错误的,您不需要手动实例化内容提供者,一旦您通过ContentResolver通过传递 URI 发出请求,系统就会检查给定 URI 的权限并将请求传递给在授权中注册的内容提供者。

例如

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

uri 在哪里,要查询的完整 URI。

教程将引导您朝着正确的方向前进

于 2012-09-29T03:19:43.853 回答