我有一个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
,即没有拼写错误。
我只想知道有多少行具有相同的优先级。
更新: -
我不知道它是否有帮助,但我正在制作的应用程序会为给定的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个按钮)并且不为其他任何人工作时,它才会起作用。
我想我已经清楚了。很抱歉让大家感到困惑,我自己很困惑因为我没有看到这样的奇怪问题。
答案 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)进行硬编码。