2015-10-16 3 views
0

Я создал базу данных SQL и смог безопасно хранить данные из трех представлений EditText и отображать их в одном TextView. Тогда я подумал, что было бы лучше отобразить данные в пользовательском ListView, поэтому я последовал за руководством разработчика и попытался отобразить данные с помощью simpleCursorAdapter. Но это не сработало ... я не получаю никаких ошибок или чего-то еще, данные просто не отображаются ... Я думаю, должно быть какое-то отсутствие соединения между Курсором, Адаптером или БД ... Я знаю, что это такой вопрос задают довольно часто, но я не смог найти свою ошибку, любая помощь будет принята с благодарностью:Отображение данных из SQL в пользовательском 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); 
} 

}

+0

ли вы убедитесь, что курсор действительно содержит записи? –

+0

сделал: 'SQLiteDatabase db = getWritableDatabase(); Курсор курсор = db.rawQuery ("SELECT * FROM" + TABLE_FAECHER + "WHERE 1", null); // проверяем, является ли курсор пустым или нет if (cursor! = Null && cursor.getCount()> 0) { Log.d («Событие», «Записи существуют»); } else { Log.d («Событие», «Записи не существуют»); } cursor.moveToFirst(); while (! Cursor.isAfterLast()) { cursor.moveToNext(); } db.close(); ' Журнал возвращает« Записи действительно существуют »... –

+0

Можете ли вы разместить свой XML (макет, содержащий список, а также XML строки списка). А также попробуйте напечатать значение из курсора в вашем журнале из цикла while. –

ответ

0

Я нашел код, который работает для меня: я узнал, что курсор в моем классе DBHandler не был пустым, но он был пуст в моей FaecherActivity ... поэтому я создал пользовательский SimpleCursorAdapter и изменил свой код таким образом:

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

}

Faecher RowAdapter:

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

}