2013-04-28 21 views
2

我對碎片很感興趣,並試圖學習如何與他們合作。我爲編程愛好,所以請不要苛刻...;)如何正確連接SQLite數據庫與ListFragment?

因此,我用Eclipse助手設置了一個可滑動選項卡的應用程序。在這一點上,兩個選項卡與常規片段相連,它可以工作。但是我想要第三個顯示數據庫內容的選項卡。

我的問題是,如何正確連接ListFragment和數據庫?我所得到的是一個不間斷運行的ProgressCircle。

我已經有了一些ListActivitys和SQLiteDatabases的經驗,我對自己進行了定位。所以我想我的數據庫代碼是好的,因爲我沒有錯誤。我相信我的錯誤在ListFragment類中,但我不知道該怎麼做,因爲Eclipse不會顯示任何錯誤......另外,當Android 3正在進行時,我與數據庫一起工作,所以我不想排除某些5月發生了變化......

所以這是我ListFragment的代碼:

import android.app.Activity; 
import android.content.Context; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.support.v4.app.ListFragment; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 

public class GefilterteListe extends ListFragment { 

    public static final String TAG = GefilterteListe.class.getSimpleName(); 

    private FilterDatenbankHandler dbHandler; 
    private Cursor dbCursor; 
    private LehrerDatenbankAdapter dbAdapter; 
    private Context mContext; 

    public View OnCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
     Log.i(TAG, "GefilterteListe onCreate"); 
     View returnView = inflater.inflate(R.layout.plan, container, false); 
     mContext = getActivity(); 
     dbHandler = new FilterDatenbankHandler(mContext); 
     dbCursor = dbHandler.query(); 
     ((Activity) mContext).startManagingCursor(dbCursor); 
     dbAdapter = new LehrerDatenbankAdapter(mContext, dbCursor); 
     setListAdapter(dbAdapter); 

     return returnView; 
    } 

} 

這是我將要顯示的數據的plan.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" > 

    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:text="Krzl" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:textSize="36sp" /> 

    <TextView 
     android:id="@+id/textView2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_marginLeft="20dp" 
     android:layout_toRightOf="@+id/textView1" 
     android:text="Tag" 
     android:textAppearance="?android:attr/textAppearanceSmall" /> 

    <TextView 
     android:id="@+id/textView3" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:text="Datum" 
     android:textAppearance="?android:attr/textAppearanceSmall" /> 

    <TextView 
     android:id="@+id/textView4" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBottom="@+id/textView1" 
     android:layout_alignLeft="@+id/textView2" 
     android:text="Stunde: " 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

    <TextView 
     android:id="@+id/textView5" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBaseline="@+id/textView4" 
     android:layout_alignBottom="@+id/textView4" 
     android:layout_toRightOf="@+id/textView4" 
     android:text="Stunde" 
     android:textAppearance="?android:attr/textAppearanceMedium" /> 

    <TextView 
     android:id="@+id/textView6" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/textView1" 
     android:text="Merkmal: " 
     android:textAppearance="?android:attr/textAppearanceSmall" /> 

    <TextView 
     android:id="@+id/textView7" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBaseline="@+id/textView6" 
     android:layout_alignBottom="@+id/textView6" 
     android:layout_toRightOf="@+id/textView1" 
     android:text="Merkmal" 
     android:textAppearance="?android:attr/textAppearanceSmall" /> 

    <TextView 
     android:id="@+id/textView8" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_below="@+id/textView6" 
     android:text="Info: " 
     android:textAppearance="?android:attr/textAppearanceSmall" /> 

    <TextView 
     android:id="@+id/textView9" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignBaseline="@+id/textView8" 
     android:layout_alignBottom="@+id/textView8" 
     android:layout_toRightOf="@+id/textView8" 
     android:text="Info" 
     android:textAppearance="?android:attr/textAppearanceSmall" /> 


</RelativeLayout> 

如果你需要適配器或/和處理程序的代碼,請告訴我。謝謝你的幫助。

編輯: 在這句話下面我添加了處理程序和適配器。 處理程序:

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteException; 
import android.database.sqlite.SQLiteDatabase.CursorFactory; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 

public class FilterDatenbankHandler extends SQLiteOpenHelper{ 

    private static final String TAG = FilterDatenbankHandler.class.getSimpleName(); 

    //Name und Version der Datenbank 
    private static final String DATABASE_NAME = "Lehrer.db"; 
    private static final int DATABASE_VERSION = 1; 

    //Name und Attribute der Tabelle "vertretungsplan" 
    private static final String _ID = "_id"; 
    private static final String TABLE_NAME = "Lehrerdatenbank"; 
    private static final String KUERZEL = "kürzel"; 
    private static final String WOCHENTAG = "tag"; 
    private static final String DATUM = "datum"; 
    private static final String STUNDE = "stunde"; 
    private static final String MERKMAL = "merkmal"; 
    private static final String INFO = "info"; 

    //Tabelle "vertretungsplan11" anlegen 
    private static final String TABLE_CREATE = " CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (" + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " 
      + KUERZEL + " STRING, " + WOCHENTAG + " STRING, " + DATUM + " STRING, " + STUNDE + " STUNDE, " + MERKMAL 
      + " STRING, " + INFO + " STRING); "; 

