2012-12-19 35 views
4

可能重复:
Java String.equals versus ==如果在Java中的Android语句比较字符串

我试着写在z DBOpenHelper的方法扩展SQLOpenHelper类。 它应该评估数据库中是否存在具有相同名称的条目。

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)其中variabales加载这样的:

String name = "foo"; 
String cname = "foo"; 
     statement equals true as it's supposed to. 

方案C:if("foo" == "foo")等于true ...但是...调试器就走出了窗外。 LogCat显示调试器已连接,但eclipse的Debug透视图中没有任何活动。断点不起作用。没有显示线程。

+0

更好使用name.equals(cname);不要使用==来进行字符串比较。 – Smit

+0

你可以改变代码来检查名称是否存在使用sql,并避免循环数据例如:'SELECT * FROM“+ TABLE_CONTACTS +'Where name ='+ contact.getName()' –

+0

哦,好的...谢谢! –

回答

6

==操作者检查对象引用是相等或不但equals()方法校验值是相同或不

if (name == cname) 
    {  
    cursor.close(); 
    db.close(); 
    return true; 
    } 

变化与它

if (name.equals(cname)){   
    cursor.close(); 
    db.close(); 
    return true; 
} 
1

当比较java中不是原始对象的对象时数据类型(int, char, boolean, etc...),则必须使用方法Object#equals(Object),该方法返回布尔值。

因此,当您比较两个字符串时,实际上是检查两个对象是否是相同的实例,而不是实际值。

您只需将name == cname更改为name.equals(cname)即可。