Search code examples
javaandroiddatabaselistviewsimplecursoradapter

Display Data from SQL in custom ListView via SimpleCursorAdapter


i created a SQL Database and was able to safe data from three EditText Views and display it in a single TextView. Then i thought it would be way better to display the data in a custom ListView, so i followed the developer guide and tried to display the data by a simpleCursorAdapter. But it did not work...i do not get any errors or anything, the data is just not shown...I guess there must be some missing connection between the Cursor, the Adapter or the DB... i know that this kind of question is asked quite frequently, but i am unable to find my mistake, any help would be greatly appreciated:

MyDBHandlerFaecher.java:

public class MyDBHandlerFaecher extends SQLiteOpenHelper{
    private static final int DATABASE_VERSION = 5;
    private static final String DATABASE_NAME = "faecher.db";
    public static final String TABLE_FAECHER = "Faechertable";
    public static final String COLUMN_ID = "_id";
    public static final String COLUMN_NAME = "_faechername";
    public static final String COLUMN_RAUM = "_faecherraum";
    public static final String COLUMN_COLOR = "_faecherfarbe";

public MyDBHandlerFaecher(FaecherActivity context, String name, SQLiteDatabase.CursorFactory factory, int version) {
    super(context, DATABASE_NAME, factory, DATABASE_VERSION);
}

//Create the table
@Override
public void onCreate(SQLiteDatabase db) {
    String query = "CREATE TABLE " + TABLE_FAECHER + "(" +
            COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
            COLUMN_NAME + " TEXT, " +
            COLUMN_RAUM + " TEXT, " +
            COLUMN_COLOR + " TEXT " +
            ");";
    db.execSQL(query);
}

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

//Add a new row to the DB
public void addFach(Faecher fach){
    ContentValues values = new ContentValues();

    values.put(COLUMN_NAME, fach.get_faechername());
    values.put(COLUMN_RAUM, fach.get_faecherraum());
    values.put(COLUMN_COLOR, fach.get_faecherfarbe());

    SQLiteDatabase db = getWritableDatabase();
    db.insert(TABLE_FAECHER, null, values);
    db.close();
}
//Delete row from DB
public void deleteFach(String name){
    SQLiteDatabase db = getWritableDatabase();
    //Delete the line in which the COLUMN_NAME is equal to the input
    db.execSQL("DELETE FROM " + TABLE_FAECHER + " WHERE " + COLUMN_NAME + "=" + "\"" + name + "\"" + ";");
}

FaecherActivity.java

public class FaecherActivity extends AppCompatActivity{

EditText et_facheintrag;
EditText et_raumeintrag;
EditText et_farbeintrag;
ListView lv_faecher;
MyDBHandlerFaecher dbHandlerFaecher;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_faecher);

    et_facheintrag = (EditText) findViewById(R.id.et_facheintrag);
    et_raumeintrag = (EditText) findViewById(R.id.et_raumeintrag);
    et_farbeintrag = (EditText) findViewById(R.id.et_farbeintrag);
    lv_faecher = (ListView) findViewById(R.id.lv_faecher);
    dbHandlerFaecher = new MyDBHandlerFaecher(this, null, null, 1);

    printDatabase();
}

//Add fach to database
public void addButtonClicked(View view){
    Faecher fach = new Faecher(et_facheintrag.getText().toString(), et_raumeintrag.getText().toString(), et_farbeintrag.getText().toString());
    dbHandlerFaecher.addFach(fach);
    printDatabase();
}

//delete fach from database
public void deleteButtonClicked(View view){
    String inputText = et_facheintrag.getText().toString();
    dbHandlerFaecher.deleteFach(inputText);
    printDatabase();
}

public void printDatabase(){
    String[] fromColumns = new String[]{"_faechername", "_faecherraum", "_faecherfarbe"};
    int[] toViews = new int[]{R.id.facheintrag, R.id.raumeintrag, R.id.farbeintrag};

    Cursor cursor;
    cursor = getContentResolver().query(Uri.parse(MyDBHandlerFaecher.TABLE_FAECHER),null, null, null, null);

    SimpleCursorAdapter fachadapter = new SimpleCursorAdapter(this, R.layout.faecher_row, cursor, fromColumns,toViews, 0);
    lv_faecher.setAdapter(fachadapter);
}

}


