2012-08-22 12 views
16

データを保存して読み込むためにデータベースを使用するAndroidアプリをプログラミングしています。 this tutorial (on archive.org)を使って私はデータベースを作成するアプリケーションを手に入れましたが、新しいエントリを作成することはできますが、わかりません。データベースを読み込んでListViewに格納されたデータを取得する方法はわかりません。私はこのウェブサイトには多くの同様の質問があることを知っていますが、チュートリアルの作業からデータベースには適用されないようです。Android:SimpleCursorAdapterを使用してデータベースからListViewにデータを取得する

コード:

import java.util.Calendar; 

import maturarbeit.nicola_pfister.studenttools.database.DBAdapter; 
import android.app.AlertDialog.Builder; 
import android.app.ListActivity; 
import android.content.DialogInterface; 
import android.content.DialogInterface.OnClickListener; 
import android.database.Cursor; 
import android.os.Bundle; 
import android.support.v4.widget.SimpleCursorAdapter; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.widget.ListView; 


public class Marks extends ListActivity { 

DBAdapter db = new DBAdapter(this); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.marks); 
} 

@Override 
protected void onPause() { 
    super.onPause(); 
    db.close(); 
} 

@Override 
protected void onResume() { 
    super.onResume(); 
    db.open(); 

    getData(); 
} 

@SuppressWarnings("deprecation") 
private void getData() { 
    SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
      android.R.layout.simple_list_item_1, 
      db.getAllMarks(), 
      new String[] { "value" }, 
      new int[] { android.R.id.text1 }); 

    ListView listView = (ListView) findViewById(R.id.marks_list); 
    listView.setAdapter(adapter); 
} 

@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    MenuInflater inflater = getMenuInflater(); 
    inflater.inflate(R.menu.marks, menu); 
    return true; 
} 

public boolean onOptionsItemSelected(MenuItem item) { 
    switch (item.getItemId()) { 
    case R.id.menu_add: 
     Calendar cal = Calendar.getInstance(); 
     int day = cal.get(Calendar.DAY_OF_MONTH); 
     int month = cal.get(Calendar.MONTH); 
     final String date = day + "." + month; 
     Builder builder = new Builder(this); 
     builder 
      .setTitle(R.string.dialog_addmarks) 
      .setItems(R.array.markslist, new OnClickListener() { 
       public void onClick(DialogInterface dialog, int which) { 
        @SuppressWarnings("unused") 
        long id; 
        String selection = getResources().getStringArray(R.array.markslist)[which]; 
        id = db.insertMark(date, "Default", selection); 
        } 
      }) 
      .show(); 
     getData(); 
     break; 
    case R.id.menu_delete: 
      //Deleting function yet to be implemented. 
     break; 
    } 
    return super.onOptionsItemSelected(item); 
} 
} 

編集:リスト:それはアンドロイドでなければならなかったので、ListViewのIDが間違っていました。

答えて

53

のようないくつかのSimpleCursorAdapterのチュートリアルを試してみてください。さて、あなたはリストビュー内のすべてのタイトルを表示したいと仮定しましょう:

db = new DBAdapter(this); 
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
     android.R.layout.simple_list_item_1, 
     db.getAllTitles(), 
     new String[] { "title" }, 
     new int[] { android.R.id.text1 }); 

ListView listView = (ListView) findViewById(R.id.list); 
listView.setAdapter(adapter); 

(!カーソル自分自身をループする必要はありませんが、アダプタがあなたのためにこの作業を行う)

最後の2 SimpleCursorAdapterコンストラクタのパラメータは、あなたが見逃しているものです。彼らは、「から」であり、パラメータ「する」:私たちは列名titleに保存されている各書籍の名前を取得したい

  • 私たちは「から」情報を取得する場合は、これがあります。
  • 次に、「どこ」に行くのかを教えてください。android.R.id.text1android.R.layout.simple_list_item_1レイアウトのTextViewです。

"from"と "to"の両方のパラメータは、複数のパラメータを渡すことができるため、配列です。情報の欄だけでなく、このアダプタを試してみてください。

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
     android.R.layout.simple_list_item_2, 
     db.getAllTitles(), 
     new String[] { "title", "publisher" }, 
     new int[] { android.R.id.text1, android.R.id.text2 }); 

このアダプタとのデータベース内の本はその後、タイトル、出版社によって表示されます。我々がしなければならなかったのは、2つのフィールドを取り、どの列がどのTextViewsに行くのかを定義するレイアウトandroid.R.layout.simple_list_item_2を使用することでした。

少し助けてくれることを願っています。多くのことを学ぶことがたくさんありますが、これはあなたにいくつかの基本を与えるでしょう。

public void onClick(DialogInterface dialog, int which) { 
    String selection = getResources().getStringArray(R.array.markslist)[which]; 
    db.insertMark(date, "Default", selection); 
    cursor.requery(); 
    adapter.notifyDataSetChanged(); 
} 

あなたはadapterを定義して作成する必要があります:私の頭の上から最後のコメント


、新しいデータを追加した後、リストビューをリフレッシュするには、これは試しますcursorの変数ですが、単純です:

public class Marks extends ListActivity { 
    SimpleCursorAdapter adapter; 
    Cursor cursor; 
    DBAdapter db = new DBAdapter(this); 
    ... 

し、それに応じて)(のgetDataを変更:

private void getData() { 
    cursor = db.getAllMarks(); 
    adapter = new SimpleCursorAdapter(this, 
      android.R.layout.simple_list_item_1, 
      cursor, 
      new String[] { "value" }, 
      new int[] { android.R.id.text1 }); 
    ... 
} 

幸運!

+0

ありがとうございます。私はあなたが何を説明しようとしているのかと思います。私はあなたのアダプターを使用しましたが、私はまだ私のアプリをクラッシュする例外が発生します。私はそのエラーが他のどこかにあると思いますか? – BlueHazard

+0

LogCatをコピーして貼り付けてください(質問の左下にある編集リンクを使用してください)。私は見てみましょう。あなたがこれをしたらコメントにタグをつけてください( "@Sam"と一緒に)。 – Sam

+0

質問にLogCatを追加しました。私を助けてくれてありがとう。 – BlueHazard

0

アダプターはカーソル内の各項目に使用されていないので、カーソル全体に対して1つのアダプターが作成されます。このリストビューを設定すると、そのカーソルを使用できます。あなたは、すべての行が_idisbntitle、およびpublisherを持っているにリンクされているチュートリアルでデータベース形式を使用してthis

関連する問題