sqlite 中的“TYPE_FORWARD_ONLY”错误

Posted

技术标签:

【中文标题】sqlite 中的“TYPE_FORWARD_ONLY”错误【英文标题】:Error with "TYPE_FORWARD_ONLY" in sqlite 【发布时间】:2013-05-10 19:48:15 【问题描述】:

我正在使用 SQLite 和 JDBC,并收到关于 result_set 为 TYPE_FORWARD_ONLY 的错误。

    PreparedStatement get_mileage = conn.prepareStatement("SELECT * FROM workout_log");
    ResultSet mileage_count = get_mileage.executeQuery();

    mileage_count.absolute(week_start);

    for (int i=week_start;i<=week_finish;i++)
        total_mileage+=mileage_count.getInt(1);
        mileage_count.next();
    

错误是在调用absolute() 时出现的,尽管我知道它根本没有倒退。我尝试向prepareStatement 添加标志,但它说我的SQLite 版本不支持ResultSet,这不是FORWARD_ONLY。

我的问题是为什么会发生这种情况,即使我没有后退?

【问题讨论】:

请注意,请遵循正常的Java命名约定(即CamelCasing);它增加了 Java 程序员的可读性 【参考方案1】:

TYPE_FORWARD_ONLY ResultSet 仅支持 next() 导航,不支持 first()last()absolute(int)relative(int) 等方法。 JDBC 规范明确定义了在 TYPE_FORWARD_ONLY 上调用时抛出 SQLException 的那些:

ResultSet.absolute(int)的Javadoc:

抛出:SQLException - 如果发生数据库访问错误;此方法在关闭的结果集上调用或结果集类型为TYPE_FORWARD_ONLY

使用这些方法对TYPE_FORWARD_ONLY 没有多大意义:这种类型的结果集不适合“随机访问”行,就像可滚动的结果集一样。

例如TYPE_FORWARD_ONLY:

调用first() 仅在您位于第一行之前(以及第一行本身)时才有效,所以为什么不直接使用next() 调用absolute(int) 只会在您传递比当前行高的行时有效,并且您永远无法返回到之前的行 调用relative(int) 仅在您传递一个正值并且您永远无法返回到之前的行时才有效 调用 last() 会使您跳过结果集的其余部分,并且您永远无法返回到之前的行

诚然:它可能有它的用途,但它会使驱动程序变得不必要地复杂化,因为它具有TYPE_FORWARD_ONLY 的额外约束。

如果您想要随机访问,您需要通过指定滚动类型TYPE_SCROLL_INSENSITIVETYPE_SCROLL_SENSITIVE 之一来声明您想要随机访问。如果您的驱动程序不支持这些类型,那么您可能需要使用例如CachedRowSet(特别是com.sun.rowset.CachedRowSetImpl)来模拟它,或者首先加载整个结果集(例如到List&lt;? extends List&lt;Object&gt;&gt;)。

【讨论】:

以上是关于sqlite 中的“TYPE_FORWARD_ONLY”错误的主要内容,如果未能解决你的问题,请参考以下文章

sqlite3中的数据类型

SQLite3+Qt开发SQLite3简要介绍+在Qt5中的使用步骤

r [连接到Rstudio中的SQLite数据库] #R #SQLite #RStudio

SQLite数据库及在Android开发中的基本使用

SQLITE中的距离

SQLite 3 中的数据类型