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
Java SQLException:没有这样的表_Java_Sqlite_Jdbc - Fatal编程技术网

Java SQLException:没有这样的表

Java SQLException:没有这样的表,java,sqlite,jdbc,Java,Sqlite,Jdbc,现在我在连接数据库时遇到了一些问题。我知道我要查找的表是存在的,因为当我使用命令行访问它们时,可以查询它们 可能是一些小疏忽,但我希望能得到一些帮助 这是我连接数据库的地方 包持久性 import java.sql.DriverManager; import java.sql.Connection; import java.sql.SQLException; public class DBRegistry { private static DBRegistry db = null;

现在我在连接数据库时遇到了一些问题。我知道我要查找的表是存在的,因为当我使用命令行访问它们时,可以查询它们

可能是一些小疏忽,但我希望能得到一些帮助

这是我连接数据库的地方 包持久性

import java.sql.DriverManager;
import java.sql.Connection;
import java.sql.SQLException;


public class DBRegistry {

    private static DBRegistry db = null;
    private static Connection connection = null;

    private DBRegistry() {};

    public static synchronized DBRegistry getUniqueInstance() {
        if (db == null) {
                db = new DBRegistry();
                return db;
        }
        else return db;
    }

    public synchronized Connection getDBConnection() {
            try {
                Class.forName("org.sqlite.JDBC");
                connection = DriverManager.getConnection("jdbc:sqlite:src/database/taskMan.db");
                return connection;
            } 
            catch (SQLException e) {e.printStackTrace();} 
            catch (ClassNotFoundException e) {e.printStackTrace();}
            return null;
    }

    public synchronized void closeConnection() {
        try {
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
下面是我对它的质疑

public void create(UUID oid, Object obj) {
    Task t = (Task)obj;
    String statement = "INSERT INTO `complexTask` (`oid`,`description`,`status`) VALUES (?, ?, ?)";
    try {
        PreparedStatement dbStatement = db.prepareStatement(statement);
        dbStatement.setString(1, oid.toString());
        dbStatement.setString(2, t.getDescription());
        dbStatement.setBoolean(3, t.getStatus());
        dbStatement.executeUpdate();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
最后是堆栈跟踪:

java.sql.SQLException: no such table: complexTask
    at org.sqlite.DB.throwex(DB.java:288)
    at org.sqlite.NativeDB.prepare(Native Method)
    at org.sqlite.DB.prepare(DB.java:114)
    at org.sqlite.PrepStmt.<init>(PrepStmt.java:37)
    at org.sqlite.Conn.prepareStatement(Conn.java:231)
    at org.sqlite.Conn.prepareStatement(Conn.java:224)
    at org.sqlite.Conn.prepareStatement(Conn.java:213)
    at persistence.framework.ComplexTaskRDBMapper.create(ComplexTaskRDBMapper.java:23)
    at persistence.PersistanceFacade.create(PersistanceFacade.java:49)
    at persistence.persistanceStates.NewState.commit(NewState.java:10)
    at persistence.PersistentObject.commit(PersistentObject.java:23)
    at domain.objects.Task.commitToDB(Task.java:89)
    at domain.TaskRepository.commitToDB(TaskRepository.java:60)
    at domain.TaskController.persistanceCommit(TaskController.java:97)
    at presentation.TaskControlsJPanel$3.actionPerformed(TaskControlsJPanel.java:127)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2012)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2335)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:404)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:253)
    at java.awt.Component.processMouseEvent(Component.java:6175)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3267)
    at java.awt.Component.processEvent(Component.java:5940)
    at java.awt.Container.processEvent(Container.java:2105)
    at java.awt.Component.dispatchEventImpl(Component.java:4536)
    at java.awt.Container.dispatchEventImpl(Container.java:2163)
    at java.awt.Component.dispatchEvent(Component.java:4362)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4461)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4125)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4055)
    at java.awt.Container.dispatchEventImpl(Container.java:2149)
    at java.awt.Window.dispatchEventImpl(Window.java:2478)
    at java.awt.Component.dispatchEvent(Component.java:4362)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:604)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)

