Java .equals () devuelve false cuando las cadenas son iguales
Estoy haciendo una aplicación y quiero que la aplicación se conecte automáticamente desde un archivo de texto si el usuario ya ha iniciado sesión. En la actualidad, en el archivo de texto tengo "alex | ppp" que coincide con la entrada de la base de datos. El siguiente método se llama primero
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); }
He comprobado dos veces los valores para el usuario y pasar y son "alex" y "ppp" que se espera. Next InitialStuff se llama, este es el código relevante:
- Cómo interactuar con diferentes navegadores de Android (obtener url)
- Implementar seguridad a nivel de firma en los servicios de Android con más de una firma permitida
- Comprobación de Android de la fecha cambiada
- Pantalla de bienvenida de Android
- ¿Cómo afectan las recientes vulnerabilidades de java a Android y la programación?
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; }}
El problema ocurre una vez que llamo el db.tryLogin () que se parece a esto
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; }
He comprobado para ver que dbPass vuelve de la base de datos como "ppp", que coincide con toonPass sin embargo, se saltará el retorno true y devolverá false en su lugar.
Si ayuda, este es el eclipse de información que me da acerca de los dos
ToonPass "ppp" (id = 830041185816) cuenta 3
HashCode 0
Desplazamiento 5
Valor (id = 830041185744)
[0] a
[1] l
[2] e
[3] x
[4] |
[5] p
[6] p
[7] p
DbPass "ppp" (id = 830041708816) cuenta 3
HashCode 0
Desplazamiento 0
Valor (id = 830041709136)
[0] p
[1] p
[2] p
Pleaes nota que también he intentado pasar en "ppp" al tryLogin () método sin tomarlo como una subcadena en caso de que tenía algo que ver con el problema y el resultado es el mismo.
EDIT: He resuelto el problema … sorta. Acabo de dejar de usar el método .equals () y en su lugar estoy usando un bucle for que compara los caracteres de cada cadena a otro
- ¿Están garantizadas las variables globales de java para inicializarse primero?
- Mezcla de vistas de Android y GLSurfaceView
- Java, android, resolver un url, obtener redireccionado uri
- Hacer que el teclado Android resista a los ataques de KeyLogger
- Cómo detectar si edittext tiene caracteres en inglés
- ¿Existe un Util para convertir US State Name a State Code. p.ej. Arizona a AZ?
- Detección de estilo de conducción mediante sensores de Smartphone
- Android Actualiza ListActivity desde BaseAdapter
Una pista Si está jugando con métodos de clase String, por ejemplo. .compare () .equals () etc. recuerda la codificación de charset! Especialmente asegúrese de coincidir con IDE, archivos de proyecto, recursos y la codificación de DB (cuando se carga / leer datos como cadena de fuentes externas)
if(dbPass.equals(toonPass)) //PROBLEM OCCURS HERE
Estas realmente seguro ?
El problema es probablemente aquí:
catch(Exception e){ }
Escriba esto en su lugar e inspeccione sus registros:
catch(Exception e){ e.printStackTrace(); }
Curiosamente, parece que la información de depuración de Eclipse no coincide. El char[]
que ha impreso para toonPass
parece que dice "alex | ppp" y dbPass
parece "ppp". El desplazamiento de 5 para toonPass
hace que parezca que las cadenas son iguales porque se omitieron los primeros 5 caracteres ("alex |") y, por lo tanto, hasta "ppp".
Yo sugeriría reescribir el bucle que divide el "alex | ppp" del archivo de texto. Si sólo desea dividirlo en el '|' Carácter entonces info.split("|")
probablemente hará el truco.
- Emulador de Android en Eclipse no funciona
- ENOENT (ningún archivo o directorio) cuando hay un archivo allí