    //Tabelle "test" löschen 
    private static final String TABLE_DROP = "DROP TABLE IF EXISTS " + TABLE_NAME; 

    FilterDatenbankHandler(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
//  Log.i(TAG, "DatenbankHandler wurde initiiert."); 
    } 


    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 
     db.execSQL(TABLE_CREATE); 
     Log.i(TAG, "FilterDatenbankHandler: " + db); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     Log.w(TAG, "Upgraden der Datenbank von Version " + oldVersion + " zu Version " + newVersion + "; alle Daten werden gelöscht"); 
     db.execSQL(TABLE_DROP); 
     onCreate(db); 
    } 

    public void redoTbl(){ 
     SQLiteDatabase db = getWritableDatabase(); 
     db.execSQL(TABLE_DROP); 
     Log.i(TAG, "Lehrer-Tabelle gelöscht"); 
     onCreate(db); 
    } 

    public void insert(String kuerzel, String tag, String datum, String stunde, String merkmal, String info){ 
     long rowId = -1; 
     try { 
      SQLiteDatabase db = getWritableDatabase(); 
      ContentValues values = new ContentValues(); 
      values.put(KUERZEL, kuerzel); 
      values.put(WOCHENTAG, tag); 
      values.put(DATUM, datum); 
      values.put(STUNDE, stunde); 
      values.put(MERKMAL, merkmal); 
      values.put(INFO, info); 
      rowId = db.insert(TABLE_NAME, null, values); 
      Log.i(TAG, "insert: " + kuerzel + ", " + tag + ", " + datum + ", " + stunde + ", " + merkmal + ", " + info); //I get this Log, so i suppose it does work. 
     } catch (SQLiteException e) { 
      Log.i(TAG, "insert()", e); 
     } finally { 
      Log.i(TAG, "insert(): rowId=" + rowId); 
     } 
    } 

    public Cursor query() { 
     SQLiteDatabase db = getWritableDatabase(); 
     return db.query(TABLE_NAME, null, null, null, 
       null, null, _ID + " ASC"); 
    } 

} 

適配器:

import android.content.Context; 
import android.database.Cursor; 
import android.support.v4.widget.CursorAdapter; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 

public class LehrerDatenbankAdapter extends CursorAdapter{ 

    private LayoutInflater inflator; 
    private int s; 
    String TAG = "LehrerDatenbankAdapter"; 

    public LehrerDatenbankAdapter(Context context, Cursor c){ 
     super(context, c); 
     inflator = LayoutInflater.from(context); 
     s = c.getCount(); 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     // TODO Auto-generated method stub 
     TextView textview1 = (TextView) view.findViewById(R.id.textView1);//Kürzel 
     TextView textview2 = (TextView) view.findViewById(R.id.textView2);//tag 
     TextView textview3 = (TextView) view.findViewById(R.id.textView3);//datum 
     TextView textview4 = (TextView) view.findViewById(R.id.textView5);//Stunde 
     TextView textview5 = (TextView) view.findViewById(R.id.textView7);//Merkmal 
     TextView textview6 = (TextView) view.findViewById(R.id.textView9);//Info 

     textview1.setText(cursor.getString(1)); 
     textview2.setText(cursor.getString(2)); 
     textview3.setText(cursor.getString(3)); 
     textview4.setText(cursor.getString(4)); 
     textview5.setText(cursor.getString(5)); 
     textview6.setText(cursor.getString(6)); 

     cursor.moveToNext(); 
    } 

    @Override 
    public View newView(Context arg0, Cursor arg1, ViewGroup arg2) { 
     // TODO Auto-generated method stub 
     return inflator.inflate(R.layout.plan, null); 
    } 

} 

當我在編輯這篇文章,我得到了主意,我可能有一個進口錯,但如果我能不能找出來,一這些都是錯誤的,因爲這對我來說也是新的。 我希望我不會簡單地忘記一些東西,那會很尷尬......

回答

1

我明白了!我只需寫一個onCreate方法,並且不得不在onCreateView方法中插入我的代碼...

0

提供dbAdapter和dbHandler代碼將會有所幫助,因爲它會顯示您是否實際打開以及如何查詢數據庫。你可能想看看SimpleCursorAdaptor。另外,如果你使用的是4.x,你可能想要結合Cursorloader和LoaderManager,它們提供了打開和關閉數據庫以及所有線程的所有工作(檢查這個http://www.androiddesignpatterns.com/2012/07/loaders-and-loadermanager-background.html),但我建議你確保您的光標和數據庫查詢在切換到裝載機之前完全正常工作。我有一個沒有加載器的功能齊全的應用程序,但遇到了一些使用listview滾動的UI性能問題。切換到裝載機解決了這一切。

+0

感謝您的回答,我添加了適配器和處理程序。 – 2013-04-30 19:46:19

+0

我已經有一次偶然發現Loadermanager,但低估了它的可能性,無論如何,我將不得不學習如何使用它。 與SimpleCursorAdapter相同... 對不起,我編輯了評論太慢... – 2013-04-30 19:54:52