Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建具有RANK()的视图时出现Android SQLite语法错误_Android_Sqlite_Android Sqlite_Rank - Fatal编程技术网

创建具有RANK()的视图时出现Android 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

我正在尝试使用RANK()窗口函数在SQLite中创建一个视图。当我执行以下代码时:

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;