【问题标题】:Caused by: android.database.sqlite.SQLiteException: near "org": syntax error (code 1): , while compiling:引起:android.database.sqlite.SQLiteException:靠近“org”:语法错误(代码1):,编译时:
【发布时间】:2017-06-12 04:59:38
【问题描述】:

我正在尝试使用kotlin 中的anko 库创建表,如下所示

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

当我将AUTOINCREMENT 添加到 ID 时,我遇到了错误。它可以在没有AUTOINCREMENT 的情况下工作。使用anko 库将任何属性设为AUTOINCREMENT 的方法是什么。

  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)

【问题讨论】:

  • 添加字符串 PersonTable.ID ="you name and all";etc all here
  • @parikdhakan 你是什么意思?
  • 如果你看到我的代码,没有这样的东西。我相信AUTOINCREMENT 正在被org.jetbrains.anko.db.SqlTypeModifierImpl@7d0b905 取代
  • 删除AUTOINCREMENT没必要。
  • @JaydeepPatel 这就是我添加的原因。没有它也可以工作 这是他们图书馆中的错误吗?

标签: android sqlite kotlin anko


【解决方案1】:

您使用的似乎是过时版本的 Anko。 0.10 版本修复了连接修饰符的问题,并再次使用 0.10.1 版本恢复。

在代码的相关部分之前是"$modifier $m",其中$m 是修饰符的字符串表示形式。由于它没有定义toString() 方法,因此使用了实例的Java 表示。

修复后代码为"$modifiers ${m.modifier}"。这里${m.modifier}实际上是一个字符串。

如果最新修复与您无关,请使用版本 0.10

【讨论】:

  • 我正在使用compile "org.jetbrains.anko:anko-sqlite:0.10.1" 我认为这只是他们目前拥有的最新版本
  • 哦,由于某种原因,此版本的代码又出现了错误。使用 master 就可以了。
  • 你知道,如果我将一个属性设为 AUTOINCREMENT,那么它会抛出此错误 pastebin.com/S7q1M9rc 这也是一个错误
  • 我的意思是我正在尝试将表中的一个属性的属性设置为 AUTOINCREMENT 然后它会抛出此错误pastebin.com/S7q1M9rc 它应该可以工作。 PS 我现在不在 PRIMARY_KEY 上应用 AUTOINCREMENT
  • 它适用于master 和版本0.10。版本 0.10.1 有您的堆栈跟踪指出的问题。
【解决方案2】:

我遇到了同样的问题并找到了解决方法。我能够使用 SqlType.create 函数对 SQL 语句的那部分进行硬编码。

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

我在数据库浏览器中检查了生成的 SQL,它运行良好。从那以后我再也没有遇到过这个错误。

CREATE TABLE `crimes`(_id INTEGER PRIMARY KEY AUTOINCREMENT, uuid TEXT, title TEXT, date INTEGER, isSolved TEXT)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多