0

私の問題は、データベースからデータを正確に表示する方法がわからないことです。

データベースを開閉してテーブルを作成する DatabaseHelper アクティビティ (不要なコードをカットしました) を次に示します。

final static String PN_TABLE = "Tablica_Poniedzialek";
    static final String PN_KEY_ID = "_id";
    final static String PN_KEY_TYPE_OF_SESSION ="type_of_session";
    final static String PN_KEY_START_TIME ="start_time";
    final static String PN_KEY_END_TIME ="end_time";
    final static String PN_KEY_NAME ="name";                         
    final static String PN_KEY_ROOM ="room";  

データベースへのデータの作成と追加は正常に機能します。問題は、データベースに挿入されたデータを正確に表示する方法がわからないことです。Cursors と List Adapter を使用してみましたが、エミュレータでアプリケーションを起動するたびにアプリケーションが強制終了されるため、何かを台無しにしてしまったようです。

これは、データベースからデータを取得して表示することを担当する私のアクティビティです。実際にデータをリストビューとして表示する方法がわかりません。リストを作成する方法(そうすると思います)と、単にデータベースからデータを取得する方法のどちらが良いかはわかりません。しかし、最初のものが正しいとしましょう。問題は、実際にすべてのデータを表示するにはどうすればよいかということです。

    package com.projekt;


import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.app.ListActivity;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;


public class PoniedzialekActivity extends ListActivity implements OnClickListener{

    private Button butPnAdd;
    private DatabaseHelper dbhelper;
    private SQLiteDatabase db; 
    Cursor cursor;

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_poniedzialek);

        butPnAdd = (Button) findViewById(R.id.butPnAdd);
        butPnAdd.setOnClickListener(this);

        List<Poniedzialek> lista_poniedzialek = getAllPnSession();
        this.setListAdapter(new ArrayAdapter(this, android.R.layout.simple_list_item_1, lista_poniedzialek)); 



    @Override
    public void onClick(View v) {
        if(v.getId()==R.id.butPnAdd){
        Intent i = new Intent(PoniedzialekActivity.this,dodawaniePoniedzialek.class);
        startActivity(i);
        }
    }
    public List<Poniedzialek> getAllPnSession() {
        List<Poniedzialek> pnsessionList = new ArrayList<Poniedzialek>();
        // Wybierz cale Query
        String selectQuery = "SELECT  * FROM " + DatabaseHelper.PN_TABLE;
        dbhelper.getWritableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);
        // petla po wszystkich rzedach & dodawanie ich do listy
        if (cursor.moveToFirst()) {
            do {
                Poniedzialek pn = new Poniedzialek();

                pn.setID(Integer.parseInt(cursor.getString(0)));
                pn.setTypeOfSession(cursor.getString(1));
                pn.setName(cursor.getString(2));
                pn.setStartTime(cursor.getString(3));
                pn.setEndTime(cursor.getString(4));
                pn.setRoom(cursor.getString(5));

                // Dodawanie sesji do listy
                pnsessionList.add(pn);
            } while (cursor.moveToNext());
        }
        cursor.close();
        // return contact list
        return pnsessionList;
    }
    public Cursor fetchPn() {
        SQLiteDatabase db = dbhelper.getWritableDatabase(); 
        return db.query(DatabaseHelper.PN_TABLE, new String[] {DatabaseHelper.PN_KEY_TYPE_OF_SESSION, DatabaseHelper.PN_KEY_START_TIME,
                DatabaseHelper.PN_KEY_END_TIME, DatabaseHelper.PN_KEY_NAME, DatabaseHelper.PN_KEY_ROOM}, null, null, null, null, null);
    }

} // end PoniedzialekActivity

これは、layout_poniedzialek です。

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

    <Button
        android:id="@+id/butPnAdd"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/add_pn"
        />
    <TextView  
        android:layout_width="fill_parent" 
        android:layout_height="wrap_content" 
        android:text="@string/tab1"
        />



    <ListView
        android:id="@+id/pnListView"
        android:layout_width="304dp"
        android:layout_height="380dp"
        android:layout_gravity="center_horizontal" >

    </ListView>

</LinearLayout>

編集 今、エラーが発生し続けます:NullPointerException。これは、poniedzialekActivity に実装したものです (DatabaseHelper は、open/close および静的な最終文字列属性を保持するクラスの名前であることに注意してください - ここでは 5 つのタブレットを作成しています)

PoniedzialekActivityクラス:

public class PoniedzialekActivity extends ListActivity implements OnClickListener{

