Android SQLiteOpenHelper: ¿por Qué onCreate() es un método que no llama?

Estoy tratando de hacer mi primera aplicación para Android. Me di cuenta de que la SQLiteOpenHelper.onCreate() método no está llamado a crear las tablas si la base de datos no existe. Sin embargo, la onCreate() método no funciona, incluso pensé que trató de depuración.

Por favor mirar el código de abajo y darme alguna sugerencia. Cualquier ayuda será apreciada.

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();
        }
    }
  • intenta poner una instrucción de registro y ver? ¿Qué hace usted seguro de que el onCreate() se llama? Si usted establecer puntos de interrupción, que no suelen llegar a ese método en la base de datos auxiliar, en mi observación.
InformationsquelleAutor zono | 2011-07-22

9 Kommentare

  1. 59

    También he tenido problemas con la SQLiteOpenHelper. Lo que funcionó para mí fue el almacenamiento de una variable de miembro de

    SQLiteDatabase db;

    En el SQLiteOpenHelper subclase y llamadas

     db = getWritableDatabase();

    en el constructor.

    La respuesta a esta pregunta también incluye información útil: SQLiteOpenHelper no llame onCreate?

    Espero que esto ayude!

    • Sí! tiene usted razón! Yo podría hacer la base de datos y la referencia que usted ha mencionado es muy útil. Gracias!
    • db = getWritableDatabase(); – para mí sólo se activa onUpgrade, pero no onCreate. Cualquier sugerencias ?
    • Eso significa que la base de datos ya está creada. Sólo si la base de datos no existe, se onCreate() se llama.
    • getDatabase called recursively
    • Tan pronto como he añadido esta línea de código db = getWritableDatabase();, onCreate trabajado y crear la base de datos.
  2. 24

    Hasta que se llama al método getWritableDatabase() o getReadableDatabase() de SQLiteOpenHelper de la clase, de la base de datos no se creará.

    tan simple como que la base de datos se crea en la memoria cuando realmente lo necesito.:)

  3. 6

    He tenido un problema similar donde onCreate no fue ejecutado. Tal vez esto sea de alguna utilidad para alguien, incluso a pesar de que resultó ser un problema diferente.

    Yo estaba trabajando en la base de datos antes y se había creado ya un largo tiempo antes. Así que ahora, después de hacer los cambios en onCreate() tenía la esperanza de encontrar las nuevas tablas creadas. Pero el SQLiteOpenHelper nunca llamó onCreate() de nuevo. La razón fue, la base de datos ya existente. Yo todavía estaba trabajando con el mismo dispositivo como antes y, en consecuencia, con la ya existente (viejo) databse.

    Pero hay esperanza. Cuando el sistema detecta una base de datos con ese nombre ya existe, también comprueba si el número de versión es correcta. En ese caso simplemente me olvidé de la base de datos ya existente. Mi solución fue simplemente cambiar el número de versión. Así onUpgrade() fue llamado ofreciendo opciones para onCreate() cambia.

    Por lo que las opciones eran o desinstalación de la aplicación completa (y con él, la base de datos) o llame al onCreate de nuevo después de actualizar el número de versión (por ejemplo, la caída de la mesa de edad y llamando onCreate() de nuevo.

    En cualquier caso, si onCreate() no es llamado, a verificar si existe la base de datos. De lo contrario, no se le llama de nuevo.

    • Muy bonito solución! Yo también se ha desinstalado la aplicación un par de veces antes de ver esto. 🙂
  4. 1

    Tuve un problema similar, sin embargo no fue el OnCreate llame ese era el problema.

    En el ejemplo de código anterior, Kevin explicó que el OnCreate no se llama a si la base de datos ya existe. Sin embargo, si, como yo, usted, el uso de varias tablas a partir de las actividades por separado, aunque puede que haya creado la base de datos, la tabla asociada con esta actividad aún no han sido creados. Por lo tanto, cuando se intenta establecer el cursor de datos en una tabla inexistente, se le invocar una excepción.

    Mi solución fue definir una clase separada llamada CreateTable que es llamado, tanto desde el OnCreate anular y desde el constructor después de la

    db = getWritableDatabase();

  5. 0

    Tuve el mismo problema.. la resolución para mí fue agregar .db como la ampliación de la base de datos nombre de

  6. -1

    En mi caso, no estaba siendo llamado porque la base de datos ya existía! Así que, si es posible, asegúrese de eliminar la aplicación y a instalar de nuevo y sólo a continuación, compruebe si se llama o no.

  7. -1

    Comprobar si el archivo de base de datos existen, a continuación, abra la escritura de la instancia de la base de datos llamando

    dbinstance.getWritableDatabase()

  8. -1

    Tuve el mismo problema cuando parecía que el onCreate no fue ejecutado. Yo pensaba así, porque mis registros no se han mostrado. Resultó que había algo mal con los espacios en blanco en mi SQL_create Cadena.

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

    Este es mi corregido SQL-Cadena:

    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

    Me había olvidado un espacio en blanco y cuando he añadido todo funcionaba bien.

  9. -2

    Puede cambiar AUTOINCREMENT a INCREMENTO AUTOMÁTICO

    Nota
    SQLiteOpenHelper Llamado onCreate cuando la base de datos se crea por primera vez. Si usted crear la tabla en el método onCreate usted no puede crear nuevos SQLiteDatabase. Usted puede ver el ejemplo

    JS:

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

    • «puede cambiar AUTOINCREMENT de INCREMENTO AUTOMÁTICO» Sin ti no puedo!!

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea