MyContentProvider.onCreate() не вызывается?

OnCreate моей userDatabase, которая расширяет ContentProvider, не вызывается должным образом

Вот часть моего кода 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 так и не был создан.

(Примечание: с этими сообщениями журнала я заметил, что конструктор и onCreate для моей userDatabase вызывались при запуске моего приложения. Я понятия не имею, почему и где. Я не понимаю, почему это было запущено до того, как я попытался создать экземпляр. и даже несмотря на то, что он был запущен, mOpenHelper все еще не был инициализирован, и когда я создал экземпляр, конструктор запустился, а onCreate - нет.)

Что может произойти и как запустить onCreate?


person Martin Osorio    schedule 29.09.2012    source источник


Ответы (1)


Поскольку вы используете поставщиков контента, согласно документации

Этот метод вызывается для всех зарегистрированных поставщиков содержимого в основном потоке приложения во время запуска приложения.

И то, как вы пытаетесь использовать поставщика содержимого, кажется неправильным, и вам не нужно вручную создавать экземпляр поставщика содержимого после того, как вы сделали запрос через ContentResolver, передавая URI, система проверяет центр данного URI и передает запрос поставщику контента, зарегистрированному в центре.

Например

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

Где находится uri, полный URI для запроса.

Этот учебник направит вас в правильном направлении

person code-jaff    schedule 29.09.2012