    private Button butPnAdd;
    private DatabaseHelper dbhelper;
    private SQLiteDatabase db; 
    Cursor c;

    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout_poniedzialek);

        butPnAdd = (Button) findViewById(R.id.butPnAdd);
        butPnAdd.setOnClickListener(this);


        dbhelper = new DatabaseHelper(this);
        dbhelper.open();
        c = dbhelper.fetchPn();
        String[] columns = new String[] { DatabaseHelper.PN_KEY_TYPE_OF_SESSION, DatabaseHelper.PN_KEY_START_TIME, DatabaseHelper.PN_KEY_END_TIME,
                DatabaseHelper.PN_KEY_NAME, DatabaseHelper.PN_KEY_ROOM};
        int[] to = new int[] { R.id.textSession, R.id.textStartTime, R.id.textEndTime, R.id.textName, R.id.textRoom };
        new SimpleCursorAdapter(PoniedzialekActivity.this, R.layout.entry, c, columns, to);
        ListView list = getListView();
        list.setAdapter(new SimpleCursorAdapter(PoniedzialekActivity.this, R.layout.entry, c, columns, to));

    }
    @Override
    public void onClick(View v) {
        if(v.getId()==R.id.butPnAdd){
        Intent i = new Intent(PoniedzialekActivity.this,dodawaniePoniedzialek.class);
        startActivity(i);
        }
    }
}

DatabaseHelper.class

public class DatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "database.db";
    private static final int DATABASE_VERSION = 1;
    public static final String TAG = "ProjectDatabase";

    static final String PN_TABLE = "Tablica_Poniedzialek";
    static final String PN_KEY_ID = "_id";
    static final String PN_KEY_TYPE_OF_SESSION ="type_of_session";
    static final String PN_KEY_START_TIME ="start_time";
    static final String PN_KEY_END_TIME ="end_time";
    static final String PN_KEY_NAME ="name";                         
    static final String PN_KEY_ROOM ="room";

    static final String WT_TABLE = "Tablica_Wtorek";
    static final String WT_KEY_ID = "_id";
    static final String WT_KEY_TYPE_OF_SESSION ="type_of_session";
    static final String WT_KEY_START_TIME ="start_time";
    static final String WT_KEY_END_TIME ="end_time";
    static final String WT_KEY_NAME ="name";
    static final String WT_KEY_ROOM ="room";

    static final String SR_TABLE = "Tablica_Sroda";
    static final String SR_KEY_ID = "_id";
    static final String SR_KEY_TYPE_OF_SESSION ="type_of_session";
    static final String SR_KEY_START_TIME ="start_time";
    static final String SR_KEY_END_TIME ="end_time";
    static final String SR_KEY_NAME ="name";
    static final String SR_KEY_ROOM ="room";

    static final String CZ_TABLE = "Tablica_Czwartek";
    static final String CZ_KEY_ID = "_id";
    static final String CZ_KEY_TYPE_OF_SESSION ="type_of_session";
    static final String CZ_KEY_START_TIME ="start_time";
    static final String CZ_KEY_END_TIME ="end_time";
    static final String CZ_KEY_NAME ="name";
    static final String CZ_KEY_ROOM ="room";

    static final String PT_TABLE = "Tablica_Piatek";
    static final String PT_KEY_ID = "_id";
    static final String PT_KEY_TYPE_OF_SESSION ="type_of_session";
    static final String PT_KEY_START_TIME ="start_time";
    static final String PT_KEY_END_TIME ="end_time";
    static final String PT_KEY_NAME ="name";
    static final String PT_KEY_ROOM ="room";

    public DatabaseHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }           
    private DatabaseHelper dbhelper; 
    private SQLiteDatabase db; 

    @Override
    public void onCreate(SQLiteDatabase db) {

        String pn_sql = "CREATE TABLE " + PN_TABLE +
                        "(" + PN_KEY_ID + " integer primary key autoincrement, " +
                        PN_KEY_TYPE_OF_SESSION + " text, " +
                        PN_KEY_NAME + " text, " +
                        PN_KEY_START_TIME + " text, " +
                        PN_KEY_END_TIME + " text, " +
                        PN_KEY_ROOM + " text);";
        String wt_sql = "CREATE TABLE " + WT_TABLE +
                        "(" + WT_KEY_ID + " integer primary key autoincrement, " +
                        WT_KEY_TYPE_OF_SESSION + " text, " +
                        WT_KEY_NAME + " text, " +
                        WT_KEY_START_TIME + " text, " +
                        WT_KEY_END_TIME + " text, " +
                        WT_KEY_ROOM + " text);";
        String sr_sql = "CREATE TABLE " + SR_TABLE +
                        "(" + SR_KEY_ID + " integer primary key autoincrement, " +
                        SR_KEY_TYPE_OF_SESSION + " text, " +
                        SR_KEY_NAME + " text, " +
                        SR_KEY_START_TIME + " text, " +
                        SR_KEY_END_TIME + " text, " +
                        SR_KEY_ROOM + " text);";
        String cz_sql = "CREATE TABLE " + CZ_TABLE +
                        "(" + CZ_KEY_ID + " integer primary key autoincrement, " +
                        CZ_KEY_TYPE_OF_SESSION + " text, " +
                        CZ_KEY_NAME + " text, " +
                        CZ_KEY_START_TIME + " text, " +
                        CZ_KEY_END_TIME + " text, " +
                        CZ_KEY_ROOM + " text);";
        String pt_sql = "CREATE TABLE " + PT_TABLE +
                        "(" + PT_KEY_ID + " integer primary key autoincrement, " +
                        PT_KEY_TYPE_OF_SESSION + " text, " +
                        PT_KEY_NAME + " text, " +
                        PT_KEY_START_TIME + " text, " +
                        PT_KEY_END_TIME + " text, " +
                        PT_KEY_ROOM + " text);";

        db.execSQL(pn_sql);
        db.execSQL(wt_sql);
        db.execSQL(sr_sql);
        db.execSQL(cz_sql);
        db.execSQL(pt_sql);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.w("Projekt", "aktualizacja z wersji " + oldVersion
              + " do wersji " + newVersion + " ( stare dane ulegna usunieciu ) ");
                 db.execSQL("DROP TABLE IF EXISTS" + PN_TABLE);
                 db.execSQL("DROP TABLE IF EXISTS" + WT_TABLE);
                 db.execSQL("DROP TABLE IF EXISTS" + SR_TABLE);
                 db.execSQL("DROP TABLE IF EXISTS" + CZ_TABLE);
                 db.execSQL("DROP TABLE IF EXISTS" + PT_TABLE);
        onCreate(db);
    }
    public void open() 
    {
            dbhelper.open();
    }
    public void close()
        {
            dbhelper.close();
        }
    public Cursor fetchPn() {
        return db.query(PN_TABLE, new String[] {PN_KEY_TYPE_OF_SESSION, PN_KEY_START_TIME, 
                PN_KEY_END_TIME, PN_KEY_NAME, PN_KEY_ROOM}, null, null, null, null, null);
    }
}

