0

我有一个sql database由整数组成的列Contact_Priority作为字符串整数(即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);

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

PS -Contact_Prioritypriority其行中,即没有拼写错误。 在此处输入图像描述

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

更新 :-

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

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

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

更新 2

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

现在,如果我复制了“优先级 3”的联系人,那么它仅适用于优先级为“3”(即我单击列表上的第 3 个按钮)并且不适用于其他任何人时。

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

4

5 回答 5

1

我不知道为什么这是有效的,但使用以下查询我得到了想要的结果

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

由于两个查询都是相同的,我不明白为什么这是有效的,而前一个则不是。我为所有面临类似问题的人提到了这个答案。如果有人有明确的答案是什么原因导致此查询有效而之前的查询无效,请在评论中提及。

于 2013-11-04T17:46:57.303 回答
0

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

您正在使用的方法的定义是:

查询(字符串表,字符串 [] 列,字符串选择,字符串 [] selectionArgs,字符串 groupBy,字符串有,字符串 orderBy,字符串限制)

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

于 2013-11-04T14:45:38.967 回答
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);

会做!

编辑:忘记通配符...

于 2013-11-04T14:45:55.220 回答
0

你也可以试试这个

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

并将 selectionArgs 参数设置为 null。

于 2013-11-04T14:48:18.520 回答
0

我遇到了与 OP 相同的问题,但发现了似乎是什么原因造成的。

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

但是,我需要将其保留为虚拟/fts3 表,因此我使用的解决方法是将我的selectionString 从更改_id = ?docid = ?. (docid当您创建虚拟/fts3 表时,该列由 Android/SQLite 自动创建。)

当然,您也可以使用_id = 12345for selection(with a null ) 硬编码您的 id(例如 12345 selectionArgs)。

于 2018-09-21T20:46:13.787 回答