SQLite数据库where子句无法正常工作

时间:2013-11-04 14:38:15

标签: android sqlite cursor

我有一个sql database由一列Contact_Priority组成,它由整数组成的字符串为entires(即1,2 ...但保存为字符串)。 Contact_Priority可能不止一次包含一个数字。我正在使用以下查询来获取包含特定数字的行数。

SQLiteDatabase sqLiteDatabase = this.getReadableDatabase();
        Cursor cursor = sqLiteDatabase.query(CONTACT_TABLE, null, Contact_Priority + " =? ", new String[]{priority} , null, null, null);

        int count = cursor.getCount();

但它返回0,尽管数据库中存在一些行。

如果我放Cursor cursor1 = sqLiteDatabase.query(CONTACT_TABLE, null, null, null, null, null, null, null);

我获得了正确的行数。我很困惑,为什么它不起作用。

P.S。 - Contact_Priority在其行中有priority,即没有拼写错误。 enter image description here

我只想知道有多少行具有相同的优先级。

更新: -

我不知道它是否有帮助,但我正在制作的应用程序会为给定的Contact_Priority分配一些联系号码。我所做的是,当我向任何特定Contact_Priority添加联系人,即1,2左右时,在按钮上单击我可以添加到所有优先级,即优先级1到8将具有与您相同的联系人可以在上图中看到。

我已成功实施,现在在显示优先级的联系人时我遇到了问题,但奇怪的是它正在设置一个特定的优先级,通过它我设置了所有类似的联系人。

考虑我选择保留所有优先级为“2”的联系人然后我得到正确的输出为“2”,即正确的行数,而对于所有其他我得到的0.我检查了数据库是否更新了行是更新,但为什么我只获得一个我无法理解的优先级的输出。

更新2

priority的值取决于listview的位置,onClick包含调用查询函数priority的按钮。例如。考虑一下,我将2 listview child 1的联系人复制到了所有其他人。数据库已更新,如上图所示。现在当我点击1的按钮时,优先级为2,如果我点击第二个孩子的按钮,则优先级为{{1}},依此类推。由于一些奇怪的原因,它的工作优先级是“2”(因为我将“2”的联系人复制到所有)。对于其他人,它不起作用。

现在,如果我复制了“优先级3”的联系人,那么只有当优先级为“3”(即我点击列表中的第3个按钮)并且不为其他任何人工作时,它才会起作用。

我想我已经清楚了。很抱歉让大家感到困惑,我自己很困惑因为我没有看到这样的奇怪问题。

5 个答案:

答案 0 :(得分:1)

我不知道为什么这样做但是使用以下查询我得到了理想的结果

Cursor cursor = sqLiteDatabase.rawQuery("Select * from Contact where Contact_Priority =" + priority,null);

由于两个查询都相同,我不明白为什么这个有效,而前一个没有。我为所有面临类似问题的人提及这个答案。如果有人明确回答是什么导致此查询正常工作且以前的查询无效,请在评论中提及。

答案 1 :(得分:0)

请看这里: http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html Contact_Priority变量的意图是什么?为什么你用“=?”这个字符串?

您使用的方法的定义是:

query(String table,String [] columns,String selection,String [] selectionArgs,String groupBy,String having,String orderBy,String limit)

它应该是这样的: CONTACT_TABLE,null,Contact_Priority,new String [] {priority},null,null,null,null

答案 2 :(得分:0)

 .query(CONTACT_TABLE, null, Contact_Priority + " =? ", new String[]{priority} , null, null, null);

将返回Contact_Priority(我希望是"Contact_Priority"变量)的所有行完全等于给定的priority

你不想要精确,你想要一个匹配,所以:

 .query(CONTACT_TABLE, null, "','||Contact_Priority||',' LIKE '%,'||?||',%'", new String[]{priority} , null, null, null);

会做的!

编辑:忘了通配符......

答案 3 :(得分:0)

你也可以试试这个

String.format(Contact_Property + " = \'%s\'", priority);

并将selectionArgs参数设置为null。

答案 4 :(得分:0)

我遇到了与OP相同的问题,但是发现了导致它的原因。

使用 FULLTEXT 搜索的表格-例如CREATE VIRTUAL TABLE my_table USING fts3 (...)。当我将其更改为普通(非虚拟/非fts3 /非fts4)表时,问题就消失了。

但是,我需要将其保留为virtual / fts3表,因此我使用的解决方法是将selection字符串从_id = ?更改为docid = ?。 (创建虚拟/ fts3表时,{/ {1}}列由Android / SQLite自动创建。)

当然,您可以使用docid_id = 12345(带有空selection)对ID(例如12345)进行硬编码。