我不确定您的JDBC连接字符串是否正确。您使用的连接字符串以
taskMan.db
结尾,但是您上面的评论暗示数据库文件的名称是
taskManDb.db
(注意额外的
db
)。

它可能无法解决SQL INSERT的问题,但我根本不关心DBRegistry的实现。我会这样写:

package persistence;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public class DBRegistry
{
    public static Connection getConnection(String driver, String url, String username, String password) throws ClassNotFoundException, SQLException
    {
        Class.forName(driver);
        return DriverManager.getConnection(url, username, password);
    }

    public static void close(Connection connection)
    {
        try
        {
            if (connection != null)
            {
                connection.close();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }


    public static void close(Statement statement)
    {
        try
        {
            if (statement != null)
            {
                statement.close();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }

    public static void close(ResultSet resultSet)
    {
        try
        {
            if (resultSet != null)
            {
                resultSet.close();
            }
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
    }
}

我注意到,在单元测试和其他代码中,表名周围都使用了反勾号。在最新版本的sqlite中,这很好,但在较旧的版本中,我相信它没有得到很好的处理。您可以尝试删除表名周围的记号,或者将它们更改为常规引号而不是反记号吗


如果这不能解决问题,我会检查以确保您指向的是正确的db文件。如果指定一个不存在的文件名,则不会出现错误,它只会在那里创建一个新数据库。我不确定应用程序或单元测试上下文中的“当前目录”是什么,但请确保它指向您认为它所在的位置。要测试这一点,您可以将db文件名更改为
foo.db
,运行单元测试,然后在计算机中搜索
foo.db
,查看它是在哪里创建的。这将告诉您应用程序的运行位置。

可能您的表在一个包中。所以你可能会这样做

select * from Tasks.ComplextTask

('Tasks'是软件包)

现在只要在c:\windows\system32中找到一个同名文件,您就会找到它。它告诉我们您的路径不正确。祝你有愉快的一天

请在创建表后和插入后提交连接。

我想知道数据库的路径是否设置不正确,但我想知道这是否会导致第一次单元测试失败。尝试
DBNAME.singleTask
作为一个快照,它应该可以工作。尝试使用其他前端连接同一个DB以检查tables@org.life.java我试着使用命令行,结果成功了!ben@ben-笔记本电脑:~/workspace/taskManager_v4/src/database$sqlite taskManDb.db sqlite version 2.8.17输入“.help”以获取sqlite>的说明。表complexTask repeatingTask singleTask subTaskI在iPHone应用程序开发中使用sqlite的体验与CoCoa相同,当时的问题是命令行引用了其他一些DB,而我的应用程序引用了其他一些.sqlite文件。确保这一点在这种情况下,您的连接字符串应该是
jdbc:sqlite:src/database/taskManDb.db
,而不是
jdbc:sqlite:src/database/taskMan.db
Litytestdata谢谢您的评论。我已经做出了改变,但不幸的是,这并没有解决问题。事实上,我自己也在发布后发现了这个错误,很高兴你也看到了。不幸的是,你的解决方案没有解决这个问题,因此我将发放我的奖金作为奖励,不过我想说谢谢你对DBRegistry结构的评论,我一定会在那里实施你的解决方案。你的版本比我的版本更有意义,我非常感谢你花时间重构我的代码。就像我一开始说的,我没有试图解决你的问题。我的机器上没有安装SQLLite,因此无法尝试。但我会的。我玩过引号和反勾号,但那没用。我会做一些更多的路径游戏,并会随时通知你。谢谢你让我知道在一个伪造的DB名称上没有出现错误。很难决定谁应该在这一个上赢得赏金,但我决定把它给Marplesoft,因为它是最接近的。为我的数据库使用完全限定的路径最终达到了目的,这个答案促使我对路径的细节展开调查,因此获得了分数。感谢大家的贡献。@user521180感谢您的回复,但不幸的是任务不在包中。不过我很感谢你的努力。
select * from Tasks.ComplextTask