Android table creation Fallo (cerca de "autoincrement": error de sintaxis)?
public static final String MYDATABASE_NAME = "MY_DATABASE"; public static final String MYDATABASE_TABLE = "MY_TABLE"; public static final String MYDATABASE_TABLE2 = "MY_TABLE2"; public static final int MYDATABASE_VERSION = 1; public static final String KEY_ID = "_id"; public static final String KEY_ID2 = "_id2"; public static final String KEY_CONTENT1 = "Content1"; public static final String KEY_CONTENT2 = "Content2"; public static final String KEY_CONTENT3 = "Content3"; //create table MY_DATABASE (ID integer primary key, Content text not null); private static final String SCRIPT_CREATE_DATABASE = "create table " + MYDATABASE_TABLE + " (" +KEY_ID + " integer primary key autoincrement, " + KEY_CONTENT1 + " text not null);"; private static final String SCRIPT_CREATE_DATABASE2 = "create table " + MYDATABASE_TABLE2 + " (" + KEY_ID2 + " integer autoincrement, " + KEY_CONTENT2 + " text not null, " + KEY_CONTENT3 + " text not null, " + " FOREIGN KEY ("+KEY_ID2+") REFERENCES "+MYDATABASE_TABLE+" ("+KEY_ID+"));";
No puedo averiguar lo que da el siguiente error, por favor, ayúdame a dar las gracias.
09-29 13: 41: 19.760: ERROR / Database (334): Fallo 1 (cerca de "autoincrement": error de sintaxis) en 0x218df0 al preparar 'create table MY_TABLE2 (_id2 autoincremento entero, Content2 texto no nulo, FOREIGN KEY (_id2) REFERENCIAS MY_TABLE (_id)); '.
- La base de datos Sqlite debe crearse una sola vez
- Restricción de clave externa ON DELETE CASCADE no funciona en la base de datos sqlite en android
- Rowid en SQLite3 y Android
- ¿Rellenar la base de datos de Android desde el archivo CSV?
- Cómo obtener nombres de columna con datos de consulta en sqlite3?
09-29 13: 41: 19.770: DEBUG / AndroidRuntime (334): Apagado de VM
09-29 13: 41: 19.770: WARN / dalvikvm (334): threadid = 1: hilo que sale con excepción no captada (grupo = 0x4001d800)
09-29 13: 41: 19.791: ERROR / AndroidRuntime (334): EXCEPCIÓN FATAL: main
09-29 13: 41: 19.791: ERROR / AndroidRuntime (334): java.lang.RuntimeException: No se puede iniciar la actividad ComponentInfo {sep.com/sep.com.SepActivity}: android.database.sqlite.SQLiteException: cerca de "autoincrement ": Error de sintaxis: create table MY_TABLE2 (_id2 entero autoincrement, Content2 texto no nulo, Content3 texto no nulo, FOREIGN KEY (_id2) REFERENCIAS MY_TABLE (_id));
- Consulta del proveedor de contenido de Android cláusula IN
- Primera vez Cursor Operación es tan lento, cuando la consulta de datos a granel. ¿Cómo resolver?
- Alterar el campo único de la tabla
- Android SQLite ON CONFLICT UPDATE es posible?
- Ejecución de varias sentencias con SQLiteDatabase.execSQL
- SQLite3 FTS4, MATCH y Android
- Flushing y base de datos SQLite en android
- Las transacciones en la base de datos no funcionan en android
En resumen: In SQLite a column declared INTEGER PRIMARY KEY will autoincrement.
No existe una palabra clave de autoincrement
en SQLite, por eso está recibiendo un error.
Puede obtener más información sobre las preguntas frecuentes de SQLite .
EDIT: sólo escribir integer primary key
es suficiente. SQLite
aumentará automáticamente sus ids
.
EDIT2: Su método onUpgrade()
debería tener este aspecto:
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (newVersion > oldVersion) { Log.w("MyAppTag","Updating database from version " + oldVersion + " to " + newVersion + " .Existing data will be lost."); db.execSQL("DROP TABLE IF EXISTS " + MY_TABLE); db.execSQL("DROP TABLE IF EXISTS " + MY_TABLE2); onCreate(db); }
Esta:
+ KEY_ID2 + " integer autoincrement, "
Debe ser esto:
+ KEY_ID2 + " integer primary key autoincrement, "
Si sigue los diagramas de sintaxis de CREATE TABLE
, verá que el autoincrement
sólo debe aparecer después de primary key
.
Si desea _id2
ser una clave extranjera, entonces no desea que sea el incremento automático en todo sin embargo.
Una respuesta anterior dice que 'no hay autoincrement palabra clave en SQLite.' Esto es incorrecto. Hay una palabra clave llamada "autoincrement" y lo usé en la clave principal.
Por ejemplo:
static final String CREATE_LOCATION_TABLE="CREATE TABLE Location"+ "( LocationID INTEGER PRIMARY KEY AUTOINCREMENT," + " RestuarantID int not null," + " Latitude float not null," + " Longitude float not null)";
También asegúrese de que al introducir datos en esta tabla utilice la palabra clave 'null' en el lugar de la clave principal.
Me gusta esto:
static final String INSERT_LOCATION= "Insert into Location values" + "(null,1002,6.905369,79.851514)";
Tres cosas:
- Retire el arrastrero; De las declaraciones.
- Añadir restricción de "clave primaria" a la columna de autoincremento
- Elimine el autoincremento de las columnas de PK – esto sucederá automáticamente.
sqlite> CREATE TABLE app (a INTEGER PRIMARY KEY NOT NULL, B VARCHAR); sqlite> insert into app (b) values (''); sqlite> insert into app (b) values ('a'); sqlite> sqlite> insert into app (b) values ('b'); sqlite> insert into app (b) values ('c'); sqlite> insert into app (b) values ('d'); sqlite> select * from app; 1| 2|a 3|b 4|c 5|d sqlite> exit;
NOTA: En SQLite no hay AUTOINCREMENT
palabra clave AUTOINCREMENT
. Por lo tanto, sólo tiene que utilizar INTEGER PRIMARY KEY NOT NULL
. Insertará automáticamente el valor incrementado para el atributo.