2011-09-23 24 views
11

Estoy escribiendo una base de datos en mi aplicación de Android, pero mis tablas no se están creando. Agregué puntos de interrupción en mi método onCreate, y se llama a mi getWriteableDatabase, y getWritableDatabase, pero onCreate no.onCreate() no es llamado por getWritableDatabase()

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

Y en mi ayudante de la base de datos que llamo 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; 
    } 
} 
+1

No se ha llamado al posible duplicado del método [SQLiteOpenHelper: onCreate() de Android. ¿Por qué?] (Http://stackoverflow.com/questions/6791852/android-sqliteopenhelper-oncreate-method-is-not-called-why) – Machavity

Respuesta

18

La creación sólo ocurre una vez (eso es todo el sentido de un ayudante de base de datos).

¿Comprobó si su base de datos se había creado? Está ubicado en /data/data/your.package.name/databases/dbname.

Si borra los datos de aplicación en los parámetros de la aplicación para Android, su onCreate debería ser llamado de nuevo ...

+0

Este es exactamente el problema. Ya había ejecutado en Create anteriormente en el desarrollo, pero con un comando de creación sql mal formado. ¿Cómo borro la configuración de la aplicación en Eclipse? – Francesca

+0

No entiendo por qué quieres hacer en eclipse ya que no hay nada cambiado porque es solo tu código. Si desea eliminar los datos de la aplicación existente del dispositivo, vaya a 'Configuración de Android> Aplicación> Administrar aplicaciones> Su aplicación> Eliminar datos' (lo siento si los nombres no coinciden, mi menú está en alemán) – Knickedi

+0

En caso de que no lo haga desea eliminar todos los datos de la aplicación (si hay otras bases de datos que funcionan bien que no desea eliminar, por ejemplo) Recomiendo entrar a través de Android Debug Monitor y eliminar solo el archivo de base de datos SQLite ofensivo. Esto funcionó como un encanto para mí cuando estaba en esta posición. – Godsmith

0

SQLiteOpenHelper.onCreate() se llama de vuelta después de SQLiteOpenHelper.getWritableDatabase() (o después SQLiteOpenHelper.getReadableDatabase()) sólo cuando la base de datos no existe en la aplicación de almacenamiento persistente (es decir, tarjeta SD). En otras palabras, onCreate() se llama solo una vez, si el código crea con éxito una base de datos, que se almacena en un almacenamiento persistente. Si la base de datos existe en almacenamiento persistente, pero está cambiando su esquema,

, utiliza SQLiteOpenHelper.onUpgrade(), que se devuelve cuando abre una base de datos por nombre pero con un número de versión que no se utilizó anteriormente. En el que suelta los objetos del esquema anterior y luego puede llamar al SQLiteOpenHelper.onCreate() para crear su nuevo esquema. Y si desea ejecutar código cada vez que se abre la base de datos (código devuelto por SQLiteOpenHelper.get[Writable,Readable]Database()), implemente onOpen(). A continuación, llame a un método que inicialice su base de datos (o código inicializado en contra de su base de datos) que se llama desde cada uno de SQLiteOpenHelper.onCreate() y SQLiteOpenHelper.onOpen().

Por ejemplo, es posible que desee utilizar una referencia al SQLiteDatabase, contra la cual llamar a los métodos de gestión de datos como SQLiteDatabase.execSQL().

En cada uno de

SQLiteOpenHelper.onCreate(SQLiteDatabase db) 

y

SQLiteOpenHelper.onOpen(SQLiteDatabase db) 

llamada algo así como

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

Hay otros eventos objeto ciclo de vida que de devolución de llamada manipuladores en el código que se debe manejar, como Android realiza varias tareas en su proceso. Pero como mínimo su código de manejo de base de datos tiene que manejar SQLiteOpenHelper.onCreate() y SQLiteOpenHelper.onOpen().

0

Tuve el mismo problema. Yo el fondo 2 soluciones

  1. Reiniciar el emulador y comprobar 'Wipe usuario de datos' Mi emulador es lento reinicio así que ...
  2. cambiar el número de versión de su base de datos y se llama 'OnCreate' de nuevo y me dio una versión curret de mi base de datos.He perdido la información almacenada (sin gran cosa)

buena suerte

10

Es una limitación aplicación bastante estúpida. :-) Asegúrese de que el nombre de la base de datos tenga una extensión .db. onCreate() no se llamará si no tiene extensión.

+1

wow ... ¡muchas gracias! ¡Esto me estaba volviendo loco! ... ¡Estúpido de hecho! – Mahm00d

+1

Ni siquiera dentro de la Documentación de Android. El ejemplo que tienen no lo tiene. http://developer.android.com/training/search/search.html – Neta

+0

¡WOOOOOOOOOOW THX TANTO! ¡Esto me estaba volviendo loco! +1 amigo, rulz –

0

Estaba teniendo el mismo problema. Había olvidado un espacio entre dos comandos sql en mi cadena SQL_Create y la columna que necesitaba no se implementó correctamente, pero cuando encontré y solucioné el error en la cadena, no solucionó el problema, porque la aplicación ya registró esa base de datos como teniendo esa tabla. Entonces onCreate nunca fue llamado. Para mí, la solución más simple fue actualizar el número de versión. Esto creó un nuevo db y una tabla (correctamente) y arregló la aplicación.

Cuestiones relacionadas