这是一个能够插入,删除和修改Contactos的简单数据库。 我需要使用测试驱动开发
来创建这个类我是这样开始的......
https://github.com/ANEDIN/SuperHeroes-Agenda/blob/master/src/com/example/tests/testBaseDatosContactos.java和函数insertarContacto(addContacto)。
使用Eclipse,TestConnection可以工作但是testInsertarContacto不会。
不知道我是否以正确的方式开始任何提示或帮助都会被贬低。 另外我怀疑在testBaseDatosContactos中我是否必须在测试的开始或结束时清理数据库或如何处理...
由于
答案 0 :(得分:0)
BasedeDatosContactos.java(我已经制作的,我需要使用测试驱动开发重制)
package com.example.informacion;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteConstraintException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;
import java.util.ArrayList;
public class BaseDatosContactos extends SQLiteOpenHelper {
/*
NOMBRE_BASEDATOS: sera el nombre de nuestro archivo de base de datos
VERSION_BASEDATOS: la versión de nuestra base de datos
TABLA_CONTACTOS: un string que contiene una sentencia SQL para la creación de una tabla llamada contactos. Lo que tenemos en
parentesis son las columnas, un Ãndice INT primario (no es obligatorio pero si muy recomendable para
no tener problemas a la hora de insertar, modificar o borrar alguna fila ya que es un valor único) */
private static final int VERSION_BASEDATOS = 4;
// Nombre de nuestro archivo de base de datos
private static final String NOMBRE_BASEDATOS = "contactos.db";
// Sentencia SQL para la creación de una tabla
private static final String TABLA = "contactos";
private static final String CREAR_TABLA = "CREATE TABLE " + TABLA
+ "(nombre TEXT, direccion TEXT, telefono TEXT,email TEXT PRIMARY KEY UNIQUE NOT NULL,miembrofacebook INT, miembrotwitter INT, miembrogoogle INT, miembrolinkedin INT, sexo INT, tipocontacto TEXT, imagen INT)";
private static final String TAG ="BaseDatosContactos";
/* La clase ContactoAgenda que quiero almacenar es:
private String Nombre;
private String Direccion;
private String Telefono;
private String mail;
//Cambio boolean por int ya que no va bien en las bases de datos, true=1, false=0
private int miembroFacebook;
private int miembroTwitter;
private int miembroGoogle;
private int miembroLinnkedin;
private int sexo;
private String tipoContacto;
private int drawableImageID; */
public BaseDatosContactos(Context context) {
super(context, NOMBRE_BASEDATOS, null, VERSION_BASEDATOS);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL(CREAR_TABLA); //db.execSQL(TABLA_CONTACTOS);
//addContacto(new contactoAgenda("Belen", "c/ Diego Madrazo","1", "belen@gmail.com",true, true, false, false, false,"Familia", R.drawable.hulk));
//Inicializo la base de datos con algun contacto
insertarContacto(db,"Belen", "c/ Diego Madrazo","1", "belen@gmail.com",1, 1, 0, 0, 0,"Familia", R.drawable.hulk);
insertarContacto(db, "Daniel", "c/ Diego Madrazo","2", "daniel@gmail.com",0, 0, 0, 0, 1,"Laboral", R.drawable.spidey);
insertarContacto(db, "Eduardo", "c/ Segovia","973269128", "eduardo@gmail.com",0, 0, 0, 1, 1,"Amigo", R.drawable.ironman);
insertarContacto(db,"Asuncion", "c/ Paseo de Ronda","92458", "mama@msn.com",1, 1, 1, 0, 0,"Laboral", R.drawable.thor);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
// db.execSQL("DROP TABLE IF EXISTS " + TABLA_CONTACTOS);
db.execSQL("DROP TABLE IF EXISTS " + TABLA);
onCreate(db);
// insertarContacto("Belen", "c/ Diego Madrazo","1", "belen@gmail.com",1, 1, 0, 0, 0,"Familia", R.drawable.hulk);
}
/*
Creamos un método "insertarCONTACTO" y como parámetros los datos que queremos insertar en la tabla (id, nombre, telefono, email ....).
Dentro del método creamos una instancia de la clase "SQLiteDatabase" y usamos su método "getWritableDatabase()" para poder
escribir en la base de datos. Encapsulamos todo en un if por si acaso la base de datos no existe y ya dentro del if creamos
una instancia de la clase "ContentValues" que como su nombre indica es un almacenador de un conjunto de datos.
Usamos el metodo "put(key, value)" que nos pide como primer parámetro "key" el nombre donde establecer el valor almacenado
y como segundo parámetro el valor que queremos almacenar. Una vez almacenamos los datos insertamos una fila en la
tabla usamos el método "insert(table, nullColumnHack, values)"
*/
public boolean insertarContacto(String nombre, String direccion, String telefono, String email,int miembrofacebook, int miembrotwitter, int miembrogoogle, int miembrolinkedin, int sexo, String tipocontacto, int imagen){
SQLiteDatabase db = getWritableDatabase();
if (db != null) {
ContentValues valores = new ContentValues();
valores.put("nombre", nombre);
valores.put("direccion", direccion);
valores.put("telefono", telefono);
valores.put("email", email);
valores.put("miembrofacebook", miembrofacebook);
valores.put("miembrotwitter", miembrotwitter);
valores.put("miembrogoogle", miembrogoogle);
valores.put("miembrolinkedin", miembrolinkedin);
valores.put("sexo", sexo);
valores.put("tipocontacto", tipocontacto);
valores.put("imagen", imagen);
//db.insert("contactos", null, valores);
try {
db.insertOrThrow(TABLA, null, valores); //TABLA por "contactos"
return true;
} catch (SQLiteConstraintException e) {
Log.d(TAG, "Fallo en la insercion: seguramente la clave ya existe.");
}
}
db.close();
return false;
}
public boolean insertarContacto(SQLiteDatabase db, String nombre, String direccion, String telefono, String email,int miembrofacebook, int miembrotwitter, int miembrogoogle, int miembrolinkedin, int sexo, String tipocontacto, int imagen){
if (db != null) {
ContentValues valores = new ContentValues();
valores.put("nombre", nombre);
valores.put("direccion", direccion);
valores.put("telefono", telefono);
valores.put("email", email);
valores.put("miembrofacebook", miembrofacebook);
valores.put("miembrotwitter", miembrotwitter);
valores.put("miembrogoogle", miembrogoogle);
valores.put("miembrolinkedin", miembrolinkedin);
valores.put("sexo", sexo);
valores.put("tipocontacto", tipocontacto);
valores.put("imagen", imagen);
//db.insert("contactos", null, valores);
try {
db.insertOrThrow(TABLA, null, valores); //TABLA por "contactos"
return true;
} catch (SQLiteConstraintException e) {
Log.d(TAG, "Fallo en la insercion: seguramente la clave ya existe.");
}
}
return false;
}
//Creo un insertarcontacto propio pasandole un contacto
public boolean insertarContacto(ContactoAgenda contacto){
SQLiteDatabase db = getWritableDatabase();
if (db != null) {
ContentValues valores = new ContentValues();
valores.put("nombre", contacto.getNombre());
valores.put("direccion", contacto.getDireccion());
valores.put("telefono", contacto.getTelefono());
valores.put("email", contacto.getMail());
valores.put("miembrofacebook", contacto.isMiembroFacebook());
valores.put("miembrotwitter", contacto.isMiembroTwitter());
valores.put("miembrogoogle", contacto.isMiembroGoogle());
valores.put("miembrolinkedin", contacto.isMiembroLinnkedin());
valores.put("sexo", contacto.isSexo());
valores.put("tipocontacto", contacto.getTipoContacto());
valores.put("imagen", contacto.getDrawableImageId());
//db.insert("contactos", null, valores);
try {
db.insertOrThrow(TABLA, null, valores); //TABLA por "contactos"
return true;
} catch (SQLiteConstraintException e) {
Log.d(TAG, "Fallo en la insercion: seguramente la clave ya existe.");
}
}
db.close();
return false;
}
/*El método "update(table, values, whereClause, whereArgs)" para actualizar/modificar registros de nuestra tabla.
* Este método nos pide el nombre de la tabla "table", los valores a modificar/actualizar "values" (ContentValues),
* una condición WHERE "whereClause" que nos sirve para indicarle que valor queremos que actualice
* (en este caso cogemos como referencia la id de nuestro contacto) y como ultimo parámetro "whereArgs" podemos pasarle
* los valores nuevos a insertar, en este caso no lo vamos a necesitar por lo tanto lo ponemos a null.
* Para terminar deberemos cerrar siempre nuestra base de datos con el método "close()".
*/
public boolean modificarContacto(String nombre, String direccion, String telefono, String email,int miembrofacebook, int miembrotwitter, int miembrogoogle, int miembrolinkedin, int sexo, String tipocontacto, int imagen){
try {
SQLiteDatabase db = getWritableDatabase();
ContentValues valores = new ContentValues();
valores.put("nombre", nombre);
valores.put("direccion", direccion);
valores.put("telefono", telefono);
valores.put("email", email);
valores.put("miembrofacebook", miembrofacebook);
valores.put("miembrotwitter", miembrotwitter);
valores.put("miembrogoogle", miembrogoogle);
valores.put("miembrolinkedin", miembrolinkedin);
valores.put("sexo", sexo);
valores.put("tipocontacto", tipocontacto);
valores.put("imagen", imagen);
db.update(TABLA, valores, "email=" + email, null);
//db.update("contactos", valores, "_id=" + id, null);
db.close();
return true;
} catch (Exception e) {
Log.d(TAG, "Fallo en la modificación.");
}
return false;
}
public boolean modificarContacto(ContactoAgenda contacto){
try {
SQLiteDatabase db = getWritableDatabase();
ContentValues valores = new ContentValues();
valores.put("nombre", contacto.getNombre());
valores.put("direccion", contacto.getDireccion());
valores.put("telefono", contacto.getTelefono());
valores.put("email", contacto.getMail());
valores.put("miembrofacebook", contacto.isMiembroFacebook());
valores.put("miembrotwitter", contacto.isMiembroTwitter());
valores.put("miembrogoogle", contacto.isMiembroGoogle());
valores.put("miembrolinkedin", contacto.isMiembroLinnkedin());
valores.put("sexo", contacto.isSexo());
valores.put("tipocontacto", contacto.getTipoContacto());
valores.put("imagen", contacto.getDrawableImageId());
// String mail="\""+contacto.getMail()+"\"";
db.update(TABLA, valores, "email=" + contacto.getMail(), null);
//db.update("contactos", valores, "_id=" + id, null); ---> db.update("contactos", valores, "_id=" + id, null);
db.close();
return true;
} catch (Exception e) {
Log.d(TAG, "Fallo en la modificación.");
}
return false;
}
/*
Para borrar registros usaremos el método "delete(table, whereClause, whereArgs)" que nos pide el nombre de la tabla "table",
el registro a borrar "whereClause" que tomaremos como referencia su id y como ultimo parámetro "whereArgs" los valores a
borrar.
*/
public boolean borrarContacto(String email)
{
try {
SQLiteDatabase db = getWritableDatabase();
db.delete(TABLA, "email= '" + email+"'", null);
db.close();
return true;
} catch (Exception e) {
Log.d(TAG, "Fallo en la modificación.");
}
return false;
}
public boolean borrarContacto( ContactoAgenda contacto)
{
try {
SQLiteDatabase db = getWritableDatabase();
db.delete(TABLA, "email= '" + contacto.getMail()+"'", null);
db.close();
return true;
} catch (Exception e) {
Log.d(TAG, "Fallo en la modificación.");
}
return false;
}
/*Este método devuelve un objeto Contactos con los datos del contacto (id, nombre, telefono, email). En este caso como
* queremos leer hacemos uso del método "getReadableDatabase()". Creamos una variable "valores_recuperar" con las columnas
* que queremos recuperar, en este caso vamos a recuperar todos los datos de un registro.
* Continuamos creando un "Cursor" que se encarga de devolver el resultado de un registro de la tabla y lo almacena en
* la memoria, le aplicamos el método:
* query(table, columns, selection, selectionArgs, groupBy, having, orderBy, limit)
Con este método conseguimos leer un registro de la tabla. Como primer parámetro "table" nos pide el nombre de la tabla,
"columns" las columnas que queremos recuperar, con "selection" le indicamos el registro a recuperar (en este caso
recuperamos con el id), o los registros a recuperar "selectionArgs", "groupBy" para agrupar los registros consultados,
"having" es un filtro para incluir los registros en el cursor (este parámetro se usarÃa con groupBy), "orderBy" para
ordenar las filas y "limit" para limitar el numero de filas consultadas.
Con el método "moveToFirst()" ponemos el cursor al inicio de los datos almacenados.
Lo encapsulamos en un if por si acaso no hay datos almacenados.
Continuamos creando un objeto "Contactos" para almacenar los datos consultados de un registro, y los vamos recuperando
del cursor con métodos get indicando la posición de la columna.
Para terminar debemos cerrar la base de datos y el cursor.*/
public ContactoAgenda recuperarContacto(String email) {
SQLiteDatabase db = getReadableDatabase();
String[] valores_recuperar = {"nombre","direccion","telefono","email", "miembrofacebook","miembrotwitter","miembrogoogle","miembrolinkedin","sexo","tipocontacto","imagen"};
Cursor c = db.query(TABLA, valores_recuperar, "email= '" + email+"'", null, null, null, null,null);
if(c != null) {
c.moveToFirst();
}
ContactoAgenda contactos = new ContactoAgenda(c.getString(0), c.getString(1), c.getString(2), c.getString(3),c.getInt(4), c.getInt(5), c.getInt(6), c.getInt(7),c.getInt(8), c.getString(9), c.getInt(10));
db.close();
c.close();
return contactos;
}
然后我开始测试驱动......我想要“端口”的第一件事就是insertarContacto ......
package com.example.tests;
import android.content.Context;
import com.example.informacion.BaseDatosContactos;
import com.example.informacion.BaseDatosGlobal;
import com.example.informacion.ContactoAgenda;
import junit.framework.TestCase;
public class testBaseDatosContactos extends TestCase {
private BaseDatosGlobal bdGlobal;
private BaseDatosContactos bdContactos;
private ContactoAgenda contacto;
public void setUp() throws Exception
{
super.setUp();
bdGlobal = BaseDatosGlobal.getInstance();
bdContactos = bdGlobal.agendaBaseDatos;
contacto = new ContactoAgenda();
}
public void tearDown() throws Exception
{
super.tearDown();
bdGlobal = null;
bdContactos = null;
contacto = null;
}
public void testConexion() throws Exception
{
assertNotSame(bdGlobal, null);
}
public void testInsertarContacto() throws Exception
{
contacto.setNombre("Pedro");
contacto.setDireccion("c/ San Juan 2");
contacto.setMail("pedro@mail.es");
contacto.setMiembroFacebook(0);
contacto.setMiembroGoogle(0);
contacto.setMiembroLinnkedin(0);
contacto.setMiembroTwitter(0);
contacto.setTelefono("999888777");
contacto.setTipoContacto("Laboral");
boolean resultado = bdContactos.insertarContacto(contacto);
assertEquals(resultado, true);
}
}
希望这会有所帮助......