通过SimpleCursorAdapter在自定义ListView中显示SQL数据

时间:2015-10-16 15:24:58

标签: java android database listview simplecursoradapter

我创建了一个SQL数据库,能够安全地从三个EditText视图中获取数据并将其显示在一个TextView中。 然后我认为在自定义ListView中显示数据会更好,所以我按照开发人员指南尝试通过simpleCursorAdapter显示数据。但它不起作用...我没有得到任何错误或任何东西,数据只是没有显示...我想在光标,适配器或数据库之间必定存在一些缺失的连接...... 我知道这种问题经常被问到,但我无法找到我的错误,任何帮助都将不胜感激:

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);
}

}

1 个答案:

答案 0 :(得分:0)

我发现代码对我有用:我发现我的DBHandler类中的光标不是空的,但是我的FaecherActivity中它是空的...所以我创建了一个自定义的SimpleCursorAdapter,并以这种方式修改了我的代码: / p>

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);
    }
    }

}