android - open - sqlitedatabase db getwritabledatabase();
¿Cuándo se ejecuta SQLiteOpenHelper onCreate()/onUpgrade()? (13)
Desinstala tu aplicación desde el emulador o dispositivo. Ejecutar la aplicación de nuevo. (OnCreate () no se ejecuta cuando la base de datos ya existe)
He creado mis tablas en mi SQLiteOpenHelper
onCreate()
pero recibo
SQLiteException: no such table
o
SQLiteException: no such column
errores ¿Por qué?
NOTA:
(Este es el resumen amalgamado de decenas de preguntas similares cada semana. Intentar proporcionar una pregunta / respuesta de wiki comunitaria "canónica" aquí para que todas esas preguntas puedan ser dirigidas a una buena referencia).
El método de Sqliteopenhelper tiene métodos de creación y actualización, la creación se utiliza cuando se crea una tabla por primera vez y se llama al método de actualización cada vez que se cambia el número de columnas de la tabla.
El nombre de la base de datos debe terminar con .db; también las cadenas de consulta deben tener un terminador (;)
Para agregar puntos perdidos aquí, según la solicitud de Jaskey
La versión de la SQLite
datos se almacena dentro del archivo de SQLite
datos SQLite
.
la captura es el constructor
SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
Entonces, cuando se llama al constructor auxiliar de la base de datos con un name
(2do parámetro), la plataforma verifica si la base de datos existe o no, y si existe la base de datos, obtiene la información de la versión del encabezado del archivo de la base de datos y activa la llamada correcta.
Como ya se explicó en la respuesta anterior, si la base de datos con el nombre no existe, activa onCreate
.
A continuación la explicación explica el caso onUpgrade
con un ejemplo.
Digamos que su primera versión de la aplicación tenía el DatabaseHelper
(extendiendo SQLiteOpenHelper
) con el constructor que pasa la versión como 1
y luego proporcionó una aplicación actualizada con el nuevo código fuente que tiene la versión pasada como 2
, y luego automáticamente cuando se construye el DatabaseHelper
, la plataforma se activa onUpgrade
Ver el archivo ya existe, pero la versión es inferior a la versión actual que ha pasado.
Ahora digamos que planea dar una tercera versión de la aplicación con la versión db como 3
(la versión db se incrementa solo cuando se va a modificar el esquema de la base de datos). En dichas actualizaciones incrementales, debe escribir la lógica de actualización de cada versión de forma incremental para obtener un mejor código de mantenimiento.
Ejemplo de pseudo código a continuación:
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
switch(oldVersion) {
case 1:
//upgrade logic from version 1 to 2
case 2:
//upgrade logic from version 2 to 3
case 3:
//upgrade logic from version 3 to 4
break;
default:
throw new IllegalStateException(
"onUpgrade() with unknown oldVersion " + oldVersion);
}
}
Observe la declaración de break
falta en los casos 1
y 2
. Esto es lo que quiero decir con actualización incremental.
Diga si la versión anterior es 2
y la nueva es 4
, entonces la lógica actualizará la base de datos de 2
a 3
y luego a 4
Si la versión anterior es 3
y la nueva es 4
, solo ejecutará la lógica de actualización de 3
a 4
Puede ser que sea demasiado tarde, pero me gustaría compartir mi corta y dulce respuesta. Por favor, compruebe la Answer para un mismo problema. Definitivamente te ayudará. No más especificaciones profundas.
Si tiene confianza en la sintaxis para crear una tabla, entonces puede ocurrir cuando agregue una nueva columna en su misma tabla, para eso ...
1) Desinstala tu dispositivo y vuelve a ejecutarlo.
O
2) Configuración -> aplicación -> ClearData
O
3) Cambie DATABASE_VERSION
en su clase "DatabaseHandler" (Si ha agregado una nueva columna, se actualizará automáticamente)
public DatabaseHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
O
4) Cambie DATABASE_NAME
en su clase "DatabaseHandler" (enfrenté el mismo problema. Pero tengo éxito al cambiar DATABASE_NAME
).
Puedes crear bases de datos y tablas como
public class DbHelper extends SQLiteOpenHelper {
private static final String DBNAME = "testdatbase.db";
private static final int VERSION = 1;
public DbHelper(Context context) {
super(context, DBNAME, null, VERSION);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("create table BookDb(id integer primary key autoincrement,BookName text,Author text,IssuedOn text,DueDate text,Fine text,Totalfine text");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS BookDb");
onCreate(db);
}
}
Nota: si desea crear otra tabla o agregar columnas o no agregar dicha tabla, simplemente incremente la VERSIÓN
Puntos a recordar al extender SQLiteOpenHelper
-
super(context, DBName, null, DBversion);
- Se debe invocar la primera línea del constructor. - anular
onCreate
yonUpgrade
(si es necesario) -
onCreate
se invocará solo cuando segetWritableDatabase()
ogetReadableDatabase()
. Y esto solo se invocará una vez cuando unDBName
especificado en el primer paso no esté disponible. Puede agregar crear consulta de tabla en el métodoonCreate
- Cuando quiera agregar una nueva tabla, simplemente cambie la
DBversion
y realice las consultas en la tabla deonUpgrade
o simplemente desinstale y luego instale la aplicación.
Si olvida proporcionar una cadena de "nombre" como segundo argumento al constructor, se crea una base de datos "en memoria" que se borra al cerrar la aplicación.
Vuelva a verificar su consulta en su clase DatabaseHandler / DatabaseManager (la que haya tomado)
no se encontró tal tabla principalmente cuando no ha abierto la clase SQLiteOpenHelper
con getwritabledata()
y antes de esto, también debe llamar a make constructor con databasename & version. Y se llama a OnUpgrade
siempre que haya un valor de actualización en el número de versión dado en la clase SQLiteOpenHelper
.
A continuación se muestra el fragmento de código (no se encontró tal columna debido a un hechizo en el nombre de la columna):
public class database_db {
entry_data endb;
String file_name="Record.db";
SQLiteDatabase sq;
public database_db(Context c)
{
endb=new entry_data(c, file_name, null, 8);
}
public database_db open()
{
sq=endb.getWritableDatabase();
return this;
}
public Cursor getdata(String table)
{
return sq.query(table, null, null, null, null, null, null);
}
public long insert_data(String table,ContentValues value)
{
return sq.insert(table, null, value);
}
public void close()
{
sq.close();
}
public void delete(String table)
{
sq.delete(table,null,null);
}
}
class entry_data extends SQLiteOpenHelper
{
public entry_data(Context context, String name, SQLiteDatabase.CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
}
@Override
public void onCreate(SQLiteDatabase sqdb) {
// TODO Auto-generated method stub
sqdb.execSQL("CREATE TABLE IF NOT EXISTS ''YOUR_TABLE_NAME''(Column_1 text not null,Column_2 text not null);");
}
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
onCreate(db);
}
}
SQLiteOpenHelper
onCreate()
y onUpgrade()
se invocan las devoluciones cuando la base de datos se abre realmente, por ejemplo, mediante una llamada a getWritableDatabase()
. La base de datos no se abre cuando se crea el objeto auxiliar de la base de datos.
SQLiteOpenHelper
versiones de los archivos de base de datos. El número de versión es el argumento int
que se pasa al constructor . En el archivo de la base de datos, el número de versión se almacena en PRAGMA user_version
.
onCreate()
solo se ejecuta cuando el archivo de base de datos no existe y se acaba de crear. Si onCreate()
devuelve correctamente (no lanza una excepción), se supone que la base de datos se creará con el número de versión solicitado. Como implicación, no debería capturar SQLException
s en onCreate()
usted mismo.
onUpgrade()
solo se llama cuando el archivo de base de datos existe pero el número de versión almacenado es inferior al solicitado en el constructor. El onUpgrade()
debe actualizar el esquema de la tabla a la versión solicitada.
Al cambiar el esquema de la tabla en el código ( onCreate()
), debe asegurarse de que la base de datos esté actualizada. Dos enfoques principales:
Elimine el archivo de base de datos anterior para que se ejecute de nuevo
onCreate()
. A menudo, esto se prefiere en el momento del desarrollo donde tiene el control sobre las versiones instaladas y la pérdida de datos no es un problema. Algunas formas de eliminar el archivo de base de datos:Desinstalar la aplicación. Utilice el administrador de aplicaciones o
adb uninstall your.package.name
de shell.Borrar datos de la aplicación. Utilice el administrador de aplicaciones.
Incremente la versión de la base de datos para que se
onUpgrade()
. Esto es un poco más complicado ya que se necesita más código.Para las actualizaciones de esquema de tiempo de desarrollo donde la pérdida de datos no es un problema, solo puede usar
execSQL("DROP TABLE IF EXISTS <tablename>")
para eliminar sus tablas existentes y llamar aonCreate()
para recrear la base de datos.Para las versiones publicadas, debe implementar la migración de datos en
onUpgrade()
para que los usuarios no pierdan sus datos.
onCreate()
Cuando creamos una base de datos por primera vez (es decir, la base de datos no existe)
onCreate()
crea una base de datos con la versión que se pasa enSQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)
onCreate()
métodoonCreate()
es crear las tablas que ha definido y ejecutar cualquier otro código que haya escrito. Sin embargo, este método solo se llamará si falta el archivo SQLite en el directorio de datos de su aplicación (/data/data/your.apps.classpath/databases
).No se llamará a este método si ha cambiado su código y lo ha relanzado en el emulador. Si desea que se
onCreate()
, debe usar adb para eliminar el archivo de base de datos SQLite.
onUpgrade()
-
SQLiteOpenHelper
debería llamar al super constructor. - El método
onUpgrade()
solo se llamará cuando el entero de la versión sea más grande que la versión actual que se ejecuta en la aplicación. - Si desea que se
onUpgrade()
al métodoonUpgrade()
, necesita incrementar el número de versión en su código.
onCreate se llama por primera vez cuando se necesita la creación de tablas. Necesitamos anular este método donde escribimos el script para la creación de tablas que se ejecuta con SQLiteDatabase. Método execSQL. Después de ejecutar la implementación por primera vez, este método no se llamará en adelante.
onUpgrade Se llama a este método cuando se actualiza la versión de la base de datos. Supongamos que para la primera implementación, la versión de la base de datos era 1 y en la segunda implementación hubo un cambio en la estructura de la base de datos, como agregar una columna adicional en la tabla. Supongamos que la versión de la base de datos es 2 ahora.