Android SQLiteOpenHelper: почему метод onCreate() не вызывается?

Я пытаюсь сделать свой первый Android приложение. Я заметил, что SQLiteOpenHelper.onCreate() метод не вызывается для создания таблиц, если база данных не существует. Однако onCreate() метод не работал, даже думал, что я пытался отладить.

пожалуйста, посмотрите на ниже код и дайте мне какие-либо предложения. Любая помощь будет оценена.

public class NameToPinyinActivity extends Activity {

    DatabaseOpenHelper helper = null;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.nametopinyin);

        Button searchButton = (Button) findViewById(R.id.search);
        searchButton.setOnClickListener(new ButtonClickListener());

        helper = new DatabaseOpenHelper(NameToPinyinActivity.this);
    }

public class DatabaseOpenHelper extends SQLiteOpenHelper {

    /** DB Name */
    private static final String DB_NAME = "pinyin";

    /** CREATE TABLE SQL */
    private static final String CREATE_TABLE_SQL = "CREATE TABLE UNICODE_PINYIN"
            + "(ID INTEGER PRIMARY KEY AUTOINCREMENT, "
            + "UNICODE TEXT NOT NULL, PINYIN TEXT NOT NULL)";

    public DatabaseOpenHelper(Context context) {
        super(context, DB_NAME, null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.beginTransaction();
        try {
            db.execSQL(CREATE_TABLE_SQL);
            db.setTransactionSuccessful();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            db.endTransaction();
        }
    }

8 ответов


у меня также были проблемы с SQLiteOpenHelper. Что сработало для меня, так это хранение переменной-члена

SQLiteDatabase db;

в подклассе SQLiteOpenHelper и вызов

 db = getWritableDatabase();

в конструкторе.

ответ на этот вопрос также включает полезную информацию:SQLiteOpenHelper не удается вызвать onCreate?

надеюсь, это поможет!


пока вы не вызовете метод getWritableDatabase() или getReadableDatabase() of SQLiteOpenHelper класс, база данных не будет создана.

так же просто, как эта база данных будет создана в памяти, когда вам это действительно нужно.:)


У меня была аналогичная проблема, когда onCreate не был выполнен. Может быть, это кому-то пригодится, хотя это оказалось другой проблемой.

Я работал над базой данных раньше и уже создал ее задолго до этого. Итак, теперь после внесения изменений в onCreate () я надеялся найти новые созданные таблицы. Но SQLiteOpenHelper больше никогда не вызывал onCreate (). Причина была в том, что база данных уже существовала. Я все еще работал с тем же устройством, что и раньше, и следовательно, с уже существующей (старой) базе данных.

но есть надежда. Когда система видит, что база данных с таким именем уже существует, она также проверяет правильность номера версии. В таком случае я просто забыл о существовании базы данных. Моим решением было просто изменить номер версии. Поэтому onUpgrade() назывался предложением опций для изменений onCreate ().

таким образом, параметры были либо удалить полное приложение (и с ним базу данных) или позвонить onCreate снова после обновления номера версии (и, например, удаления) старой таблицы и повторного вызова onCreate ().

в любом случае, если onCreate() не вызывается, проверьте дважды, существует ли база данных. В противном случае он не вызывается снова.


У меня была та же проблема.. решение для меня было добавить .db как расширение имени базы данных


у меня была аналогичная проблема, однако это не было OnCreate вызов это была проблема.

В приведенном выше примере кода, Кевин пояснил, что OnCreate не вызывается, если база данных уже существует. Однако если, как и я, вы используете несколько таблиц из отдельных действий, то, хотя вы, возможно, уже создали базу данных, таблица, связанная с этим действием, возможно, еще не была создана. Следовательно, когда вы пытаетесь установить данные курсора в несуществующей таблице, вы будете вызвать исключение.

моим решением было определить отдельный класс под названием CreateTable который называется как из OnCreate переопределить и из конструктора после

db = getWritableDatabase();


в моем случае он не вызывался, потому что база данных уже существовала! Поэтому, если это возможно, обязательно удалите приложение и установите его обратно, а затем проверьте, вызывается оно или нет.


проверьте, существует ли файл db, затем откройте экземпляр базы данных с возможностью записи, вызвав

dbinstance.getWritableDatabase()


вы можете изменить автоинкремент to АВТОИНКРЕМЕНТ

Примечание SQLiteOpenHelper Под Названием onCreate при создании базы данных в первый раз. Если вы создаете таблицу в методе onCreate, вы не можете создать new SQLiteDatabase. Вы можете увидеть пример

    @Override
    public void onCreate(SQLiteDatabase db) {
        String stringCreateTable = "CREATE TABLE "+"tblUser"+" ( " +
                "id TEXT PRIMARY KEY, " +
                "name TEXT )";
        db.execSQL(stringCreateTable);
    }