2011-05-13 27 views
5

estoy realmente luchando con el uso de la SqlLite en mi aplicación;SQLite Android ¿Dónde y cuándo inicializar SQLiteOpenHelper

He creado una clase de ayuda base de datos que se extiende desde SQLiteOpenHelper

public class DatabaseHelper extends SQLiteOpenHelper { 

En el OnCreate estoy creando unos 6 mesas:

public void onCreate(SQLiteDatabase db) { 
db.execSQL("CREATE TABLE myTestTable (Id INTEGER PRIMARY KEY , " 
      + "info TEXT," + 
      + "TopLeft TEXT")); <-- example insert 

} 

Cuando mi aplicación se inicia estoy al analizar algunos xml y ingresando los datos en la tabla, y he verificado la base de datos y todo está allí y mis tablas se crearon correctamente.

Cuando voy a llamar a los datos que se han ido! Tengo muchas consultas diferentes dentro de mi clase dbhelper y en cada actividad estoy iniciando la clase para poder acceder a mi función dentro de la clase.

Supongo que esta no es la manera de hacerlo, ya que ejecuta mi oncreate nuevamente y borra todas mis tablas (o al menos esto es cuando parece estar haciendo mientras verifico la base de datos después de intentar llamar datos de y que está vacío!

que estaba bajo la impresión de que el alcrear sólo funcionaba una vez, pero esto obviamente no es el caso, ya que parece ser la recreación de mi cada vez que DB y limpiando mis datos!

¿Dónde están destinados a inicializar la clase del dbhelper y ¿cómo dejar que recrear las tablas? necesito los datos a persistir incluso cuando la aplicación se cierra!

¡Estoy confundido!

Si esto no tiene sentido por favor las preguntas específicas sobre cómo puedo aclararlo!

ACTUALIZACIÓN

He descubierto que puedo agregar

CREATE TABLE IF NOT EXISTS 

que para que la recreación de las tablas, pero todavía no parece estar bien llamando al alcrear cada vez ..

+0

Buena pregunta y espero que alguien se le ocurre una respuesta, por lo que su "inserción" sin embargo, estás marcando la transacción exitosa antes de cerrar la base de datos? –

+0

¿Decidir que su clase es estática soluciona el problema? –

+0

@DAVE G Definitivamente, todos los datos van a la base de datos. ¿Tengo intención de cerrar la base de datos después de la inserción? Actualmente solo lo hace: \t SQLiteDatabase db = this.getWritableDatabase(); .... cotejando todos los datos y haciendo: db.insert ("TABLENAME", null, cv); ... y eso es el final? – Bex

Respuesta

2

¿Podría ponerle una clase de envoltura alrededor?

public class DbAdapter 
{ 

    // database details 
    private static final String DATABASE_NAME = "dbname"; 
    private static final int DATABASE_VERSION = 1; 

    // where we're running 
    private final Context mCtx; 

    private static class DatabaseHelper extends SQLiteOpenHelper 
    { 
    DatabaseHelper(Context context) 
    { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) 
    { 
     // your initial database create statements go here 
     db.execSQL(DATABASE_CREATE); 
    } 

    // if you need to recreate the database, you just up the version number 
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 
    { 
     // drop commands for each table goes here 
     db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); 
     onCreate(db); 
    } 
    } 

    public DbAdapter(Context ctx) 
    { 
    this.mCtx = ctx; 
    } 

    public DbAdapter open() throws SQLException 
    { 
    mDbHelper = new DatabaseHelper(mCtx); 
    mDb = mDbHelper.getWritableDatabase(); 
    return this; 
    } 

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

    // other database methods can go here 
} 
0

no estoy seguro de lo que entendemos por la declaración -

"cada actividad I; m re initilizing la clase para que pueda obtener en mi función dentro de la clase ".

En cada actividad donde se necesita tener acceso a la base de datos, todo lo que tiene que hacer es abrir la base de datos, el acceso/actualizar los datos de las tablas, y cerrar el manejador.

Ha visto esto sencilla aplicación de ejemplo Bloc de notas -

NotePad sample app by Google

puede ser que le ayudará

1

onCreate() método se llama sólo la primera vez que se intenta que acceder a la base de datos y no se crea. Entonces onCreate() se llamará solo una vez. getWritableDatabase devuelve un objeto db y llamará al onCreate() si es necesario. NotePadProvider da un buen ejemplo de cómo usar SQLiteOpenHelper.

+0

Cuando dice la primera vez que accede a la base de datos, ¿quiere decir alguna vez o durante la "sesión" actual? – Bex

+0

Quiero decir cada vez ... –

+0

El enlace a la aplicación de muestra NotePad está roto. ¿Alguna idea de dónde se movió? – syonip

0

El código de inicialización de la base de datos debe ir en el método onCreate de su asistente. De los javadocs SQLiteOpenHelper android:

/** 
* Called when the database is created for the first time. This is where the 
* creation of tables and the initial population of the tables should happen. 
* 
* @param db The database. 
*/ 
public abstract void onCreate(SQLiteDatabase db); 
Cuestiones relacionadas