title: SQLite and populating list view, android
body: <p>I am populating a text and list view from a SQLite database. The data is populating from the cursor correctly (I see the list filling with text rows), but I'm not able to see the actual text in the rows - all I see are empty rows. For the life of me, I can't figure out what I'm not able to see the data in the text rows.</p>
  
  <p>My layouts:</p>
  
  <pre><code>    &lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;TabHost xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@android:id/tabhost"
  android:layout_width="fill_parent"
  android:layout_height="fill_parent"&gt;
  &lt;LinearLayout
      android:orientation="vertical"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:padding="5dp"&gt;
      &lt;TabWidget
          android:id="@android:id/tabs"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content" /&gt;
      &lt;FrameLayout
          android:id="@android:id/tabcontent"
          android:layout_width="fill_parent"
          android:layout_height="fill_parent"
          android:padding="5dp" /&gt;
   &lt;/LinearLayout&gt;
  &lt;/TabHost&gt;
  </code></pre>
  
  <p>list layout:</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"&gt;
  </code></pre>
  
  <p></p>
  
  <pre><code>&lt;/LinearLayout&gt;
  </code></pre>
  
  <p>row layout:</p>
  
  <pre><code>&lt;?xml version="1.0" encoding="utf-8"?&gt;
  &lt;TextView android:id="@+id/text1"
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="wrap_content"
  android:layout_height="wrap_content"/&gt;
  </code></pre>
  
  <p>My main:</p>
  
  <pre><code>package com.gotquestions.gqapp;
  
  import java.io.IOException;
  
  import com.gotquestions.gqapp.DataBaseHelper;
  import android.database.Cursor;
  import android.app.TabActivity;
  import android.content.Intent;
  import android.content.res.Resources;
  import android.database.SQLException;
  import android.net.Uri;
  import android.os.Bundle;
  import android.widget.TabHost;
  
  public class gqMain extends TabActivity {
  /** Called when the activity is first created. */
  
  private DataBaseHelper myDbHelper;
  
  @Override
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);
  
      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, TopicsActivity.class);
  
      // Initialize a TabSpec for each tab and add it to the TabHost
      spec = tabHost.newTabSpec("topics").setIndicator("" +
              "Topics")
                    .setContent(intent);
      tabHost.addTab(spec);
  
      // Do the same for the other tabs
      intent = new Intent().setClass(this, FavoritesActivity.class);
      spec = tabHost.newTabSpec("favorites").setIndicator("Favorites")
                    .setContent(intent);
      tabHost.addTab(spec);
  
    // Do the same for the other tabs
      intent = new Intent().setClass(this, AskActivity.class);
      spec = tabHost.newTabSpec("ask").setIndicator("Ask")
                    .setContent(intent);
      tabHost.addTab(spec);
  
   // Do the same for the other tabs
      intent = new Intent().setClass(this, BlogActivity.class);
      spec = tabHost.newTabSpec("blog").setIndicator("Blog")
                    .setContent(intent);
      tabHost.addTab(spec);
  
  
  
      tabHost.setCurrentTab(0);
  
  
  
      DataBaseHelper myDbHelper = new DataBaseHelper(this);
      myDbHelper = new DataBaseHelper(this);
  //test
      try {
  
          myDbHelper.createDataBase();
  
      } catch (IOException ioe) {
  
          throw new Error("Unable to create database");
  
      }
  
      try {
  
          myDbHelper.openDataBase();
  
      }catch(SQLException sqle){
  
          throw sqle;
  
      }
  
      //Cursor c = myDbHelper.fetchAllTopics();
  
  
  }
  
  
  
  
  }
  </code></pre>
  
  <p>My topics activity that generates the data within the TopicsActivity Tab..this is where the data shows up in the listview, but I can't see it. I've looked at the cursor adaptor, but am just not seeing it.</p>
  
  <pre><code>package com.gotquestions.gqapp;
  
  import com.gotquestions.gqapp.R.layout;
  
  import android.R;
  import android.app.ListActivity;
  import android.database.Cursor;
  import android.database.SQLException;
  import android.os.Bundle;
  
  import android.widget.SimpleCursorAdapter;
  
  public class TopicsActivity extends ListActivity {
  private DataBaseHelper myDbHelper;
  public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
  
  
      //
      DataBaseHelper myDbHelper = new DataBaseHelper(this);
      myDbHelper = new DataBaseHelper(this);
  //test
  
  
      try {
  
          myDbHelper.openDataBase();
  
      }catch(SQLException sqle){
  
          throw sqle;
  
      }
  
  
  
          setContentView(layout.list_layout);
          Cursor c = myDbHelper.fetchAllTopics();
          startManagingCursor(c);
  
          String[] from = new String[] { DataBaseHelper.KEY_TITLE };
          int[] to = new int[] { R.id.text1 };
  
          // Now create an array adapter and set it to display using our row
          SimpleCursorAdapter notes =
              new SimpleCursorAdapter(this, layout.notes_row, c, from, to);
          setListAdapter(notes);
  
          myDbHelper.close();
  
  
  
  
  
  
  
  
    }
  
  
  }
  </code></pre>
  
  <p>My database helper:</p>
  
  <pre><code>package com.gotquestions.gqapp;
  
  
  import java.io.FileOutputStream;
  import java.io.IOException;
  import java.io.InputStream;
  import java.io.OutputStream;
  
  import android.content.Context;
  import android.database.Cursor;
  import android.database.SQLException;
  import android.database.sqlite.SQLiteDatabase;
  import android.database.sqlite.SQLiteException;
  import android.database.sqlite.SQLiteOpenHelper;
  import android.util.Log;
  
  public class DataBaseHelper extends SQLiteOpenHelper{
  
  //The Android's default system path of your application database.
  private static String DB_PATH = "/data/data/com.gotquestions.gqapp/databases/";
  
  private static String DB_NAME = "gotquestions_database.mp3";
  public static final String KEY_TITLE = "topic_title";
  public static final String KEY_ARTICLE_TITLE = "article_title";
  public static final String KEY_ROWID = "_id";
  
  private static final String TAG = null;
  
  private SQLiteDatabase myDataBase; 
  //
  private final Context myContext;
  
  /**
   * Constructor
   * Takes and keeps a reference of the passed context in order to access to the     application assets and resources.
   * @param context
   */
  public DataBaseHelper(Context context) {
  
      super(context, DB_NAME, null, 1);
      this.myContext = context;
  }   
  
  /**
   * Creates a empty database on the system and rewrites it with your own database.
   * */
  public void createDataBase() throws IOException{
  
      boolean dbExist = checkDataBase();
  
      if(dbExist){
          //do nothing - database already exist
      }else{
  
          //By calling this method and empty database will be created into the default system path
             //of your application so we are gonna be able to overwrite that database with our database.
          this.getReadableDatabase();
  
          try {
  
              copyDataBase();
  
          } catch (IOException e) {
  
              throw new Error("Error copying database");
  
          }
      }
  
     }
  
  /**
   * Check if the database already exist to avoid re-copying the file each time you open the application.
   * @return true if it exists, false if it doesn't
   */
  private boolean checkDataBase(){
  
      SQLiteDatabase checkDB = null;
  
      try{
          String myPath = DB_PATH + DB_NAME;
          checkDB = SQLiteDatabase.openDatabase(myPath, null,  SQLiteDatabase.OPEN_READONLY);
  
      }catch(SQLiteException e){
  
          //database does't exist yet.
  
      }
  
      if(checkDB != null){
  
          checkDB.close();
  
      }
  
      return checkDB != null ? true : false;
  }
  
  /**
   * Copies your database from your local assets-folder to the just created empty database in the
   * system folder, from where it can be accessed and handled.
   * This is done by transfering bytestream.
   * */
  private void copyDataBase() throws IOException{
  
      //Open your local db as the input stream
      InputStream myInput = myContext.getAssets().open(DB_NAME);
  
      // Path to the just created empty db
      String outFileName = DB_PATH + DB_NAME;
  
      //Open the empty db as the output stream
      OutputStream myOutput = new FileOutputStream(outFileName);
  
      //transfer bytes from the inputfile to the outputfile
      byte[] buffer = new byte[1024];
      int length;
      while ((length = myInput.read(buffer))&gt;0){
          myOutput.write(buffer, 0, length);
      }
  
      //Close the streams
      myOutput.flush();
      myOutput.close();
      myInput.close();
  
  }
  
  public void openDataBase() throws SQLException{
  
      //Open the database
      String myPath = DB_PATH + DB_NAME;
      myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
  
  }
  
  @Override
  public synchronized void close() {
  
          if(myDataBase != null)
              myDataBase.close();
  
          super.close();
  
  }
  
  @Override
  public void onCreate(SQLiteDatabase db) {
      // TODO Auto-generated method stub
  
  }
  
  @Override
  public void onUpgrade(SQLiteDatabase db, int oldVersion, 
          int newVersion) 
          {
              Log.w(TAG, "Upgrading database from version " + oldVersion 
                      + " to "
                      + newVersion + ", which will destroy all old data");
              db.execSQL("DROP TABLE IF EXISTS titles");
              onCreate(db);
          }
  
  public Cursor getTitle(long rowId) throws SQLException 
  {
      Cursor mCursor =
              myDataBase.query(true, "topics", new String[] {
                      KEY_ROWID,
  
                      KEY_TITLE
                      }, 
                      KEY_ROWID + "=" + rowId, 
                      null,
                      null, 
                      null, 
                      null, 
                      null);
      if (mCursor != null) {
          mCursor.moveToFirst();
      }
      return mCursor;
  }
  
  public Cursor fetchAllTopics() {
  
      return myDataBase.query("topics", new String[] {KEY_ROWID, KEY_TITLE}, 
              null, 
              null, 
              null, 
              null, 
              null);
  
  
  
  };
  
  public Cursor fetchAllFavorites() {
  
      return myDataBase.query("articles", new String[] {
              KEY_ROWID, 
  
              KEY_ARTICLE_TITLE}, 
              null, 
              null, 
              null, 
              null, 
              null);
  
  
  
  };
  </code></pre>
  
  <p>}</p>