Подтвердить что ты не робот

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();
        }
    }
4b9b3361

Ответ 1

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

SQLiteDatabase db;

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

 db = getWritableDatabase();

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

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

Ответ 4

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

Ответ 5

У меня была аналогичная проблема, но проблема была не в вызове OnCreate.

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

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

db = getWritableDatabase();

Ответ 6

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

Ответ 7

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

dbinstance.getWritableDatabase()

Ответ 8

У меня была такая же проблема, когда казалось, что 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

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

Ответ 9

Вы можете изменить 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);
    }