原因:android.database.sqlite.SQLiteException:near";org";:编译时出现语法错误(代码1):
我正在尝试使用原因:android.database.sqlite.SQLiteException:near";org";:编译时出现语法错误(代码1):,android,sqlite,kotlin,anko,Android,Sqlite,Kotlin,Anko,我正在尝试使用kotlin中的anko库创建表,如下所示 override fun onCreate(db: SQLiteDatabase?) { db!!.createTable(PersonTable.Name, true, Pair(PersonTable.ID, INTEGER + PRIMARY_KEY + AUTOINCREMENT), Pair(PersonTable.PersonName, TEXT),
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))
}
当我向ID添加AUTOINCREMENT
时,出现以下错误。它在没有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)
E/AndroidRuntime:致命异常:主
进程:com.williamsro.fourthdemo,PID:4799
java.lang.RuntimeException:无法启动活动组件信息{com.williamsro.fourthdemo/com.williamsro.fourthdemo.MainActivity}:android.database.sqlite.SQLiteException:靠近“org”:编译时出现语法错误(代码1)::如果不存在,则创建表`Person`(id)整型主键org.jetbrains.anko.db。SqlTypeModifierImpl@7d0b905、人名文本、域名文本、手机号码(实数);
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2646)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
位于android.app.ActivityThread.-wrap12(ActivityThread.java)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)上
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:154)
位于android.app.ActivityThread.main(ActivityThread.java:6077)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
原因:android.database.sqlite.SQLiteException:near“org”:编译时出现语法错误(代码1):如果不存在,则创建表`Person`(id INTEGER PRIMARY KEY org.jetbrains.anko.db)。SqlTypeModifierImpl@7d0b905、人名文本、域名文本、手机号码(实数);
位于android.database.sqlite.SQLiteConnection.nativePrepareStatement(本机方法)
位于android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
位于android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
位于android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
位于android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:58)
位于android.database.sqlite.SQLiteStatement.(SQLiteStatement.java:31)
位于android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1675)
位于android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1606)
位于org.jetbrains.anko.db.DatabaseKt.createTable(Database.kt:80)
位于com.williamsro.fourthdemo.AppDbHelpler.onCreate(AppDbHelpler.kt:17)
位于android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:251)
位于android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
在org.jetbrains.anko.db.ManagedSQLiteOpenHelper.openDatabase(Database.kt:166)上
在org.jetbrains.anko.db.ManagedSQLiteOpenHelper.use(Database.kt:157)上
在com.williamsro.fourthdemo.MainActivity.insertPerson上(MainActivity.kt:44)
在com.williamsro.fourthdemo.MainActivity.onCreate上(MainActivity.kt:72)
位于android.app.Activity.performCreate(Activity.java:6664)
位于android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2599)上
位于android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2707)
位于android.app.ActivityThread.-wrap12(ActivityThread.java)
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:1460)上
位于android.os.Handler.dispatchMessage(Handler.java:102)
位于android.os.Looper.loop(Looper.java:154)
位于android.app.ActivityThread.main(ActivityThread.java:6077)
位于java.lang.reflect.Method.invoke(本机方法)
在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)上
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
看起来您使用的是过时的Anko版本。版本0.10修复了连接修饰符的问题,并再次使用版本0.10.1恢复
在此之前,代码的相关部分是“$modifier$m”
,其中$m
是修饰符的字符串表示形式。由于它没有定义toString()
方法,因此使用实例的Java表示形式
在修复过程中,代码是“$modifiers${m.modifier}”
。这里${m.modifier}
实际上是一个字符串
如果最新的修复程序与您无关,请使用0.10版。我也遇到了同样的问题,并找到了解决方法。我能够使用
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
)
}
我在DB浏览器中检查了生成的SQL,它工作得很好。从那以后,我再也没有遇到过这个错误
CREATE TABLE `crimes`(_id INTEGER PRIMARY KEY AUTOINCREMENT, uuid TEXT, title TEXT, date INTEGER, isSolved TEXT)
添加字符串PersonTable.ID=“您的姓名和全部”等等here@parikdhakan你是什么意思?如果你看到我的代码,就没有这样的了。我相信
AUTOINCREMENT
正在被org.jetbrains.anko.db所取代。SqlTypeModifierImpl@7d0b905
removeAUTOINCREMENT
这是不必要的。@jaydeppatel这是必要的,这就是我添加的原因。它在没有它的情况下工作就是这个bug他们的库?我正在使用编译“org.jetbrains.anko:anko sqlite:0.10.1”
我认为这只是他们现在拥有的最新版本哦,出于某种原因,此版本的代码再次出现错误。使用master也可以。您知道,如果我使一个属性自动递增,那么它会抛出此错误。这也是一个错误。我的意思是,我试图将表中一个属性的属性设置为自动递增,然后行此错误它应该可以工作。PS我现在没有在主键上应用自动增量它可以与master
和版本0.10
一起工作。版本0.10.1<