Ver Mensaje Individual
  #3 (permalink)  
Antiguo 24/11/2013, 17:29
Migueterry
 
Fecha de Ingreso: noviembre-2013
Mensajes: 4
Antigüedad: 11 años
Puntos: 0
Pregunta Respuesta: Null Pointer Exception al editar contacto

Gracias por responder, pues el error que me sale es el siguiente

http://www.casimages.es/i/131125121317879440.png.html

Me falla desde que metí el campo Telefono, antes cuando solo tenia los campos Nombre, Apellidos y edad si me realizaba todo correctamente.. y no encuentro la forma de verdad..

Y los métodos que tienen las clases que contienen la edición es lo siguiente :

Clase de la base de datos:
Código:
	
	/**
	 * Metodo publico para actualizar una persona.
	 */
	public void actualizarRegistros(int id, String nombre, String apellido, String edad,String telefono, String ruta_imagen){
		ContentValues actualizarDatos = new ContentValues();  
		actualizarDatos.put("nombre", nombre);
		actualizarDatos.put("apellido", apellido);
		actualizarDatos.put("edad", edad);
		actualizarDatos.put("telefono", telefono);
		actualizarDatos.put("ruta_imagen", ruta_imagen);
		String where = "_id=?";
		String[] whereArgs = new String[] {String.valueOf(id)};
		
		try{    
		    this.getReadableDatabase().update("Personas", actualizarDatos, where, whereArgs);
		}
		catch (Exception e){
		    String error =  e.getMessage().toString();
		}
	}
	
	/**
	 * Metodo publico que retorna una persona especifica.
	 * @param id
	 * @return
	 */
	public Persona getPersona(int p_id) {
	    String[] columnas = new String[]{"_id", "nombre", "apellido", "edad", "telefono", "ruta_imagen"};
	    Cursor cursor = this.getReadableDatabase().query("Personas", columnas, "_id" + "= " + p_id, null, null, null, null,null);
	
	    if (cursor != null){
	    	cursor.moveToFirst();
	    }
	    	
		Persona persona = new Persona(Integer.parseInt(cursor.getString(0)), cursor.getString(1), cursor.getString(2), cursor.getString(3),
		    cursor.getString(4), cursor.getString(5));
		    
		// Retorna la persona especifica.
		return persona;
	}
		
		
	/**
	 * Metodo publico que devuelve todas las personas.
	 * @return
	 */
	public Cursor obtenerTodasPersonas(){
		//String[] columnas = new String[]{"_id", "nombre", "apellido", "edad", "telefono", "ruta_imagen"};
		Cursor cursor = this.getReadableDatabase().rawQuery("select * from personas",null);
		//Cursor cursor = this.getReadableDatabase().query("Personas", columnas, null, null, null, null, null, null);
		
		if(cursor != null) {
		    cursor.moveToFirst();
		}
		return cursor;
	}
