Android SQLiteOpenHelper: почему метод onCreate () не вызывается? - PullRequest
50 голосов
/ 22 июля 2011

Я пытаюсь сделать свое первое приложение для 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();
        }
    }

Ответы [ 9 ]

58 голосов
/ 22 июля 2011

У меня также были проблемы с SQLiteOpenHelper .Для меня работало хранение переменной-члена

SQLiteDatabase db;

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

 db = getWritableDatabase();

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

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

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

23 голосов
/ 27 февраля 2013

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

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

6 голосов
/ 21 мая 2017

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

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

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

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

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

1 голос
/ 10 октября 2016

У меня была похожая проблема, но проблема была не в OnCreate.

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

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

db = getWritableDatabase();

0 голосов
/ 18 мая 2019

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

@Override
public void onCreate(SQLiteDatabase db) {
    try {
        Log.d(LOG_TAG, "A table is created with this SQL-String: " + SQL_CREATE + " angelegt.");
        db.execSQL(SQL_CREATE);
    }
    catch (Exception ex) {
        Log.e(LOG_TAG, "Error when creating table: " + ex.getMessage());
    }
}

Это моя исправленная строка SQL:

enterpublic static final String SQL_CREATE =
        "CREATE TABLE " + TABLE_VOCAB_LIST +
                "(" + COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                COLUMN_GERMAN + " TEXT NOT NULL, " +
                COLUMN_SPANISH + " INTEGER NOT NULL, "+
                COLUMN_LEVEL + " INTEGER NOT NULL);)"; code here

Я забыл одно пустое место, и когда я добавил его, все работало нормально.

0 голосов
/ 26 июня 2018

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

dbinstance.getWritableDatabase ()

0 голосов
/ 15 марта 2018

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

0 голосов
/ 20 мая 2017

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

0 голосов
/ 12 октября 2015

Вы можете изменить AUTOINCREMENT на AUTO INCREMENT

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

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