2015-10-16 66 views
0

我創建了一個SQL數據庫,並且能夠從三個EditText Views安全地獲取數據並將其顯示在單個TextView中。 然後我認爲這會更好地顯示自定義ListView中的數據,所以我遵循開發人員指南並試圖通過simpleCursorAdapter顯示數據。但它沒有工作......我沒有得到任何錯誤或任何東西,數據只是沒有顯示......我想在光標,適配器或數據庫之間必須有一些缺失的連接......我知道,這種問題是問相當頻繁,但我無法找到我的錯誤,任何幫助將不勝感激:通過SimpleCursorAdapter在自定義ListView中顯示來自SQL的數據

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

did: 'SQLiteDatabase db = getWritableDatabase();遊標cursor = db.rawQuery(「SELECT * FROM」+ TABLE_FAX +「WHERE 1」,null); //檢查是否光標是空的或不是 如果(光標= NULL && cursor.getCount()> 0!){ Log.d( 「事件」, 「記錄確實存在」); } else { Log.d(「事件」,「記錄不存在」); } cursor.moveToFirst(); (!cursor.isAfterLast()){ cursor.moveToNext(); } db.close();' Log將返回「記錄確實存在」... –

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

}

相關問題