我正在android中编写一个小应用程序来存储有关使用SQLite的人的基本细节。
我使用此功能
插入数据public void insertData(String user,String p_no,SQLiteDatabase db)
{
ContentValues cv = new ContentValues();
cv.put(NAME, user);
cv.put(PHONE, p_no);
db.insert("MYTABLE", null, cv);
}
上述功能允许存储重复的名称。
所以我编写了一个函数,首先检查名称是否退出然后输入。
public void insertData(String user,String p_no,SQLiteDatabase db)
{
Cursor resultSet=db.rawQuery("select NAME from MYTABLE where NAME = '"+user+"'",null);
if(resultSet==null)
{
ContentValues cv = new ContentValues();
cv.put(NAME, user);
cv.put(PHONE, p_no);
db.insert("MYTABLE", null, cv);
}
else Toast.makeText(context,user+" already exists",Toast.LENGTH_SHORT).show();
}
但问题是现在每次插入含义时吐司都会出现,即使该行是唯一的,也没有插入。
为什么即使没有这样的行,resultSet也不为空?
答案 0 :(得分:3)
这是因为RawQuery
永远不会返回null游标,这就是你的检查标准,所以它总是失败,并试图在DB中添加新值。
我无法找到我学到的文档,但我会尽快更新。
您可以使用
检查cursor
中是否包含值
if(cursor.moveToFirst())
答案 1 :(得分:1)
因为可以有一个空光标。更改您的支票
if(cursor.getCount() == 0)
这样,如果游标不为null,则检查它是否包含某些内容。
在我看来,这可能不是处理重复的最好方法。您应该将列标记为unique
,然后使用insertWithConflict来决定在您已经拥有该值的条目时该怎么做
答案 2 :(得分:0)
检查
if (resultset.getCount() == 0)
此外,将Name设置为唯一键以避免重复。而不是每次都检查它。