Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.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 Sql查询在第二次执行时不返回任何内容(SQlite数据库)_Java_Sql_Database_Swing_Sqlite - Fatal编程技术网

Java Sql查询在第二次执行时不返回任何内容(SQlite数据库)

Java Sql查询在第二次执行时不返回任何内容(SQlite数据库),java,sql,database,swing,sqlite,Java,Sql,Database,Swing,Sqlite,我对sqlite数据库有一个问题,我希望每次在可编辑的JcomboBox中键入字符时,我都从sqlite数据库中获取数据,并在删除所有现有项后将其作为项添加到JcomboBox中。(我打算创建自动完成的JcomboBox) 这是jComboBox代码: jComboBox1 = new javax.swing.JComboBox(); con = new Connect(); jComboBox1.setEditable(true); for(String items :con.Sel

我对sqlite数据库有一个问题,我希望每次在可编辑的JcomboBox中键入字符时,我都从sqlite数据库中获取数据,并在删除所有现有项后将其作为项添加到JcomboBox中。(我打算创建自动完成的JcomboBox) 这是jComboBox代码:

    jComboBox1 = new javax.swing.JComboBox();
con = new Connect();

jComboBox1.setEditable(true);
for(String items :con.SelectDataforComboBox(
        "SELECT Reference FROM Articles",
        "SELECT COUNT(*) As COUNTER FROM Articles","") ){
jComboBox1.addItem(items);}
con.CloseDB();
jComboBox1.getEditor().getEditorComponent().addKeyListener(
new KeyAdapter(){
   public void keyTyped(java.awt.event.KeyEvent evt) {
con = new Connect();
char c = evt.getKeyChar();
        s = s+ c;
        System.out.println(s);   

jComboBox1.removeAllItems();
for(String items :con.SelectDataforComboBox(
        "SELECT Reference FROM Articles",
        "SELECT COUNT(*) As COUNTER FROM Articles",s) ){
jComboBox1.addItem(items);}
con.CloseDB();

}}
);
这是从数据库返回项目的方法:

   public String [] SelectDataforComboBox(String sqlSelectlist , String sqlCount,String likeText){
       int k=0;
        try {       
            if(!likeText.equals("")){
                sqlCount = sqlCount + " WHERE Reference LIKE '"+likeText+"%'";
                sqlSelectlist = sqlSelectlist + " WHERE Reference LIKE '"+likeText+"%'";

            }
                System.out.println(sqlCount);
                System.out.println(sqlSelectlist);
            RsComboList = stmt.executeQuery(sqlCount);

                    while(RsComboList.next()){ 
                        ListofComboBox = new String[RsComboList.getInt("COUNTER")];
                        System.out.println(RsComboList.getInt("COUNTER"));
               }   

                                RsComboList = stmt.executeQuery(sqlSelectlist);
            while(RsComboList.next()){

                        ListofComboBox[k]=RsComboList.getString("Reference");
                        System.out.print("Combobox : "+ListofComboBox[k]+"\n");
                        k++;

            }
        } catch (SQLException ex) {
            Logger.getLogger(Connect.class.getName()).log(Level.SEVERE, null, ex);
        }         


        return ListofComboBox ;
   }
所以问题是,当我键入第一个字符时,我得到了项目,当我添加第二个字符时,项目被删除,数据库和jCombobox返回的内容仍然为空,但当我在SQL命令中执行查询(使用Navicat)时,我像往常一样得到了数据。解决方案是什么

已编辑

This is the output of the query statement :

Opened database successfully
Records created successfully
m
SELECT COUNT(*) As COUNTER FROM Articles WHERE Reference LIKE 'm%'
SELECT Reference FROM Articles WHERE Reference LIKE 'm%'
1
Combobox : Mehdi
DB closed
Opened database successfully
Records created successfully

SELECT COUNT(*) As COUNTER FROM Articles WHERE Reference LIKE '%'
SELECT Reference FROM Articles WHERE Reference LIKE '%'
0
DB closed
Opened database successfully
Records created successfully
t
SELECT COUNT(*) As COUNTER FROM Articles WHERE Reference LIKE 't%'
SELECT Reference FROM Articles WHERE Reference LIKE 't%'
0
DB closed
Opened database successfully
Records created successfully
tm
SELECT COUNT(*) As COUNTER FROM Articles WHERE Reference LIKE 'tm%'
SELECT Reference FROM Articles WHERE Reference LIKE 'tm%'
0
DB closed

我建议您可以将整个数据范围检索到一个排序列表(缓存在内存中),然后您只能将这些项目放入组合框列表中,即前x个字母等于输入的文本。开始时,可以添加所有项目。通过这种方式,您可以减少数据库上的I/O,并且更新combobox列表的速度更快。。。 您的combobox可以是一个通用combobox,具有内部受保护的排序列表,用于缓存全部失效数据,可以使用外部对象(在本例中是一个数据库处理程序对象,用于管理您的SQLite访问)来准备(填充),该对象实现例如
populateComboBox(您的ComboboBox类cb,字符串sql)
方法。。。 populateComboBox()可以将检索到的数据添加到combobox的缓存列表中,例如,通过调用combobox的已实现的
addCachedItem(字符串项)
函数


通过这种方式,它将是最灵活和可重用的,您还可以通过其他数据源填充combobox。。。如果您不清除这些项,您可以从多个数据源添加数据

tnx@Frakas Csaba,您的解决方案是逻辑的,但我不明白为什么查询在我第一次键入字符时返回数据,而不是在下一次键入任何字符时返回数据结果为空。在您输入第2个或第3个字符后,SQL选择是否正确?是否有任何其他事件链接到combobox,使用相同的数据库连接处理程序?在第二次或第三次键入字符时,查询是正确的,但没有返回结果,没有其他事件,只有上述事件。如果连接处理程序出现问题,将出现异常:)。。。。所以我看不出问题出在哪里