为啥我的 sqlite 数据库中的 rawquery 给了我错误的人?

Posted

技术标签:

【中文标题】为啥我的 sqlite 数据库中的 rawquery 给了我错误的人?【英文标题】:Why does the rawquery in my sqlite database give me the wrong person?为什么我的 sqlite 数据库中的 rawquery 给了我错误的人? 【发布时间】:2016-09-07 11:41:43 【问题描述】:

我在 Eclipse 中为 android 制作了一个应用程序,您可以在其中填写一个人的信息,如姓名、电子邮件、地址等。在这个应用程序中,我需要包含一个搜索按钮,它将搜索保存在已知一条或多条信息时的数据库。例如。当我只记得保存在数据库中的人的电子邮件地址时,我需要能够通过搜索匹配的电子邮件来找到那个人。这是我用来这样做的代码:

public Person getPerson(String naam, String adres, String email, String geslacht,
        String leeftijd, String geboortedatum)
    SQLiteDatabase db= this.getReadableDatabase();
    Cursor curs=db.rawQuery("SELECT * FROM personen WHERE name = ? OR adress = ? "
            + "OR email = ? OR gender = ? OR age = ? OR birthday = ?", 
            new String[]naam==null?"'":naam, adres==null?"'":adres, 
                    email==null?"'":email, geslacht==null?"'":geslacht, 
                            leeftijd==null?"'":leeftijd, geboortedatum==null?"'":geboortedatum);
    if(curs!=null)
        curs.moveToFirst();

我在 args[] 包含空值时更改它的原因是,否则 rawQuery 将无法工作。但是,此代码不会返回我正在搜索的人,而只是返回数据库中的第一个人。 当通过仅对人名进行查询搜索来简化代码时,它实际上确实返回了具有该姓名的人:

Cursor curs=db.rawQuery("SELECT * FROM personen WHERE name = ?", new String[]naam);
if(curs!=null)
   curs.moveToFirst();

第一个 rawQuery 有什么问题,为什么它不返回我正在寻找的人,而只是返回数据库中的第一个人,而第二个 rawQuery 确实返回了正确的人?

【问题讨论】:

使用 'or' 将返回验证其中一个条件的第一行,但您的 'curs.moveToFirst();'只会返回第一行,所以你必须花点时间 你们有共同财产的人。查看光标的大小。 curs.moveToFirst();只返回结果的第一行 @njzk2 感谢您的评论。我现在觉得很愚蠢,因为我认为它会是这样的,但我没有意识到参数年龄是由一个微调器确定的,当没有给出生日时它会自动返回 0-9 岁。这可能是他们共同拥有的属性,因为我试图通过首先给所有人一个名字来使其发挥作用...... 【参考方案1】:

我猜问题出在 OR 上。你能试试看吗?因为 OR 通常意味着可选。我所说的可选的意思是,你告诉 sql 引擎返回具有它匹配的任何属性的人。因此,您并没有限制,而是提供了很多可能性 abd OR 最终获得了许多用户,因此它获得了第一个用户。不要使用或。尝试创建一个返回您想要的唯一结果的查询。

【讨论】:

我认为它也会是这样的,但是使用 AND 我得到一个错误。这可能是因为空值实际上是作为空值存储在数据库中的,但是当它们为空时,我给 args[] 中的参数另一个值,因此永远不会与数据库中的值完全匹配.这就是我选择使用 OR 的原因,因为我认为在这种情况下它只会搜索匹配的参数.. 好的。那么为什么不搜索具有值的那个或者我有一个想法,您可以搜索 IS NOT NULL 的位置。比如:SELECT * FROM table WHERE YourColumn IS NOT NULL;所以它只会考虑或比较一个值。【参考方案2】:
    public Person getPerson(String naam, String adres, String email, String geslacht,
            String leeftijd, String geboortedatum)
        SQLiteDatabase db= this.getReadableDatabase();
        Cursor curs=db.rawQuery("SELECT * FROM personen WHERE name = ? OR adress = ? "
                + "OR email = ? OR gender = ? OR age = ? OR birthday = ?", 
                new String[]naam==null?"'":naam, adres==null?"'":adres, 
                        email==null?"'":email, geslacht==null?"'":geslacht, 
                                leeftijd==null?"'":leeftijd, geboortedatum==null?"'":geboortedatum);
        if(curs!=null)
            if (curs.moveToFirst())
               while(curs.hasNext)
//Your code, this will return all the rows of your sql,use curs.next() to get a row

【讨论】:

以上是关于为啥我的 sqlite 数据库中的 rawquery 给了我错误的人?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我无法从 fireac 打开我的 sqlite 数据库?

为啥 SQLite 替换功能会在我的 Android 应用程序中产生错误?

为啥在使用 Perl 的 DBD::SQLite 时,SQLite 会为事务中的第二个查询提供“数据库已锁定”?

如果我想从另一个片段中添加书签,为啥我的书签单词没有保存到 sqlite 数据库?

为啥字符串不等于 sqlite3 数据库中的文本值(Python)

当连接未正确关闭时,为啥使用 WAL 模式的 SQLite 数据库中的数据会丢失?