Androidデータベースを使用してデータを保存し、そこから読み取る必要があるアプリをプログラミングしています。使用 このチュートリアル(archive.org) 作成するアプリを入手しましたデータベースと新しいエントリを作成することはできますが、データベースを読み取ってListViewに保存されたデータを取得する方法はわかりません。このWebサイトには同様の質問がたくさんありますが、どれもそうではないようです。方法に適用すると、チュートリアルのデータベースが機能します。
コード:
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はAndroid:listでなければならないため、間違っていました。
リンクしたチュートリアルのデータベース形式を使用すると、すべての行に_id
、isbn
、title
、およびpublisher
が含まれます。ここで、ListViewのすべてのタイトルを表示すると仮定します。
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);
(カーソルを自分でループする必要はありません。アダプターがこれを行います!)
SimpleCursorAdapterコンストラクターの最後の2つのパラメーターは、不足しているものです。これらは「from」および「to」パラメーターです。
title
に保存されている各本の名前を取得したいので、ここから情報を取得します。Android.R.id.text1
はAndroid.R.layout.simple_list_item_1
レイアウトのTextViewです。 (SDKを掘り下げて、simple_list_item_1.xmlファイルを自分で確認するか、今のところ私を信頼してください。これで、「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つのフィールドを取り、どの列がどのTextViewに行くかを定義するレイアウト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 });
...
}
幸運を!
カーソル内の各項目でアダプターは使用されず、カーソル全体に対して1つのアダプターが作成されます。このカーソルを使用するようにこのリストビューを設定できます。 this のようなSimpleCursorAdapterチュートリアルを試してください