title: Android: Fill ListView with database
body: <p>Having followed several examples with no success, I find myself at a dead end on this issue. The issue I am encountering is how to fill a <code>ListView</code> with data from a database.</p>
  
  <p>The purpose is to create a screen with the listView which displays only the name column from the database, then when the item is selected the application goes to a new screen where it displays the other data related to the item.</p>
  
  <p>The things I'd like help with understanding are filling the <code>ListView</code> with data from just the "Name" column from my database table "Contacts" and then, getting the data from the row of the database based on the selected item.</p>
  
  <p>Here is the code for the ContactsMenu class, where the names will be displayed.</p>
  
  <pre><code>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;
  
      }
  }
  </code></pre>
  
  <p>Database Setup Class</p>
  
  <pre><code>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 &amp;&amp; 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"; 
  
  } 
  </code></pre>
  
  <p>The code for the class to add to the contact menu. It used to work when I had a temporary display, however, now it does not.</p>
  
  <pre><code>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();
  
                          }
                      }       
              }   
          });
      }
  }
  </code></pre>