我正在尝试在az DBOpenHelper中编写一个方法,扩展SQLOpenHelper类。 它应该评估DB中是否有一个具有相同名称的条目。
public boolean existsContact(Contact contact) {
SQLiteDatabase db = this.getReadableDatabase();
String selectQuery = "SELECT * FROM " + TABLE_CONTACTS;
Cursor cursor = db.rawQuery(selectQuery, null);
if (cursor.moveToFirst()) {
do {
String name = cursor.getString(1);
String cname = contact.getName();
if (name == cname) {
cursor.close();
db.close();
return true;
}
} while (cursor.moveToNext());
}
db.close();
return false;
}
以下是Contact类的相关部分:
public class Contact {
String _name;
public String getName(){
return this._name;
}
}
现在这是奇怪的事情:
情景A:if (name == cname)
其中name = "foo"
和cname = "foo"
等于false。
Eclipse调试器显示名称的foo和cname的foo具有不同的id。
两个变量都按照之前的代码填充。
场景B:if(name == cname)
,其中varbales加载如下:
String name = "foo";
String cname = "foo";
statement equals true as it's supposed to.
场景C:if("foo" == "foo")
等于true ...但是...调试器离开了窗口。 LogCat显示调试器连接,但在eclipse的Debug透视图中没有活动。断点无效。没有显示线程。
答案 0 :(得分:34)
在java中,当在两个对象上使用==
时,实际上并没有比较字符串本身。您需要使用.equals(String)
。
==
实际上比较了两个对象的引用,而不是它们的值。
string1.equals(String target)
根据字符串中的实际字符比较两个字符串。
请参阅:http://www.leepoint.net/notes-java/data/expressions/22compareobjects.html
答案 1 :(得分:7)
==运算符检查对象引用是否相等但是equals()方法检查值是否相同
if (name == cname)
{
cursor.close();
db.close();
return true;
}
随之改变
if (name.equals(cname)){
cursor.close();
db.close();
return true;
}
答案 2 :(得分:1)
当比较java中非原始数据类型(int, char, boolean, etc...
)的对象时,必须使用方法Object#equals(Object)
,它返回一个布尔值。
因此,当您比较两个字符串时,实际上是在检查两个对象是否是同一个实例,而不是实际值。
您只需将name == cname
更改为name.equals(cname)
。