Solution

  • i found code that works for me: i found out that the cursor in my DBHandler class was not empty, but it was empty in my FaecherActivity...so i created a custom SimpleCursorAdapter, and modified my code this way:

    FaecherActivity:

    public class FaecherActivity extends AppCompatActivity{
    
    EditText et_facheintrag;
    EditText et_raumeintrag;
    EditText et_farbeintrag;
    ListView lv_faecher;
    MyDBHandlerFaecher dbHandlerFaecher;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_faecher);
    
        et_facheintrag = (EditText) findViewById(R.id.et_facheintrag);
        et_raumeintrag = (EditText) findViewById(R.id.et_raumeintrag);
        et_farbeintrag = (EditText) findViewById(R.id.et_farbeintrag);
        lv_faecher = (ListView) findViewById(R.id.lv_faecher);
        dbHandlerFaecher = new MyDBHandlerFaecher(this, null, null, 1);
    
        printDatabase();
    }
    
    //Add fach to database
    public void addButtonClicked(View view){
        Faecher fach = new Faecher(et_facheintrag.getText().toString(), et_raumeintrag.getText().toString(),
                                    et_farbeintrag.getText().toString());
        dbHandlerFaecher.addFach(fach);
        printDatabase();
    }
    
    public void deleteButtonClicked(View view){
        String inputText = et_facheintrag.getText().toString();
        dbHandlerFaecher.deleteFach(inputText);
        printDatabase();
    }
    
    public void printDatabase(){
        String[] fromColumns = dbHandlerFaecher.databaseToStringArray();
        int[] toViews = new int[]{R.id.facheintrag, R.id.raumeintrag, R.id.farbeintrag};
    
        Cursor cursor;
        cursor = dbHandlerFaecher.getWritableDatabase().rawQuery(" SELECT * FROM " + MyDBHandlerFaecher.TABLE_FAECHER + " WHERE 1 ", null);
        //check if cursor is empty
        if (cursor != null && cursor.getCount()>0) {
            Log.d("Event", "Records do exist2");
        }
        else {
            Log.d("Event", "Records do not exist2");
        }
        SimpleCursorAdapter fachadapter = new FaecherRowAdapter(this, R.layout.faecher_row, cursor, fromColumns,toViews, 0);
        lv_faecher.setAdapter(fachadapter);
    

    MyDBHandlerFaecher:

    public class MyDBHandlerFaecher extends SQLiteOpenHelper{
    
    private static final int DATABASE_VERSION = 5;
    private static final String DATABASE_NAME = "faecher.db";
    public static final String TABLE_FAECHER = "Faechertable";
    public static final String COLUMN_ID = "_id";
    public static final String COLUMN_NAME = "_faechername";
    public static final String COLUMN_RAUM = "_faecherraum";
    public static final String COLUMN_COLOR = "_faecherfarbe";
    
    public MyDBHandlerFaecher(FaecherActivity context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, DATABASE_NAME, factory, DATABASE_VERSION);
    }
    
    //Create the table
    @Override
    public void onCreate(SQLiteDatabase db) {
        String query = "CREATE TABLE " + TABLE_FAECHER + "(" +
                COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                COLUMN_NAME + " TEXT, " +
                COLUMN_RAUM + " TEXT, " +
                COLUMN_COLOR + " TEXT " +
                ");";
        db.execSQL(query);
    }
    
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_FAECHER);
        onCreate(db);
    }
    
    //Add a new row to the DB
    public void addFach(Faecher fach){
        ContentValues values = new ContentValues();
    
        values.put(COLUMN_NAME, fach.get_faechername());
        values.put(COLUMN_RAUM, fach.get_faecherraum());
        values.put(COLUMN_COLOR, fach.get_faecherfarbe());
    
        SQLiteDatabase db = getWritableDatabase();
        db.insert(TABLE_FAECHER, null, values);
        db.close();
    }
    //Delete row from DB
    public void deleteFach(String name){
        SQLiteDatabase db = getWritableDatabase();
        db.execSQL("DELETE FROM " + TABLE_FAECHER + " WHERE " + COLUMN_NAME + "=" + "\"" + name + "\"" + ";");
    }
    
    public String[] databaseToStringArray() {
        String[] fromColumns = new String[]{COLUMN_NAME, COLUMN_RAUM, COLUMN_COLOR};
        SQLiteDatabase db = getWritableDatabase();
        Cursor cursor = db.rawQuery(" SELECT * FROM " + TABLE_FAECHER + " WHERE 1 ", null);
        //check if cursor is empty or not
        if (cursor != null && cursor.getCount()>0) {
            Log.d("Event", "Records do exist");
        }
        else {
            Log.d("Event", "Records do not exist");
        }
    
        cursor.moveToFirst();
        while (!cursor.isAfterLast()) {
            cursor.moveToNext();
        }
        db.close();
        return fromColumns;
    }
    

    }

    FaecherRowAdapter:

        public class FaecherRowAdapter extends SimpleCursorAdapter {
    
    private int layout;
    private Context context;
    
    public FaecherRowAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) {
        super(context, layout, c, from, to, flags);
        this.layout = layout;
        this.context = context;
    }
    
    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        Cursor c = getCursor();
    
        final LayoutInflater inflater = LayoutInflater.from(context);
        View v = inflater.inflate(R.layout.faecher_row, parent, false);
        bindView(v, context, c);
        return v;
    }
    
    @Override
    public void bindView(View v, Context context, Cursor c) {
    
        int fachNameColumn = c.getColumnIndex(MyDBHandlerFaecher.COLUMN_NAME);
        int fachRaumColumn = c.getColumnIndex(MyDBHandlerFaecher.COLUMN_RAUM);
        int fachFarbeColumn = c.getColumnIndex(MyDBHandlerFaecher.COLUMN_COLOR);
    
        String fachName = c.getString(fachNameColumn);
        String fachRaum = c.getString(fachRaumColumn);
        String fachFarbe = c.getString(fachFarbeColumn);
    
        //set the name of the entry
        TextView facheintrag = (TextView) v.findViewById(R.id.facheintrag);
        if (facheintrag != null){
            facheintrag.setText(fachName);
        }
        TextView raumeintrag = (TextView) v.findViewById(R.id.raumeintrag);
        if (raumeintrag != null){
            raumeintrag.setText(fachRaum);
        }
        TextView farbeintrag = (TextView) v.findViewById(R.id.farbeintrag);
        if (farbeintrag != null){
            farbeintrag.setText(fachFarbe);
        }
        }
    

    }