2012-11-01 74 views
1

我正在嘗試開發一個應用程序,該應用程序在主要活動中顯示用戶課程列表。這些數據存儲在SQLite中。如果用戶希望添加更多的課程,他們可以通過按鈕按下來進行新的活動。我創建了一個數據庫,但是我正在努力閱讀數據。我看過很多文檔,但似乎沒有任何一致的暗示存在各種方法。有沒有人有什麼建議?Android:如何將數據讀取到主要活動

我試圖使用一個SimpleCursorAdapter來獲取數據,把它放到一個int數組中,並且 在listview中顯示信息。

logcat的

10-21 02:08:20.042: E/AndroidRuntime(7044): Uncaught handler: thread main exiting due to uncaught exception 
10-21 02:08:20.062: E/AndroidRuntime(7044): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.mycoursetimetable/com.example.mycoursetimetable.MyCourses}: java.lang.ClassCastException: android.widget.LinearLayout 
10-21 02:08:20.062: E/AndroidRuntime(7044):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2496) 
10-21 02:08:20.062: E/AndroidRuntime(7044):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2512) 
10-21 02:08:20.062: E/AndroidRuntime(7044):  at android.app.ActivityThread.access$2200(ActivityThread.java:119) 
10-21 02:08:20.062: E/AndroidRuntime(7044):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1863) 
10-21 02:08:20.062: E/AndroidRuntime(7044):  at android.os.Handler.dispatchMessage(Handler.java:99) 
10-21 02:08:20.062: E/AndroidRuntime(7044):  at android.os.Looper.loop(Looper.java:123) 
10-21 02:08:20.062: E/AndroidRuntime(7044):  at android.app.ActivityThread.main(ActivityThread.java:4363) 
10-21 02:08:20.062: E/AndroidRuntime(7044):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-21 02:08:20.062: E/AndroidRuntime(7044):  at java.lang.reflect.Method.invoke(Method.java:521) 
10-21 02:08:20.062: E/AndroidRuntime(7044):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
10-21 02:08:20.062: E/AndroidRuntime(7044):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
10-21 02:08:20.062: E/AndroidRuntime(7044):  at dalvik.system.NativeStart.main(Native Method) 
10-21 02:08:20.062: E/AndroidRuntime(7044): Caused by: java.lang.ClassCastException: android.widget.LinearLayout 
10-21 02:08:20.062: E/AndroidRuntime(7044):  at android.app.ListActivity.onContentChanged(ListActivity.java:234) 
10-21 02:08:20.062: E/AndroidRuntime(7044):  at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:201) 
10-21 02:08:20.062: E/AndroidRuntime(7044):  at android.app.Activity.setContentView(Activity.java:1622) 
10-21 02:08:20.062: E/AndroidRuntime(7044):  at com.example.mycoursetimetable.MyCourses.onCreate(MyCourses.java:39) 
10-21 02:08:20.062: E/AndroidRuntime(7044):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
10-21 02:08:20.062: E/AndroidRuntime(7044):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2459) 
10-21 02:08:20.062: E/AndroidRuntime(7044):  ... 11 more 
10-21 02:08:20.082: I/dalvikvm(7044): threadid=7: reacting to signal 3 
10-21 02:08:20.082: E/dalvikvm(7044): Unable to open stack trace file '/data/anr/traces.txt': Permission denied 
10-21 02:08:22.082: I/Process(7044): Sending signal. PID: 7044 SIG: 9 

activity_my_courses佈局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    > 

    <Button 
     android:id="@+id/labelAddCourseButton" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:onClick="addCourseButton" 
     android:padding="10dp" 
     android:text="@string/CourseName" /> 

    <ListView 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent"/> 
</LinearLayout> 

主要活動

public class MyCourses extends ListActivity { 

    static final String TEST = "com.example.mycoursetimetable.TEST"; 
    String [] MODULE; 
    private database MODULEDATABASE; 
    ListView listContent; 

    Cursor cursor; 

     @Override 
     public void onCreate(Bundle savedInstanceState) 
     { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_my_courses); 

     listContent =(ListView)findViewById(R.id.contentlist); 
     MODULEDATABASE = new database(this); 

     cursor = MODULEDATABASE.getData(); 
     String [] from = new String[]{database.KEY_MODULECODE,database.KEY_MODULENAME}; 

INT []到新= INT [] {R.id.labelModuleCode,R.id. labelEditModuleFull}; cursorAdapter CA = new cursorAdapter(this,R.layout.listcourses,cursor,from,to,0);

 listContent.setAdapter(CA); 

     } 

     class cursorAdapter extends SimpleCursorAdapter { 

     private Context context; 
     private int layout; 

     public cursorAdapter(Context context,int layout, Cursor cursor,String [] from, int[] to, int flag) 
     { 
      super(context,layout, cursor, from, to, flag); 
      this.context = context; 
      this.layout = layout; 
     } 

}

數據庫類

