Anko: Caused by: android.database.sqlite.SQLiteException: near “org”: syntax error (code 1): , while compiling:

Created on 12 Jun 2017  ·  7Comments  ·  Source: Kotlin/anko

I am trying to create table using anko library in kotlin like below.

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

I am getting below error when I am adding AUTOINCREMENT to ID. It works without AUTOINCREMENT. What is the way to make any attribute as AUTOINCREMENT using anko library.

I am using compile "org.jetbrains.anko:anko-sqlite:0.10.1"

 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.acquirePreparedStatement(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)

Most helpful comment

The problem seems to occur whenever you use more than two modifiers, regardless of which ones.
For example INTEGER + AUTOINCREMENT works fine, so does PRIMARY_KEY + AUTOINCREMENT, but e.g. INTEGER + AUTOINCREMENT + PRIMARY_KEY causes this error as shown in the screenshot below.

image

I am using Kotlin version 1.1.3-2 and Anko version 0.10.1.

All 7 comments

I hit the same problem..
It seems that they didn't override toString() for SqlTypeModifier
tim 20170618222141

The same problem when trying to use UNIQUEmodifier

I got the same problem but found a workaround. I was able to hardcode that part of SQL.

PersonTable.ID to SqlType.create("INTEGER PRIMARY KEY AUTOINCREMENT"),

The problem seems to occur whenever you use more than two modifiers, regardless of which ones.
For example INTEGER + AUTOINCREMENT works fine, so does PRIMARY_KEY + AUTOINCREMENT, but e.g. INTEGER + AUTOINCREMENT + PRIMARY_KEY causes this error as shown in the screenshot below.

image

I am using Kotlin version 1.1.3-2 and Anko version 0.10.1.

image
I think the plus function should return return 'SqlTypeImpl(name, if (modifiers == null) m.modifier else "$modifiers $m.modifiers ")'

I got the same error while use anko with

kotlin_version = "1.1.4-3"
anko_version = "0.10.1"

but when I downgrade anko to below, everything goes well.

kotlin_version = '1.1.2-5'
anko_version = '0.10.0'

Fixed with a9fb477

Was this page helpful?
0 / 5 - 0 ratings