2014-02-25 42 views
4

我正在创建一个应用程序,如果用户已经登录,我希望应用程序自动从文本文件登录。目前,在文本文件中,我具有与数据库条目匹配的“alex | ppp”。 以下方法被称为第一Java .equals()在字符串相等时返回false

private void rememberedLogIn(){ 
    String filename = "UserInfo.txt"; 
    String info = ""; 
    String user = ""; 
    String pass = ""; 

    try{ 
     FileInputStream fIn = openFileInput(filename); 
     BufferedReader r = new BufferedReader(new InputStreamReader(fIn)); 
     info = r.readLine(); 

    }catch(IOException e){ 
     e.printStackTrace(System.err); 
    } 

     for(int i =0; i < info.length();i++){ 
      if(info.charAt(i) == '|'){ 
       user = info.substring(0,i); 
       pass = info.substring(i+1); 
       GlobalVar.loggedIn= true; 
       break; 
      } 
     } 
     new InitialStuff().execute(user,pass); 
} 

我有双重检查用于用户的值,并通过与他们是“亚历克斯”和预计“PPP”。接下来InitialStuff被调用,这是相关代码:

public class InitialStuff extends AsyncTask<String, Void, Toon>{ 
    int prog = 0; 
    @Override 
    protected Toon doInBackground(String... params) { 
     android.os.Debug.waitForDebugger(); 
     Toon toon = null; 
     Database db = new Database(); 
     db.establishConnection(); 
     if(db.tryLogIn(params[0], params[1])){ 
      prog = 2; 
      publishProgress(); 
      toon = db.getToonFromDB(params[0]); 
      prog = 4; 
     }else prog = 3; 
     publishProgress(); 
     return toon; 
    }} 

一次我打电话db.tryLogin(出现问题),它看起来像这样

public boolean tryLogIn(String toonName, String toonPass){ 
    try{ 
     while(!connected) establishConnection(); 
     String sqlQuery = "SELECT Password FROM Toons WHERE Name LIKE '" + toonName+"';"; 
     Statement stmt = con.createStatement(); 
     ResultSet rSet = stmt.executeQuery(sqlQuery); 
     if(rSet.next()){ 
      String dbPass = rSet.getString(1).trim(); 
      if(dbPass.equals(toonPass)) //PROBLEM OCCURS HERE 
       return true; 
     } 
    } 
    catch(Exception e){ } 
    return false; 
} 

我已检查看到DBPASS回来从数据库中作为“ppp”匹配toonPass,但它将跳过返回true并返回false。

如果有帮助,这是信息蚀给我关于两个

toonPass “PPP”(ID = 830041185816) 计数3
的hashCode 0
偏移5
值(ID = 830041185744)
[0]一个
[1]升
[2] E
[3] X
[4] |
[5] p
[6] p
[7] p

DBPASS “PPP”(ID = 830041708816) 计数3
的hashCode 0
偏移0
值(ID = 830041709136)
[0] p
[1] p
[2] p

Pleaes注意,我还试图PASSI如果与问题有关并且结果相同,则将“ppp”改为tryLogin()方法而不将其作为子字符串。

编辑:我解决了这个问题... sorta。我刚刚停止使用.equals()方法,而是使用for循环比较每个字符串中的字符彼此

+6

无关,但SQL注入。 –

+0

这是我第一次在编程中处理外部数据库,我不得不自己教给自己,所以请原谅我缺乏知识......你是什么意思? – user3293629

+3

SQL注入示例之一:http://xkcd.com/327/ - > http://stackoverflow.com/questions/332365/how-does-the-sql-injection-from-the-bobby-tables- xkcd-comic-work – Pshemo

回答

1
if(dbPass.equals(toonPass)) //PROBLEM OCCURS HERE 

您确定吗?

这个问题可能是在这里:

catch(Exception e){ } 

写这篇文章,而不是和检查日志:

catch(Exception e){ e.printStackTrace(); } 
+0

我补充说,但正如我预期它没有改变结果,没有异常被抛出它只是直接跳过if语句直接返回“返回false” – user3293629

0

奇怪的是,它看起来像Eclipse的调试信息不​​匹配。您打印出的toonPasschar[]看起来像是“alex | ppp”,而dbPass看起来像“ppp”。toonPass的偏移量为5使得它看起来像字符串是平等的,因为它跳过了前5个字符(“alex |”),因此最多为“ppp”。

我建议重写从文本文件中分割出“alex | ppp”的循环。如果你只是想把它分成'|'字符然后info.split("|")可能会做的伎俩。

+0

此外,虽然它可能不一定是问题,但我'强烈建议你遵循@ ben75的建议,避免写'catch(Exception e){}' – ATG

+0

我认为这可能是问题,但它不是(“请注意,我也尝试传入”ppp“ tryLogin()方法不会将其作为子字符串,以防与问题有关并且结果相同。“)即使当”ppp“作为新字符串传入时,它也不起作用。 – user3293629

+0

我在问题的最后看到了这一点,但它并没有解释我们在调试信息中的偏移量= 5。我能想到的其他事情是字符编码问题,但是这样简单的字符是不太可能的。 – ATG

2

one 提示! 如果你玩的是String类方法,例如。 .compare().equals()等记得关于charset编码!特别确保与IDE,项目文件,资源& db的编码匹配(当您从外部源加载/读取数据作为字符串时)

+1

等于String和Charsequence总是返回** false **。好暗示:) – Amir

相关问题