在遵循了几个没有成功的例子之后,我发现自己在这个问题上陷入了死胡同。我遇到的问题是如何ListView
从数据库中填充数据。
目的是使用列表视图创建一个屏幕,该屏幕仅从数据库中显示名称列,然后选择项目时,应用程序进入新屏幕,其中它显示与该项目相关的其他数据。
我想帮助理解的事情是ListView
从我的数据库表“联系人”中的“名称”列中填充数据,然后根据所选项目从数据库的行中获取数据。
这是 ContactsMenu 类的代码,其中将显示名称。
package com.emailandcontactmanager;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;
public class ContactsMenu extends Activity {
ListView listView;
public static final String fields[] = { DatabaseSetup.colName};
Cursor cursor;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.managecontacts);
listView = (ListView) findViewById(R.id.lstContacts);
DatabaseSetup.init(this);
Button btnAddItem = (Button) findViewById(R.id.btnAddContact);
btnAddItem.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
Intent addItem = new Intent(v.getContext(), AddContact.class);
startActivity(addItem);
}
});
}
@Override
protected void onPause() {
listView.setAdapter(null);
cursor.close();
DatabaseSetup.deactivate();
super.onPause();
}
@Override
protected void onResume() {
super.onResume();
DatabaseSetup.init(this);
cursor = DatabaseSetup.getContactNames();
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, R.layout.row, cursor, fields, new int[] {R.id.item_text});
listView.setAdapter(adapter);
}
DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
switch (which){
case DialogInterface.BUTTON_POSITIVE:
finish();
break;
case DialogInterface.BUTTON_NEGATIVE:
//Nothing happens on No button click, and the menu closes
break;
}
}
};
@Override
public boolean onCreateOptionsMenu(Menu mainmenu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.mainmenu, mainmenu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
final CharSequence[] items = {"Contacts list", "Add Contact"};
switch (item.getItemId()) {
case R.id.help: AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle("Select a function to revice information about it.");
builder.setItems(items, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int selected) {
switch(selected){
case 0:
Toast.makeText(getApplicationContext(),
"Allows you to view the selected item and make editations to it or delete it.",
Toast.LENGTH_LONG).show();
break;
case 1:
Toast.makeText(getApplicationContext(),
"Allows you to add a new contact by bringing up a screen where the nececary information can be entered.",
Toast.LENGTH_LONG).show();
}
}
});
builder.show();
break;
case R.id.back: AlertDialog.Builder builderBack = new AlertDialog.Builder(this);
builderBack.setMessage("Are you sure?").setPositiveButton("Yes", dialogClickListener)
.setNegativeButton("No", dialogClickListener).show();
break;
}
return true;
}
}
数据库设置类
package com.emailandcontactmanager;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
/*
* usage:
* DatabaseSetup.init(egActivityOrContext);
* DatabaseSetup.createEntry() or DatabaseSetup.getContactNames() or DatabaseSetup.getDb()
* DatabaseSetup.deactivate() then job done
*/
class DatabaseSetup extends SQLiteOpenHelper {
static DatabaseSetup instance = null;
static SQLiteDatabase db = null;
public static void init(Context context) {
if (null == instance) {
instance = new DatabaseSetup(context);
}
}
public static SQLiteDatabase getDb() {
if (null == db) {
db = instance.getWritableDatabase();
}
return db;
}
public static void deactivate() {
if (null != db && db.isOpen()) {
db.close();
}
db = null;
instance = null;
}
public static long createEntry(String name, String mail, String phone1,
String phone2, String address, String notes) {
ContentValues cv = new ContentValues();
cv.put(colName, name);
cv.put(colMail, mail);
cv.put(colPhone1, phone1);
cv.put(colPhone2, phone2);
cv.put(colAddress, address);
cv.put(colNotes, notes);
return getDb().insert(contactsTable, null, cv);
}
public static Cursor getContactNames() {
// TODO Auto-generated method stub
String[] columns = new String[] {"_id", colName };
return getDb().query(contactsTable, columns, null, null, null, null,
null);
}
DatabaseSetup(Context context) {
super(context, dbName, null, dbVersion);
}
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
db.execSQL("CREATE TABLE IF NOT EXISTS " + contactsTable
+ " (_id integer primary key autoincrement, " + colName
+ " TEXT NOT NULL, " + colMail + " TEXT NOT NULL, " + colPhone1
+ " TEXT NOT NULL, " + colPhone2 + " TEXT NOT NULL, "
+ colAddress + " TEXT NOT NULL, " + colNotes
+ " TEXT NOT NULL)");
db.execSQL("CREATE TABLE IF NOT EXISTS " + templatesTable
+ " (_id integer primary key autoincrement, " + colSubject
+ " TEXT NOT NULL, " + colBody + " TEXT NOT NULL)");
db.execSQL("CREATE TABLE IF NOT EXISTS " + tagsTable
+ " (_id integer primary key autoincrement, " + colTagName
+ " TEXT NOT NULL, " + colContact + " TEXT NOT NULL)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + contactsTable);
db.execSQL("DROP TABLE IF EXISTS " + templatesTable);
db.execSQL("DROP TABLE IF EXISTS " + tagsTable);
onCreate(db);
}
static final String dbName = "DB";
static final int dbVersion = 1;
static final String contactsTable = "Contacts";
static final String colName = "Name";
static final String colMail = "Email";
static final String colPhone1 = "Phone1";
static final String colPhone2 = "Phone2";
static final String colAddress = "Address";
static final String colNotes = "Notes";
static final String templatesTable = "Templates";
static final String colSubject = "Subject";
static final String colBody = "Body";
static final String tagsTable = "Tags";
static final String colTagName = "Name";
static final String colContact = "Contact";
}
要添加到联系人菜单的类的代码。当我有一个临时显示器时,它曾经可以工作,但是,现在不行了。
package com.emailandcontactmanager;
import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class AddContact extends Activity
{
Button saveContact;
EditText contactName, contactMail, contactPhone1, contactPhone2, contactAddress, contactNotes;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.newcontact);
contactName = (EditText) findViewById(R.id.txtName);
contactMail = (EditText) findViewById(R.id.txtMail);
contactPhone1 = (EditText) findViewById(R.id.txtPhone1);
contactPhone2 = (EditText) findViewById(R.id.txtPhone2);
contactAddress = (EditText) findViewById(R.id.txtAddress);
contactNotes = (EditText) findViewById(R.id.txtNotes);
// saveContact = (Button) findViewById(R.id.btnSaveContact);
Button btnSaveContact = (Button) findViewById(R.id.btnSaveContact);
btnSaveContact.setOnClickListener(new View.OnClickListener()
{
public void onClick(View v)
{
boolean working = true;
try{
String name = contactName.getText().toString();
String mail = contactMail.getText().toString();
String phone1 = contactPhone1.getText().toString();
String phone2 = contactPhone2.getText().toString();
String address = contactAddress.getText().toString();
String notes = contactNotes.getText().toString();
DatabaseSetup entry = new DatabaseSetup(AddContact.this);
DatabaseSetup.getDb();
DatabaseSetup.createEntry(name, mail, phone1, phone2, address, notes);
entry.close();
}
catch(Exception e)
{
working = false;
String error = e.toString();
Dialog d = new Dialog(AddContact.this);
d.setTitle("Error");
TextView tv = new TextView(AddContact.this);
tv.setText(error);
}
finally
{
if(working)
{
Dialog d = new Dialog(AddContact.this);
d.setTitle("Success");
TextView tv = new TextView(AddContact.this);
tv.setText("The database changes have succeeded.");
d.setContentView(tv);
d.show();
}
}
}
});
}
}