1

Estoy teniendo un problema con una clase que he hecho en Android Studio que extiende de SQLiteOpenHelper. El problema es el siguiente: He creado una clase que extiende de SQLiteOpenHelper que maneja una tabla de una base de datos. Ya he creado más bases de datos con esta librería y no he tenido ningún problema hasta ahora. En esta clase parece ser que no crea la base de datos o la tabla, he probado a cambiar de activity por si fuese el contexto, pero parece que ese no es el problema, también he revisado que la consulta del CREATE TABLE ejecute sin errores y lo hace sin problema. El error que me da es el siguiente:

java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference

Y me da en la siguiente línea de código del método getIdsLugares(), que es la primera que ejecuta cuando ya he creado e inicializado la clase de la base de datos y quiero consultar unos datos:

SQLiteDatabase db=getReadableDatabase();

A continuación os dejo el código de la clase. Espero que me podáis ayudar porque yo ya he probado de todo y no sé que puede ser. Un saludo y gracias.

public class BDLugares extends SQLiteOpenHelper{
static String DB_NAME="mijaresapp";
static final String TABLE_NAME="lugares";
static final String[] COLUMNAS={"idcategoria","categoria","descripcion","direccion","imagen","pathimagen","lat","lon","ruta","titulo","id"};
String queryCreation="CREATE TABLE "+TABLE_NAME+" ("+COLUMNAS[0]+" TEXT, "+COLUMNAS[1]+" TEXT, "+COLUMNAS[2]+
        " TEXT, "+COLUMNAS[3]+" TEXT, "+COLUMNAS[4]+" TEXT, "+COLUMNAS[5]+" TEXT, "+COLUMNAS[6]+
        " DOUBLE, "+COLUMNAS[7]+" DOUBLE, "+COLUMNAS[8]+" TEXT, "+COLUMNAS[9]+" TEXT, "+ COLUMNAS[10]+" TEXT)";

static final int VERSION_ACTUAL=1;

public BDLugares(Context context) {
    super(context, DB_NAME, null, VERSION_ACTUAL);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL(queryCreation);
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

public Cursor getIdsLugares(){
    SQLiteDatabase db=getReadableDatabase();
    Cursor c=db.rawQuery("SELECT "+COLUMNAS[10]+" FROM "+TABLE_NAME,null);
    return c;
}

public long setDatosLugares(ItemCardMap item){

    SQLiteDatabase db=getWritableDatabase();
    ContentValues c = new ContentValues();
    c.put(COLUMNAS[0],item.getParentID());
    c.put(COLUMNAS[1],item.getTipo());
    c.put(COLUMNAS[2],item.getContenido());
    c.put(COLUMNAS[3],item.getDireccion());
    c.put(COLUMNAS[4],item.getImagen());
    c.put(COLUMNAS[5],item.getPathImagen());
    c.put(COLUMNAS[6],item.getLat());
    c.put(COLUMNAS[7],item.getLon());
    c.put(COLUMNAS[8],item.getRuta());
    c.put(COLUMNAS[9],item.getNombre());
    c.put(COLUMNAS[10],item.getId());
    long n=db.insert(TABLE_NAME,null,c);

    return n;
}

public int borrarDatos(String id){

    SQLiteDatabase db=getWritableDatabase();
    String[] datos={id};
    int n=db.delete(TABLE_NAME,COLUMNAS[1]+"=?",datos);
    db.close();

    return n;
}

public int borrarDatos(ArrayList ids){
    String[] datos=new String[ids.size()];
    for(int i=0; i<ids.size(); i++){
        datos[i]= String.valueOf(ids.get(i));
    }

    SQLiteDatabase db=getWritableDatabase();
    int n=db.delete(TABLE_NAME,COLUMNAS[1]+"=?",datos);
    db.close();

    return n;
}

public Cursor traerDatosCategoria(String parentID){
    SQLiteDatabase db=getReadableDatabase();
    String[] datos={parentID};
    Cursor c=db.rawQuery("SELECT * FROM "+TABLE_NAME+" WHERE "+COLUMNAS[0]+"=?",datos);
    return c;
}


}
  • Posible duplicado de [¿Cuál es la solución a todos los errores NullPointerException presentes, pasados y futuros?](https://es.stackoverflow.com/questions/42977/cu%c3%a1l-es-la-soluci%c3%b3n-a-todos-los-errores-nullpointerexception-presentes-pasados) – petronaMX Jul 05 '18 at 18:41
  • 1
    @JesúsPetronaCastro La cuestión es que el error no está en su código, así que más que una pregunta sobre qué es un NPE y los pasos para diagnosticar la causa base, esta pregunta es sobre el funcionamiento de `SQLiteOpenHelper`. Adrián: ¿Podrías poner el stacktrace completo? – SJuan76 Jul 05 '18 at 18:45

1 Answers1

2

No veo problema en tu clase BDLugares. En cuanto al error, recuerda que el query de tus datos debe realizarse después de instanciar la clase que extiende de SQLiteOpenHelper, por ejemplo:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

     //Obtiene base de datos.
    BDLugares db = new BDLugares(this);

    //Obtiene datos de consulta en un cursor
    Cursor lugares = db.getIdsLugares();
    if (lugares.moveToFirst()){
        do{
            ...
            ...
        }while(lugares.moveToNext());
    }


}

Si realizas la consulta antes (getIdsLugares()), el valor de db será null.

Jorgesys
  • 103,630
  • 13
  • 52
  • 124