【问题标题】:Search function to database in sqlite isn't working on Java project from javafx?sqlite 中的数据库搜索功能不适用于 javafx 的 Java 项目?
【发布时间】:2017-05-04 19:18:09
【问题描述】:

我有一个学校项目,我使用 BlueJ 编码,连接到 sqlite 中的数据库,视觉方面来自 javafx 的 pc 应用程序。我想创建一个搜索栏来搜索现有用户的用户 ID。在现有的用户控制器类中,我将以下代码链接到搜索栏。

@FXML void searchReleased(){
        User.nameSearch(searchnamefield.getText());
    }

在我的数据库中用户表的模型类中,我已经设置了有关实际搜索功能的代码。

public static void nameSearch(String searchString)
{
    try 
    {

        PreparedStatement statement = Application.database.newStatement("SELECT FirstName, Surname, UserID FROM User WHERE Firstname LIKE '?%' OR Surname LIKE '?%'");             
        statement.setInt(1, UserID);

        if (statement != null)
        {
            Application.database.executeUpdate(statement);
        }
    }
    catch (SQLException resultsexception)
    {
        System.out.println("search result processing error: " + resultsexception.getMessage());
    }

}

尽管它似乎不起作用,但项目编译但是在运行并尝试搜索字段时,日志中出现了一些错误。任何人都可以看到有什么问题以及我将如何测试这个工作。谢谢。

这是错误日志

Exception in thread "JavaFX Application Thread" java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1774)
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1657)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.event.Event.fireEvent(Event.java:198)
    at javafx.scene.Scene$KeyHandler.process(Scene.java:3964)
    at javafx.scene.Scene$KeyHandler.access$1800(Scene.java:3910)
    at javafx.scene.Scene.impl_processKeyEvent(Scene.java:2040)
    at javafx.scene.Scene$ScenePeerListener.keyEvent(Scene.java:2501)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(GlassViewEventHandler.java:197)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(GlassViewEventHandler.java:147)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.lambda$handleKeyEvent$353(GlassViewEventHandler.java:228)
    at com.sun.javafx.tk.quantum.QuantumToolkit.runWithoutRenderLock(QuantumToolkit.java:389)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleKeyEvent(GlassViewEventHandler.java:227)
    at com.sun.glass.ui.View.handleKeyEvent(View.java:546)
    at com.sun.glass.ui.View.notifyKey(View.java:966)
Caused by: java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1771)
    ... 26 more
Caused by: java.lang.ArrayIndexOutOfBoundsException: 0
    at org.sqlite.core.CorePreparedStatement.batch(CorePreparedStatement.java:110)
    at org.sqlite.jdbc3.JDBC3PreparedStatement.setInt(JDBC3PreparedStatement.java:291)
    at User.nameSearch(User.java:43)
    at ExistingUserScene.searchReleased(ExistingUserScene.java:147)
    ... 36 more

【问题讨论】:

  • 发布问题中的错误
  • 旁白:if (statement != null) 在这里完全是多余的。 (第一,您已将其初始化为非空值。第二,如果它为空,则上一行将引发异常,并且您将永远无法到达 if 语句。)根据另一条评论中的要求,请发布完成stack trace,并确定您发布的代码中的哪一行引发了异常。

标签: java sqlite search javafx bluej


【解决方案1】:

异常的直接原因是您在 SQL 中的参数标记 (?) 在引号内,因此它们根本不会被解释为参数标记。 (SQL 将导致搜索字面上以? 开头的名称。)因此,当您调用statement.setInt(1, ...) 时,它正在寻找第一个参数标记:当它没有找到时,它会抛出一个ArrayIndexOutOfBoundsException。您可能打算像

PreparedStatement statement = Application.database.newStatement("SELECT FirstName, Surname, UserID FROM User WHERE Firstname LIKE ? OR Surname LIKE ?");             

然后你会这样做

statement.setString(1, userID+"%");

请注意,这里还有很多错误,例如

  • 你没有搜索传递给方法的搜索字符串
  • 你有两个参数标记,但只设置了一个
  • 您正在为需要为字符串的参数设置 int
  • 您使用executeUpdate(...) 执行查询
  • 您不处理查询结果
  • 您在不可能为 null 的引用上检查 null

也许还有很多我没见过的。因此,此更改不会消除所有异常或使其按您希望的方式工作,但它会修复您询问的直接异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    相关资源
    最近更新 更多