创建具有RANK()的视图时出现Android SQLite语法错误
我正在尝试使用RANK()窗口函数在SQLite中创建一个视图。当我执行以下代码时:创建具有RANK()的视图时出现Android SQLite语法错误,android,sqlite,android-sqlite,rank,Android,Sqlite,Android Sqlite,Rank,我正在尝试使用RANK()窗口函数在SQLite中创建一个视图。当我执行以下代码时: val txt = "CREATE VIEW VW_CAPITULOS_ORDER AS\n" + " SELECT id_libro, capitulo,\n" + " RANK() OVER (\n" + " ORDER
val txt = "CREATE VIEW VW_CAPITULOS_ORDER AS\n" +
" SELECT id_libro, capitulo,\n" +
" RANK() OVER (\n" +
" ORDER BY id_libro, CAST(SUBSTR(capitulo, 1, INSTR(capitulo||' ', ' ')) AS INTEGER)\n" +
" ) ranking\n" +
" FROM tbl_capitulos;\n"
db.execSQL(txt)
在运行时,我收到以下异常:
*E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.systango.bibliacatolica, PID: 20837
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.systango.bibliacatolica/com.systango.bibliacatolica.MainActivity}: android.database.sqlite.SQLiteException: near "(": syntax error (Sqlite code 1 SQLITE_ERROR): , while compiling: CREATE VIEW VW_CAPITULOS_ORDER AS
SELECT id_libro, capitulo,
RANK() OVER (
ORDER BY id_libro, CAST(SUBSTR(capitulo, 1, INSTR(capitulo||' ', ' ')) AS INTEGER)
) ranking
FROM tbl_capitulos;, (OS error - 11:Try again)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3897)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4076)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2473)
at android.os.Handler.dispatchMessage(Handler.java:110)
at android.os.Looper.loop(Looper.java:219)
at android.app.ActivityThread.main(ActivityThread.java:8349)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)
Caused by: android.database.sqlite.SQLiteException: near "(": syntax error (Sqlite code 1 SQLITE_ERROR): , while compiling: CREATE VIEW VW_CAPITULOS_ORDER AS
SELECT id_libro, capitulo,
RANK() OVER (
ORDER BY id_libro, CAST(SUBSTR(capitulo, 1, INSTR(capitulo||' ', ' ')) AS INTEGER)
) ranking
FROM tbl_capitulos;, (OS error - 11:Try again)
at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1030)
at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:637)
at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:610)
at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:66)
at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:33)
at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1899)
at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1817)*
*E/AndroidRuntime:致命异常:主
进程:com.systango.bibliacatolica,PID:20837
java.lang.RuntimeException:编译时无法启动活动组件信息{com.systango.bibliactolica/com.systango.bibliactolica.MainActivity}:android.database.sqlite.SQLiteException:近“(”:语法错误(sqlite代码1 sqlite错误):,创建视图VW_capitalulos_顺序为
选择id_libro、Capitalulo、,
秩()超过(
按id|libro排序,CAST(SUBSTR(capitulo,1,INSTR(capitulo | |‘,’))作为整数)
)排名
来自tbl_Capitalulos;,(操作系统错误-11:重试)
在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3877)上
在android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:4076)上
在android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:91)
在android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:149)中
在android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:103)中
在android.app.ActivityThread$H.handleMessage(ActivityThread.java:2473)
位于android.os.Handler.dispatchMessage(Handler.java:110)
位于android.os.Looper.loop(Looper.java:219)
位于android.app.ActivityThread.main(ActivityThread.java:8349)
位于java.lang.reflect.Method.invoke(本机方法)
位于com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:513)
位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1055)
导致原因:android.database.sqlite.SQLiteException:near“(”:语法错误(sqlite代码1 sqlite_错误):,编译时:创建视图VW_capitalulos_ORDER AS
选择id_libro、Capitalulo、,
秩()超过(
按id|libro排序,CAST(SUBSTR(capitulo,1,INSTR(capitulo | |‘,’))作为整数)
)排名
来自tbl_Capitalulos;,(操作系统错误-11:重试)
位于android.database.sqlite.SQLiteConnection.nativePrepareStatement(本机方法)
位于android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:1030)
位于android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:637)
位于android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:610)
位于android.database.sqlite.SQLiteProgram.(SQLiteProgram.java:66)
位于android.database.sqlite.SQLiteStatement.(SQLiteStatement.java:33)
位于android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1899)
位于android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1817)*
我怀疑这是安卓系统中的SQLite版本(在华为P40 Lite上检查版本3.22)或类似的问题。SQLite文档说窗口功能出现在版本3.25()。此脚本在SQLite应用程序的
DB浏览器中执行时不会出现问题。是否存在使用新版本SQLite的方法,以确保手机附带的版本?您的应用程序无法更改手机的SQLite版本。
作为一种解决方法,您可以使用相关子查询来模拟窗口函数RANK()
:
创建视图VW\u Capitalulos\u订单作为
选择c.id_libro,c.capitulo,
(
从tbl_Capitalulos中选择计数(*)
其中id_libro
请注意,您不需要将capitulo
的子字符串一直取到第一个'
才能将其转换为整数。
您可以通过添加0
来进行隐式转换感谢@forpas我将其用作一种变通方法,并可满足我的需要
CREATE VIEW VW_CAPITULOS_ORDER AS
SELECT c.id_libro, c.capitulo,
(
SELECT COUNT(*) FROM tbl_capitulos
WHERE id_libro < c.id_libro
OR (id_libro = c.id_libro AND (capitulo + 0) < (c.capitulo + 0))
) + 1 ranking
FROM tbl_capitulos c;