2

Familia mi app se cierra cuando llega a la 2 linea de codigo:

private MyDataBase dataBase = new MyDataBase(context);
    private List<Nota> itemsImportantes =dataBase.getAllDataImportantes(); 

Me dice el LogCat NullPointExeption en esa linea. El metodo getAllDataImportantes() me devuelve una list<> y me rompo la cabeza intentando solucionar este error.

este es el metodo:

public List<Nota> getAllDataImportantes(){
        List<Nota> Notas = new ArrayList<>();
        SQLiteDatabase db = this.getWritableDatabase();
        Cursor res = db.rawQuery("Select * From "+TABLE_NAME2,null);

        while (res.moveToNext()){
            Nota notaActual = new Nota();
            notaActual.setId(res.getInt(0));
            notaActual.setTitulo(res.getString(1));
            notaActual.setDescripcion(res.getString(2));
            Notas.add(notaActual);
        }
        db.close();
        return Notas;
    }

Este es el error en el logcat:

java.lang.NullPointerException: Attempt to invoke virtual method 'java.util.List com.school.omg.mynote.MyDataBase.getAllDataImportantes()' on a null object reference

Esto es mi clase de BaseDatos

public class MyDataBase extends SQLiteOpenHelper {
public static final String DATABASE_NAME="NotasDB.db";
public static final String TABLE_NAME="Notas";
public static final String TABLE_NAME2="Notas_Importantes";
public static final String TABLE_NAME3="Notas_Recordatorios";

public static final String COL_0="ID";
public static final String COL_1="TITULO";
public static final String COL_2="CUERPO";

public MyDataBase(Context context) {
    super(context, DATABASE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE " + TABLE_NAME + "(ID INTEGER PRIMARY KEY AUTOINCREMENT, TITULO TEXT, CUERPO TEXT)");
    db.execSQL("CREATE TABLE " + TABLE_NAME2+ "(ID INTEGER PRIMARY KEY AUTOINCREMENT, TITULO TEXT, CUERPO TEXT)");
    db.execSQL("CREATE TABLE " + TABLE_NAME3+ "(ID INTEGER PRIMARY KEY AUTOINCREMENT, TITULO TEXT, CUERPO TEXT)");

}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXISTS "+TABLE_NAME);

}

public void InsertData(String Titulo, String Cuerpo){
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(COL_1,Titulo);
    values.put(COL_2, Cuerpo);
    db.insert(TABLE_NAME,null,values);
    db.close();
}

public List<Nota> getAllData(){
    List<Nota> Notas = new ArrayList<>();
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor res = db.rawQuery("Select * From "+TABLE_NAME,null);

    while (res.moveToNext()){
        Nota notaActual = new Nota();
        notaActual.setId(res.getInt(0));
        notaActual.setTitulo(res.getString(1));
        notaActual.setDescripcion(res.getString(2));
        Notas.add(notaActual);
    }
    db.close();
    return Notas;
}

public ArrayList<Nota> getAllDataImportantes(){
    ArrayList<Nota> Notas = new ArrayList<>();
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor res = db.rawQuery("Select * From "+TABLE_NAME2,null);

    while (res.moveToNext()){
        Nota notaActual = new Nota();
        notaActual.setId(res.getInt(0));
        notaActual.setTitulo(res.getString(1));
        notaActual.setDescripcion(res.getString(2));
        Notas.add(notaActual);
    }
    db.close();
    return Notas;
}

public void InsertDataImportantes(String Titulo, String Cuerpo){
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(COL_1,Titulo);
    values.put(COL_2, Cuerpo);
    db.insert(TABLE_NAME2,null,values);
    db.close();
}

public List<Nota> getAllDataRecordatorio(){
    List<Nota> Notas = new ArrayList<>();
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor res = db.rawQuery("Select * From "+TABLE_NAME3,null);

    while (res.moveToNext()){
        Nota notaActual = new Nota();
        notaActual.setId(res.getInt(0));
        notaActual.setTitulo(res.getString(1));
        notaActual.setDescripcion(res.getString(2));
        Notas.add(notaActual);
    }
    db.close();
    return Notas;
}

public void InsertDataRecordatorio(String Titulo, String Cuerpo){
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues values = new ContentValues();
    values.put(COL_1,Titulo);
    values.put(COL_2, Cuerpo);
    db.insert(TABLE_NAME3,null,values);
    db.close();
}
}

Ayuda. Graciass

  • Por favor muestra el método `getAllDataImportantes`. ¿La `List` que devuelve es del tipo `Nota`? Si puedes pon el LogCat completo en la pregunta. – A. Cedano Nov 23 '18 at 03:16
  • ya lo actualice – Erio Cedeno Nov 23 '18 at 04:20
  • ¿Sabes si esta todo bien con los datos de la base de datos? – denifer santiago fernandez Nov 23 '18 at 04:25
  • en aplicaciones anteriores me trabajaba bien, la base datos esta bien. en aplicaicones anteriores me dio este mismo error pero lo cambie a la misma posicion donde esta ahora y no me dio error. – Erio Cedeno Nov 23 '18 at 04:39
  • 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) – JDev Nov 23 '18 at 07:49
  • Tu código no está depurado ni controlado. ¿Qué debes controlar? La conexión puede ser nula, la consulta puede no traer datos porque es errónea o porque no hay datos. Todo eso debe ser controlado en el código, no asumir que todo es siempre color de rosas en la vida. Debes establecer controles en todo, generando una respuesta adecuada para mostrar al usuario. ¿Cómo hacerlo? Debes revisar los métodos y escribir tu código en coherencia con ellos. Por ejemplo, si `getWritableDatabase()` eleva una excepción si la base de datos no se puede abrir para escritura, debes manejarla en el código... – A. Cedano Nov 23 '18 at 10:27
  • Has controlado que el objeto database no sea nulo? Lo mismo el error está en el Constructor de MyDataBase – kronosXXI Nov 23 '18 at 12:14
  • Pone el codigo del constructor de MyDataBase porque eso es null, getAllDataImportantes no creo que tenga nada que ver con el error – Erick Silva Nov 23 '18 at 14:28

1 Answers1

2

Si es como veo tu código, el problema es que estas definiendo tus propiedades en el espacio de la clase, pero una dependiendo de otra y no le da tiempo de asignarle el valor.

Debes crear un método en tu clase que inicialice la variable database, seguido de la variable itemsImportantes. Por ejemplo:

// La declaras, ambas almacenan un valor nulo
private MyDataBase dataBase;
private List<Nota> itemsImportantes; 

 . . .

// En tiempo de ejecucion inicializas las variables llamando este método, antes de ejecutar cualquier operación con estas variables
public void initData(){
     dataBase = new MyDataBase(context);
     itemsImportantes = dataBase.getAllDataImportantes(); 
}

PD: si estas utilizando context para llamar a la superclase, asegurate que en el constructor de MyDatabase no sea nulo.

Andrespengineer
  • 3,002
  • 1
  • 8
  • 18
  • Muchas gracias Andres, hice lo que dijiste y me funciono a la perfección. – Erio Cedeno Nov 23 '18 at 18:42
  • 1
    Siempre que vayas a utilizar variables o propiedades en una clase, intenta asignarle su debido valor en tiempo de ejecución o al momento de utilizarla, a menos que sean valores constantes. Ya que así te aseguras de no tener referencias que no vayas a utilizar y evitar excepciones. Buena suerte. – Andrespengineer Nov 23 '18 at 19:15