1

メインアクティビティでユーザーコースのリストを表示するアプリを開発しようとしています。このデータは SQLite に保存されます。ユーザーがさらにコースを追加したい場合は、ボタンを押して新しいアクティビティに移動できます。データベースを作成しましたが、データの読み込みに関して苦労しています。多くのドキュメントを見てきましたが、一貫した実装のないさまざまな方法があるようです。誰か提案はありますか?

SimpleCursorAdapter を使用してデータを取得し、int 配列に入れ、リストビューに情報を表示しようとしています。

ログキャット

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[] to = new 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;
}

}

4

1 に答える 1

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);さらに、データベースクラスで「TABLE」のスペルが間違っていることを忘れない でください。

于 2012-11-01T17:23:17.550 に答える