Causado por: android.database.sqlite.SQLiteException: cerca de "org": error de syntax (código 1):, al comstackr:

Estoy tratando de crear una tabla utilizando la biblioteca anko en kotlin como a continuación

 override fun onCreate(db: SQLiteDatabase?) { db!!.createTable(PersonTable.Name, true, Pair(PersonTable.ID, INTEGER + PRIMARY_KEY + AUTOINCREMENT), Pair(PersonTable.PersonName, TEXT), Pair(PersonTable.Domain, TEXT), Pair(PersonTable.MobileNumber, REAL)) } 

Estoy obteniendo el error debajo cuando agrego AUTOINCREMENT a ID. Funciona sin AUTOINCREMENT . ¿Cuál es la forma de hacer cualquier atributo como AUTOINCREMENT utilizando la biblioteca anko ?

  E/AndroidRuntime: FATAL EXCEPTION: main Process: com.williamsro.fourthdemo, PID: 4799 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.williamsro.fourthdemo/com.williamsro.fourthdemo.MainActivity}: android.database.sqlite.SQLiteException: near "org": syntax error (code 1): , while compiling: CREATE TABLE IF NOT EXISTS `Person`(id INTEGER PRIMARY KEY org.jetbrains.anko.db.SqlTypeModifierImpl@7d0b905, person_name TEXT, domain TEXT, mobile_number REAL); at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) Caused by: android.database.sqlite.SQLiteException: near "org": syntax error (code 1): , while compiling: CREATE TABLE IF NOT EXISTS `Person`(id INTEGER PRIMARY KEY org.jetbrains.anko.db.SqlTypeModifierImpl@7d0b905, person_name TEXT, domain TEXT, mobile_number REAL); at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) at android.database.sqlite.SQLiteConnection.acquirePrepanetworkingStatement(SQLiteConnection.java:889) at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500) at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31) at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1675) at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1606) at org.jetbrains.anko.db.DatabaseKt.createTable(Database.kt:80) at com.williamsro.fourthdemo.AppDbHelpler.onCreate(AppDbHelpler.kt:17) at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:251) at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163) at org.jetbrains.anko.db.ManagedSQLiteOpenHelper.openDatabase(Database.kt:166) at org.jetbrains.anko.db.ManagedSQLiteOpenHelper.use(Database.kt:157) at com.williamsro.fourthdemo.MainActivity.insertPerson(MainActivity.kt:44) at com.williamsro.fourthdemo.MainActivity.onCreate(MainActivity.kt:72) at android.app.Activity.performCreate(Activity.java:6664) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707) at android.app.ActivityThread.-wrap12(ActivityThread.java) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6077) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

Parece que estás usando una versión obsoleta de Anko. Con la versión 0.10, un problema con los modificadores de concatenación fue corregido y revertido con la versión 0.10.1 nuevamente.

Antes de la parte relevante del código era "$modifier $m" donde $m es la representación de cadena del modificador. Como no define un método toString() , se usa la representación de Java de la instancia.

Con la corrección, el código es "$modifiers ${m.modifier}" . Aquí ${m.modifier} es en realidad una cadena.

Si las últimas correcciones no son relevantes para usted, simplemente use la versión 0.10 .

Tengo el mismo problema y encontré una solución. Pude codificar esa parte de la statement SQL utilizando la function SqlType.create .

 override fun onCreate(db: SQLiteDatabase) { db.createTable(CrimeTable.TABLE_NAME, true, CrimeTable.ID to SqlType.create("INTEGER PRIMARY KEY AUTOINCREMENT"), CrimeTable.UUID to TEXT, CrimeTable.TITLE to TEXT, CrimeTable.DATE to INTEGER, CrimeTable.IS_SOLVED to TEXT ) } 

Comprobé el SQL generado en el browser DB y funcionaba perfectamente. Nunca más volví a tener ese error desde entonces.

 CREATE TABLE `crimes`(_id INTEGER PRIMARY KEY AUTOINCREMENT, uuid TEXT, title TEXT, date INTEGER, isSolved TEXT) 
  • Por qué las entidades Room no funcionan con properties inmutables en Android
  • No se puede acceder a BaseColumns proporciona la propiedad _ID en Kotlin
  • IlegalStateException donde se lanzó, al intentar recuperar los valores de la instancia de RoomDatabase
  • Implementación de SQLite en Kotlin y Anko
  • Base de datos de android de Kotlin: no se puede convertir java.lang.String en android.database.Cursor