公共類的數據庫{

public static final String KEY_ROWID = "_id"; 
public static final String KEY_MODULECODE = "module_code"; 
public static final String KEY_MODULENAME = "module_name"; 
public static final String KEY_MODULETYPE = "module_type"; 
public static final String KEY_MODULEDAY = "module_day"; 
public static final String KEY_MODULESTART = "module_start"; 
public static final String KEY_MODULEEND = "module_end"; 
public static final String KEY_MODULELOCATION = "module_location"; 
public static final String KEY_MODULECOMMENTS = "module_comments"; 

private static final String DATABASE_NAME = "module_database"; 
private static final String DATABASE_TABLE = "my_modules"; 
private static final int DATABASE_VERSION = 1; 

private DbHelper myHelper; 
private final Context myContext; 
private SQLiteDatabase moduleDatabase; 

private static class DbHelper extends SQLiteOpenHelper { 

    public DbHelper(Context context){ 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 

    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL("CREATE TABLE " + DATABASE_TABLE + " (" + 
        KEY_ROWID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + 
        KEY_MODULECODE + " TEXT NOT NULL, " + 
        KEY_MODULENAME + " TEXT NOT NULL, " + 
        KEY_MODULELOCATION + " TEXT NOT NULL, " + 
        KEY_MODULECOMMENTS + " TEXT NOT NULL); " 
       ); 

    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 
     db.execSQL("DROP TABEL IF EXISTS " + DATABASE_TABLE); 
     onCreate(db); 

    } 


} 

public database(Context c){ 
    myContext = c; 
} 

public database openToWrite()throws SQLException{ 
    myHelper = new DbHelper(myContext); 
    moduleDatabase = myHelper.getWritableDatabase(); 
    return this; 
} 

public database openToRead()throws SQLException{ 
    myHelper = new DbHelper(myContext); 
    moduleDatabase = myHelper.getReadableDatabase(); 
    return this; 
} 
public void close(){ 
myHelper.close(); 
} 

public long createEntry(String moduleCode, String moduleName, String moduleLocation, String moduleComments) { 
    ContentValues cv = new ContentValues(); 
    cv.put(KEY_MODULECODE,moduleCode); 
    cv.put(KEY_MODULENAME,moduleName); 
    cv.put(KEY_MODULELOCATION,moduleLocation); 
    cv.put(KEY_MODULECOMMENTS,moduleComments); 
    return moduleDatabase.insert(DATABASE_TABLE,null,cv); 
    // TODO Auto-generated method stub 

} 

public Cursor getData() { 

    String[] columns = new String [] {KEY_ROWID,KEY_MODULECODE, KEY_MODULENAME}; 
    Cursor c = moduleDatabase.query(DATABASE_TABLE, columns, null, null, null, null, null); 

    return c; 
} 

}

+2

請更具體一點,什麼不適合你?你有沒有學習關於這個主題的任何教程? – Egor

+0

當我嘗試首次啓動該程序時,我目前正在獲取運行時錯誤。對不起,我試圖找到這個錯誤,但我越陷入錯誤,我得到的錯誤越多。 – Calgar99

+0

LogCat無法找到活動ComponentInfo? – Calgar99

回答

2

我懷疑這個問題很簡單,你忘了運行前打開數據庫光標。但我不確定這是只有的問題,因爲你沒有把你收到的錯誤(請下次做),所以我做了一個擴展的完整cursoradapter而不是簡單的重寫一個,希望將來它更直接,更靈活。這只是我的偏好,但我不明白爲什麼要使用SimpleCursorAdapter而不是更強大的一個,無論如何要擴展它。在listactivity類:

MODULEDATABASE = new database(this); 
    MODULEDATABASE.openToRead(); // don't forget this part! 
    cursor = MODULEDATABASE.getData(); 

    listContent = (ListView)findViewById(R.id.contentlist); 
    TestCursorAdapter ca = new TestCursorAdapter(this, cursor, 0); 
    listContent.setAdapter(ca); 

這裏是適配器:

public class TestCursorAdapter extends CursorAdapter { 

    private LayoutInflater viewInflater; 

    public TestCursorAdapter(Context context, Cursor c, int flags) { 
     super(context, c, flags); 
     // TODO Auto-generated constructor stub 
     viewInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    } 

    @Override 
    public void bindView(View v, Context context, Cursor c) { 
     TextView text_modulecode = (TextView)v.findViewById(R.id.labelModuleCode); 
     TextView text_modulename = (TextView)v.findViewById(R.id.labelEditModuleFull); 

     text_modulecode.setText(c.getColumnIndex("module_code")); 
     text_modulename.setText(c.getColumnIndex("module_name")); 
// ^set above to your real column locations, if incorrect 
    } 

    @Override 
    public View newView(Context context, Cursor c, ViewGroup parent) { 
     View v = viewInflater.inflate(R.layout.listcourses, parent, false); 
     return v; 
    } 

} 

而且,我希望你不要忘了,「表」是錯誤的拼寫中: db.execSQL("DROP TABEL IF EXISTS " + DATABASE_TABLE);在你的數據庫類

+0

感謝您花時間做出迴應。我暗示了上面的代碼。但也無濟於事。我已經添加了上面的完整logcat。任何幫助將非常感激。 – Calgar99

+0

根據堆棧跟蹤,MyCourses的'onCreate'方法的第39行有些不妥。它看起來像你可能會調用一個線性佈局對象,其他的東西。如果'listContent =(ListView)findViewById(R.id.contentlist);'是在第39行,確保'R.id.contentlist'引用listview而不是別的。 **但是**你應該知道,如果你將ListView應用於ListActivity而不是常規活動,那麼你的listview id **必須是**「@ id/android:list」'否則你會得到另一次崩潰和另一個錯誤。 – mango

+0

感謝您的指導,錯誤出現在setContentView(R.layout.activity_my_courses),這可能與我爲ListView設置的ID有關。我改變了ID爲「@ id/android:list」。如何識別代碼中的列表視圖,因爲R.id.list似乎不起作用。 – Calgar99

相關問題