2012-09-03 14 views
10

Estoy haciendo una aplicación de base de datos, y mi programa funciona y he entendido la mayor parte del tutorial que he seguido. Sin embargo, un aspecto no me queda claro.SQLiteOpenHelper: ¿cómo se crea la base de datos?

Hay una clase interna de MyDBHelper que extiende SQLiteOpenHelper. Las variables externas incluyen SQLiteDatabase denominada d. El código para MyDBHelper es:

private static class MyDBHelper extends SQLiteOpenHelper { 
     MyDBHelper(Context c) { 
      super(c, DB_NAME, null, DB_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      try { 
       db.execSQL(DATABASE_CREATE); 
      } catch (SQLException e) { 
       e.printStackTrace(); 
      } 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVers, int newVers) { 
      Log.w(TAG, "Upgrading database from version " + oldVers + " to " + newVers + ", which will destroy all old data."); 
      db.execSQL("DROP TABLE IF EXISTS GM"); 
      onCreate(db); 
     } 
    } 

Mi pregunta es cómo crea esto realmente la base de datos inicial. Ocurre en el método onCreate(), pero hasta donde puedo ver, esto es nunca llamado. Entiendo que se llama cuando la base de datos se crea por primera vez, pero ¿dónde? Y, además, ¿cómo se pasa un SQLiteDatabase db? No he pasado ninguna base de datos al método. ¿Y cómo está mi variable SQLiteDatabase db de external clase establecida en la base de datos creada? ¿Podría alguien hablarme de esto como un idiota?

Respuesta

7

onCreate() y onUpgrade() métodos realmente se llaman la primera vez cuando se crea Db. En hechos, se comprueba en getReadableDatabase() or getWritebleDatabase() métodos de SQLiteOpenHelper. Verificará si el DB ya existe en el directorio de datos y cuál es su versión. De acuerdo con esto, llamará al onCreate(), or onUpgrade(). O nada, si existe el archivo db y la versión correcta.

Puede buscar el código para ejecutar myDBHelper.getReadable(Writable)Database(). Ese es el momento en que se realizará esta verificación.

Háganme saber si necesita más información. Buena suerte

0

Probablemente, en getReadableDatabase() o getWriteableDatabase() cuando son llamados por primera vez


3

Tenga en cuenta que se está extendiendo SQLiteOpenHelper, toda la magia que sucede en esta super clase, en concreto la base de datos es inicialmente creado (o simplemente reabierto) cuando llama a getReadableDatabase() o getWritableDatabase(). Estos dos métodos:

  • definir la variable SQLiteDatabase db (y el control pasa db a sus métodos de devolución de llamada)
  • Inicializar db llamando a su método onCreate(db) o abrir la base de datos existente
  • Compruebe el número de versión y llame a su onUpgrade(db) o si es necesario onDowngrade(db)

también llamar a algunos más métodos de devolución de llamada como onConfigure(db), onOpen(db), etc. (Read more acerca de estos métodos.) Si le sirve de ayuda, puede leer el the source code para comprender la estructura de cómo y cuándo ocurre todo esto.

1

El método onCreate() no es un constructor para esta clase. se llama a onCreate cuando se crea el DB.

Aquí PeopleDB extiende SQLiteOpenHelper.Este código es de una clase diferente y onCreate se llama cuando getWritableDatabase() o getReadableDatabase(), o algo por el estilo se llama

PeopleDB db = null; //onCreate NOT called here 
    db=new PeopleDB(getContext()); 
    db.getWritableDatabase(); //onCreate is called here! 

Espero que ayude.

1

Ver nuestra base de datos se crea en el propio constructor dehelperthelper, no en el método onCreate reemplazado. En el método onCreate estamos activando una consulta para crear una tabla en la base de datos que se crea en el constructor de open helper para insertar los datos que no crean la base de datos.

Una cosa más es que el objeto SQLiteDatabase no se instancia en la clase SQLiteOpenHelper. Se instancia en la clase en la que desea utilizar la base de datos para realizar operaciones de DB y allí necesita escribir una función como esta para inicializar o abrir su base de datos para prepararse para la inserción.

SQLiteDatabase database; 

YourOpenHelper yourOpenHelper=new YourOpenHelper(); //to creating database using openhelper and automatically call onCreate to make a table in that 

    public void open() throws SQLException { 
      database = profiloHelper.getWritableDatabase(); 
     } 

Aquí está el código que tiene que escribir para cualquier operación en la base de datos como la eliminación de inserción nada, sólo hay que cambiar el CONSULTA

SQLiteStatement insert_stmt = null; 

     try { 
      insert_stmt = database.compileStatement(YOUR_QUERY); 

      insert_stmt.bindString(1, field1); 
      insert_stmt.bindString(2, field2); 
      insert_stmt.executeInsert(); 
     } 
     finally { 
      if (insert_stmt != null) insert_stmt.close(); 
     } 
0

Se crea una subclase implementar onCreate (SQLiteDatabase), ONUPGRADE (SQLiteDatabase, int, int) y opcionalmente onOpen (SQLiteDatabase), y esta clase se encarga de abrir la base de datos si existe, crearla si no es así y actualizarla según sea necesario. (Sitio web del desarrollador de Android)

0

La clase SQLiteOpenHelper se llama "Ayuda" por un buen motivo. Nos ahorra a los escritores de aplicaciones un esfuerzo considerable.

El primera vez que llamegetWritableDatabase (o getReadableDatabase) para su implementación de SQLiteOpenHelper, su estado de super en su constructor pasa la corriente Context y la base de datos NAME que prefiere el constructor de la superclase para SQLiteOpenHelper.

El constructor de la superclase configura el espacio inicial para su SQLiteDatabase y le asigna el nombre que pasó a través de super.

Al finalizar, el constructor de la superclase llama al onCreate y pasa el nombre SQLiteDatabase que creó a través del único parámetro onCreate. Dado que onCreate solo se llama esta vez, es un muy buen lugar para llamar al execSQL para definir la estructura de su base de datos.

Las ejecuciones posteriores de getReadableDatabase (o getWritableDatabase) simplemente abren la base de datos para usted y nunca más vuelven a llamar al onCreate. (Cuando el constructor de la superclase señala que super ha enviado un número de versión diferente, onUpgrade es la calle.)

Entender la forma SQLiteOpenHelper crea una base de datos sin código obvio y cómo diablos onCreate se pasa un argumento "de la nada", fue una verdadera tarea para mí. Ahora no puedo creer que haya sido difícil.

Cuestiones relacionadas