これは、TabHost を保持する私のMainActivityクラスです。

public class MainActivity extends TabActivity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        //--- TABHOST ---//
        Resources res = getResources(); // Resource object to get Drawables
        TabHost tabHost = getTabHost();  // The activity TabHost
        TabHost.TabSpec spec;  // Resusable TabSpec for each tab
        Intent intent;  // Reusable Intent for each tab

        // Create an Intent to launch an Activity for the tab (to be reused)
        intent = new Intent().setClass(this, PoniedzialekActivity.class);
        // Initialize a TabSpec for each tab and add it to the TabHost
        spec = tabHost.newTabSpec("Pn").setIndicator("Pn",
                          res.getDrawable(R.drawable.ic_launcher))
                      .setContent(intent);
        tabHost.addTab(spec);

        // Do the same for the other tabs
        intent = new Intent().setClass(this, WtorekActivity.class);
        spec = tabHost.newTabSpec("Wt").setIndicator("Wt",
                          res.getDrawable(R.drawable.ic_launcher))
                      .setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, SrodaActivity.class);
        spec = tabHost.newTabSpec("Sr").setIndicator("Sr",
                          res.getDrawable(R.drawable.ic_launcher))
                      .setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, CzwartekActivity.class);
        spec = tabHost.newTabSpec("Cz").setIndicator("Cz",
                          res.getDrawable(R.drawable.ic_launcher))
                      .setContent(intent);
        tabHost.addTab(spec);

        intent = new Intent().setClass(this, PiatekActivity.class);
        spec = tabHost.newTabSpec("Pt").setIndicator("Pt",
                          res.getDrawable(R.drawable.ic_launcher))
                      .setContent(intent);
        tabHost.addTab(spec);

        tabHost.setCurrentTab(1);
        //--- END OF TABHOST ---//

    }
}
4

1 に答える 1

0

setListAdapter()は ... に対して定義されActivityていないため、コードがどのようにコンパイルされるかさえわかりません。

レイアウトを膨らませ、ListViewusing を見つけてfindViewById、そのアダプタを設定する必要があります。

ListView lv = (ListView) findViewById(R.id.pnListView);
lv.setAdapter(...);
于 2012-06-25T21:55:51.877 に答える