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);が呼び出されると、挿入内ですべてがクラッシュします。

それ自体でも実行できないため、それが問題であることがわかりmOpenHelper.getWritableDatabase()ました。その後、mOpenHelper が null であることが原因であることがわかりました。

コンストラクターで mOpenHelper をインスタンス化するので、実行されていないことがわかります。ログ メッセージを呼び出すuserDatabase cpDatabase = new userDatabase();と、userDatabase() コンストラクターは正常に実行されましたが、onCreate は実行されなかったため、mOpenHelper はインスタンス化されませんでした。

(注: これらのログ メッセージで、アプリの開始時に userDatabase のコンストラクターと onCreate が呼び出されたことに気付きました。理由や場所がわかりません。インスタンスを作成する前に、なぜこれが実行されたのかわかりません。実行されたにもかかわらず、mOpenHelper はまだ初期化されておらず、インスタンスを作成したときにコンストラクターは実行されましたが、onCreate は実行されませんでした。)

どうすれば onCreate を実行できますか?

4

1 に答える 1

7

ドキュメントによると、コンテンツプロバイダーを使用しているため、

このメソッドは、アプリケーションの起動時に、アプリケーションのメイン スレッドで登録されているすべてのコンテンツ プロバイダに対して呼び出されます。

また、コンテンツ プロバイダーの使用方法が間違っているようで、コンテンツ プロバイダーを手動でインスタンス化する必要はありません。URIを渡すことで ContentResolver を介して要求を行うと、システムは指定された URI の権限を検査し、オーソリティに登録されているコンテンツ プロバイダにリクエストを渡します。

例えば

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

uri は、クエリする完全な URI です。

このチュートリアルは正しい方向にあなたを導きます

于 2012-09-29T03:19:43.853 に答える