2012-11-01 30 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

相关问题