onCreate () не вызывается getWritableDatabase () - PullRequest
11 голосов
/ 23 сентября 2011

Я пишу базу данных в моем приложении для Android, но мои таблицы не создаются. Я добавил точки останова в свой метод onCreate, и моя getWriteableDatabase, и getWritableDatabase вызывается, но onCreate нет.

package com.fslade.app;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "applicationdata";
    private static final int DATABASE_VERSION = 1;
    public static final String DATABASE_TABLE = "peopleT";

    // Database creation sql statement
    private static final String DATABASE_CREATE = "create table " + DATABASE_TABLE + " (_id integer primary key autoincrement, "
            + "company_name text not null, name text not null, city text not null, vertical text not null, title text not null, email text not null, bio text not null, photo text not null, status text not null);";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    // Method is called during creation of the database
    @Override
    public void onCreate(SQLiteDatabase database) {
        database.execSQL(DATABASE_CREATE);
    }

    // Method is called during an upgrade of the database, e.g. if you increase
    // the database version
    @Override
    public void onUpgrade(SQLiteDatabase database, int oldVersion,
            int newVersion) {
        Log.w(DatabaseHelper.class.getName(),
                "Upgrading database from version " + oldVersion + " to "
                        + newVersion + ", which will destroy all old data");
        database.execSQL("DROP TABLE IF EXISTS todo");
        onCreate(database);
    }
}

И в моем помощнике по базе данных я вызываю getWriteableDatabse ():

package com.fslade.app;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;

public class ContentStorageHelper {
    public static final String KEY_ID = "_id";
    public static final String KEY_COMPANY_NAME = "company_name";
    public static final String KEY_PERSON_NAME = "name";
    public static final String KEY_CITY = "city";
    public static final String KEY_VERTICAL = "vertical";
    public static final String KEY_TITLE = "title";
    public static final String KEY_EMAIL = "email";
    public static final String KEY_BIO = "bio";
    public static final String KEY_PHOTO = "photo";
    public static final String KEY_STATUS = "status";

    private static final String[] COLUMNS = { KEY_ID, KEY_COMPANY_NAME,
            KEY_PERSON_NAME, KEY_CITY, KEY_VERTICAL, KEY_TITLE, KEY_EMAIL,
            KEY_BIO, KEY_PHOTO, KEY_STATUS };

    private Context context;
    private SQLiteDatabase database;
    private DatabaseHelper dbHelper;

    public ContentStorageHelper(Context context) {
        this.context = context;
    }

    public ContentStorageHelper open() throws SQLException {
        dbHelper = new DatabaseHelper(context);
        database = dbHelper.getWritableDatabase();
        // dbHelper.onCreate(database);
// I added this onCreate() to see if it helped, but when I ran it
// it said that the database had already been created
        return this;
    }

    public void close() {
        dbHelper.close();
    }

/**
 * Create a new person If the person is successfully created return the new
 * rowId for that person, otherwise return a -1 to indicate failure.
 */
public long createPerson(String company_name, String name, String city,
        String vertical, String title, String email, String bio,
        String photo, String status) {
    ContentValues initialValues = createContentValues(company_name, name,
            city, vertical, title, email, bio, photo, status);

    return database.insert(DatabaseHelper.DATABASE_TABLE, null,
            initialValues);
}

/**
 * Return a Cursor over the list of all people in the database
 * 
 * @return Cursor over all notes
 */
public Cursor fetchPeopleByVertical(String vertical) {
    String selection = KEY_VERTICAL+"="+vertical;
        Cursor result = database.query(DatabaseHelper.DATABASE_TABLE, COLUMNS,
                selection, null, null, null, null);
        return result;
    }

    private ContentValues createContentValues(String company_name, String name,
            String city, String vertical, String title, String email,
            String bio, String photo, String status) {
        ContentValues values = new ContentValues();
        values.put(KEY_COMPANY_NAME, company_name);
        values.put(KEY_PERSON_NAME, name);
        values.put(KEY_CITY, city);
        values.put(KEY_VERTICAL, vertical);
        values.put(KEY_TITLE, title);
        values.put(KEY_EMAIL, email);
        values.put(KEY_BIO, bio);
        values.put(KEY_PHOTO, photo);
        values.put(KEY_STATUS, status);
        System.out.print("test: " + status);
        return values;
    }
}

Ответы [ 5 ]

18 голосов
/ 23 сентября 2011

Создание происходит только один раз (в этом весь смысл помощника по базе данных).

Вы проверили, была ли создана ваша база данных? Он расположен на /data/data/your.package.name/databases/dbname.

Если вы очистите данные приложения в настройках приложения для Android, ваш onCreate должен быть вызван снова ...

10 голосов
/ 06 августа 2013

Это довольно глупое ограничение реализации. :-) Убедитесь, что имя базы данных имеет расширение .db. onCreate() не будет вызываться, если у него нет расширения.

0 голосов
/ 08 июня 2017

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

0 голосов
/ 13 марта 2013

У меня была такая же проблема. Я финансирую 2 решения

  1. Перезапустите эмулятор и установите флажок «Очистить данные пользователя». Мой эмулятор медленно перезагружается, так что ...
  2. Измените номер версии вашей базы данных, и он снова будет называться «OnCreate» и даст мне краткую версию моей базы данных. Я потерял сохраненную информацию (нет большой сделки)

Удачи

0 голосов
/ 16 октября 2011

SQLiteOpenHelper.onCreate() вызывается после SQLiteOpenHelper.getWritableDatabase() (или после SQLiteOpenHelper.getReadableDatabase()), только если база данных не существует в постоянном хранилище приложения (т. Е. SD-карта).Другими словами, onCreate() вызывается только один раз, если код успешно создает базу данных, которая хранится в постоянном хранилище.Если база данных существует в постоянном хранилище, но вы меняете ее схему,

вы используете SQLiteOpenHelper.onUpgrade(), который вызывается при открытии базы данных по имени, но с номером версии, который ранее не использовался,В котором вы отбрасываете старые объекты схемы, а затем в котором вы можете вызвать SQLiteOpenHelper.onCreate(), чтобы создать новую схему.И если вы хотите запускать код всякий раз, когда база данных открыта (код, вызванный SQLiteOpenHelper.get[Writable,Readable]Database()), внедрите onOpen().Затем вызовите метод, который инициализирует вашу базу данных (или код, инициализированный для вашей базы данных), который вызывается из каждого из SQLiteOpenHelper.onCreate() и SQLiteOpenHelper.onOpen().

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

В каждом из

SQLiteOpenHelper.onCreate(SQLiteDatabase db)

и

SQLiteOpenHelper.onOpen(SQLiteDatabase db)

вызовите что-то вроде

void initDB(SQLiteDatabase db)
{
    this.db = db;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...