Clase EditarPersonaActivity
Código:
		// Se crea el objeto mensaje.
		mensaje = new Mensaje(getApplicationContext());

		
		// Recupera en un Objeto Bundle si tiene valores que fueron pasados como
		// parametro de una actividad.
		extras = getIntent().getExtras();

		if (estadoEditarPersona()) {
			editTextNombre.setText(extras.getString("nombre"));
			editTextApellido.setText(extras.getString("apellido"));
			editTextEdad.setText(extras.getString("edad"));
			editTextTelefono.setText(extras.getString("telefono"));
			
			// Se coloca la imagen de una persona.
			ruta_imagen = extras.getString("ruta_imagen");
			Bitmap bitmap = getBitmap(ruta_imagen);
		}

	/**
	 * Metodo privado que verifica que se cambio el valor del telefono o no esta¡
	 * en blanco (vacio).
	 */
	private boolean verificarCampoTelefono() {
		if (editTextTelefono.getText().toString().equals("")) {
			return false;
		}
		return true;
	}
	

	/**
	 * Metodo privado que edita una persona existente.
	 */
	private void editarPersona() {
		baseDatos = new DatabaseHandler(EditarPersonaActivity.this);

		try {
			// Crear objeto persona.
			int id = extras.getInt("id");

			Persona persona = new Persona(id, editTextNombre.getText()
					.toString(), editTextApellido.getText().toString(),
					editTextEdad.getText().toString(), editTextTelefono.getText().toString(), ruta_imagen);

			baseDatos.actualizarRegistros(id, persona.getNombre(),
					persona.getApellido(), persona.getEdad(),persona.getTelefono(),
					persona.getRutaImagen());
			mensaje.mostrarMensajeCorto("Se cambio correctamente el registro!!!");
		} catch (Exception e) {
			mensaje.mostrarMensajeCorto("Error al querer editar un registro!!!");
			e.printStackTrace();
		} finally {
			baseDatos.cerrar();
		}
	}

	/**
	 * 
	 */
	public boolean estadoEditarPersona() {
		// Si extras es diferente a null es porque tiene valores. En este caso
		// es porque se quiere editar una persona.
		if (extras != null) {
			return true;
		} else {
			return false;
		}
	}

}
Clase MainActivity
Código:
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		
		setContentView(R.layout.activity_main);
		
		// Hace referencia a la parte xml (activity_main.xml).
		listViewPersonas = (ListView) findViewById(R.id.listViewPersonas);
		botonAgregarPersona = (Button)findViewById(R.id.botonAgregarPersona);
		
		// Se recuperan todas las personas de la base de datos.
		recuperarTodasPersonas();
		
		// Asociamos los menus contextuales al listViewPersonas.
	    registerForContextMenu(listViewPersonas);
	}
	
	/**
	 * Metodo publico que se sobreescribe. En este metodo crearmos el menu contextual
	 * para el ListView de personas. 
	 */
	@Override
	public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo){
	    super.onCreateContextMenu(menu, v, menuInfo);
	    android.view.MenuInflater inflater = getMenuInflater();
	    AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo;
	    inflater.inflate(R.menu.opciones_personas, menu);
	}
		
	/**
	 * Metodo publico que se sobreescribe. En este metodo colocamos las acciones de las opciones del menu contextual
	 * para el ListView de personas. 
	 */
	@Override
	public boolean onContextItemSelected(android.view.MenuItem item) {
		AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
		
	    switch (item.getItemId()) {
	        case R.id.menu_contextual_editar_persona:
	        	editarPersona((int)info.id);
	            return true;
	        case R.id.menu_contextual_llamar_persona:
	        	llamar((int)info.id);
	        	return true;    
	        case R.id.menu_contextual_eliminar_persona:
	        	eliminarPersona((int)info.id);
	        	recuperarTodasPersonas();
	            return true;
	        default:
	            return super.onContextItemSelected((android.view.MenuItem) item);
	    }
	}

	/**
	 * Metodo privado que recupera todos las personas existentes de la base de datos.
	 */
	private void recuperarTodasPersonas() {
		try{
			baseDatos = new DatabaseHandler(this);
			
			// Devuelve todas las personas en el objeto Cursor.
			Cursor cursor = baseDatos.obtenerTodasPersonas();
		
		    String[] from = new String[]{
		    	"nombre", 
		    	"apellido", 
		    	"edad",
		    	"telefono",
		    	"ruta_imagen"
		    };
			    
		    int[] to = new int[]{
		    	R.id.TextViewNombre,
		    	R.id.TextViewApellido,
		    	R.id.TextViewEdad,
		    	R.id.textViewTelefono,
		    	R.id.thumb_persona,
		    };
	    	cursorAdapter = new ImagenAdapter(this, cursor, from, to);
	    	listViewPersonas.setAdapter(cursorAdapter);
	    }catch(Exception e){
	    	Log.d("Error", "El mensaje de error es: " + e.getMessage());
	    }finally{
	    	// Se cierra la base de datos.
	    	baseDatos.cerrar();
	    }
	}
	
	/**
	 * Metodo publico que edita una persona.
	 * @param p_id
	 */
	public void editarPersona(int p_id){
		// Si el p_id es 0, entonces se crea una nueva persona.
		if(p_id == 0){
			// Se dirige a la actividad EditarPersonaActivity.
	        Intent actividad_editarPersona = new Intent(MainActivity.this, EditarPersonaActivity.class);
	        startActivityForResult(actividad_editarPersona, CODIGO_RESULT_EDITAR_PERSONA); 
		}else{
			// Recupera una persona especifica.
			Persona persona;
			
			try{    		
				persona = baseDatos.getPersona(p_id);
		   	    
		   	    // Se dirige a la actividad EditarPersonaActivity.
		        Intent actividad_editarPersona = new Intent(this, EditarPersonaActivity.class);
		            
		        // Se le coloca parametros para enviar a la actividad EditarPersonaActivity.
		        actividad_editarPersona.putExtra("id", p_id);
		        actividad_editarPersona.putExtra("nombre", persona.getNombre());
		        actividad_editarPersona.putExtra("apellido", persona.getApellido());
		        actividad_editarPersona.putExtra("edad", persona.getEdad());
		        actividad_editarPersona.putExtra("telefono",persona.getTelefono());
		        actividad_editarPersona.putExtra("ruta_imagen", persona.getRutaImagen());
		            
		        startActivityForResult(actividad_editarPersona, CODIGO_RESULT_EDITAR_PERSONA); 
			}catch (Exception e){
			     Toast.makeText(getApplicationContext(), "Error al editar persona!!!", Toast.LENGTH_SHORT).show();
			     e.printStackTrace();
			}finally{
			     baseDatos.cerrar();
			}
		}
	}
	
	/**
	 * El metodo protegido se sobreescribe. Se llama con el resultado de otra actividad
	 * requestCode es el codigo original que se manda a la actividad
	 * resultCode es el codigo de retorno, 0 significa que todo sale bien
	 * intent es usado para obtener alguna informacion del caller.
	 */
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
	    super.onActivityResult(requestCode, resultCode, intent);
	    recuperarTodasPersonas();
	}
} // Fin de la actividad MainActivity.

En teoría falla por lo que puedo leer en la clase EditarPersonaActivity pero por más que miro no encuentro el fallo.. muchas gracias nuevamente por las molestias tomadas! :)