2017-06-12 71 views
2

我想在kotlin創建使用anko庫表像下面造成的:android.database.sqlite.SQLiteException:近「組織」:語法錯誤(代碼1):在編譯:

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 [email protected], 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 [email protected], 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) 
+0

添加字符串PersonTable.ID =「你的名字和所有」;等所有在這裏 –

+0

@parikdhakan你是什麼意思? –

+0

如果你看到我的代碼,就沒有這種東西。我相信'AUTOINCREMENT'正在被'org.jetbrains.anko.db.SqlTypeModifierImpl @ 7d0b905'取代' –

回答

2

看起來你正在使用安口的過時的版本。使用版本0.10連接修飾符的問題已修復,並再次使用版本0.10.1恢復。

之前代碼的相關部分是"$modifier $m"其中$m是修飾符的字符串表示形式。由於它沒有定義toString()方法,因此使用了該實例的Java表示形式。

隨着修復代碼是"$modifiers ${m.modifier}"。這裏${m.modifier}實際上是一個字符串。

如果最新的修補程序與您無關,只需使用版本0.10

+0

我使用'編譯同樣的錯誤「org.jetbrains.anko:ANKO-sqlite的:0.10.1」我'認爲這只是他們現在的最新版本 –

+0

哦,出於某種原因,這個代碼在這個版本中再次出錯。與_master_,但沒關係。 – tynn

+0

你知道,如果我做一個屬性AUTOINCREMENT那麼它拋出這個錯誤https://pastebin.com/S7q1M9rc這也是一個錯誤 –

1

我得到了同樣的問題,並找到了解決方法。我能夠使用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) 
相關問題