Note that there are some explanatory texts on larger screens.

plurals
  1. PORetrieve specific database cell using Intent
    text
    copied!<p>I have returned to writing code after a long absence and after a few days am still having problems with my code.</p> <p>I have a prepopulated database in my app that contains two tables. The first is used for the first activity (AllEnglandList) and brings up a list. On clicking a row in that list a second list view Activity (AllTrails) is brought up from data in the second table. For this I have used .putExtra and it works well.</p> <p>On clicking a row in this list I am trying to call a specific cell from my database using the String in the row clicked. So for example, if Apple is clicked it will look at the column FruitName in my database and see which row contains Apple. It will then read across this row and return the content of the Column FruitDescription.</p> <p>At the moment I am getting a blank activity (AllEnglandList) when clicked.</p> <p>Here is my Helper</p> <pre><code>class AllEnglandHelper extends SQLiteOpenHelper { // we declare a bunch of useful constants // they should be pretty obvious what they are! private static final String DATABASE_PATH = "/data/data/com.wills.master/databases/"; private static final String DATABASE_NAME = "Fruit.db"; private static final int SCHEMA_VERSION = 1; public static final String TABLE_NAME = "Databasing_Index"; public static final String COLUMN_ID = "_id"; public static final String COLUMN_TITLE = "ObjectIndex"; // BE AWARE - if you make changes to your database using sqlitebrower, you // will need to refresh the assets folder in eclipse public static final String SECOND_TABLE_NAME = "Databasing_Details"; public static final String SECOND_COLUMN_ID = "_id"; public static final String SECOND_COLUMN_TITLE = "ObjectName"; public static final String SECOND_COLUMN_TITLE2 = "ObjectDescription"; public SQLiteDatabase dbSqlite; private final Context myContext; public AllEnglandHelper(Context context) { super(context, DATABASE_NAME, null, SCHEMA_VERSION); this.myContext = context; // check if exists and copy database from resource // createDB(); } @Override public void onCreate(SQLiteDatabase db) { // check if exists and copy database from resource } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } public void createDatabase() { createDB(); } private void createDB() { boolean dbExist = DBExists(); if (!dbExist) { // By calling the method we create an empty database into the // default system location // We need this so we can overwrite that database with our database this.getReadableDatabase(); // now we copy the database we included! copyDBFromResource(); } } private boolean DBExists() { SQLiteDatabase db = null; try { String databasePath = DATABASE_PATH + DATABASE_NAME; db = SQLiteDatabase.openDatabase(databasePath, null, SQLiteDatabase.OPEN_READWRITE); db.setLocale(Locale.getDefault()); db.setLockingEnabled(true); db.setVersion(1); } catch (SQLiteException e) { Log.e("SqlHelper", "database not found"); } if (db != null) { db.close(); } return db != null ? true : false; } private void copyDBFromResource() { InputStream inputStream = null; OutputStream outStream = null; String dbFilePath = DATABASE_PATH + DATABASE_NAME; try { inputStream = myContext.getAssets().open(DATABASE_NAME); outStream = new FileOutputStream(dbFilePath); byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) &gt; 0) { outStream.write(buffer, 0, length); } outStream.flush(); outStream.close(); inputStream.close(); } catch (IOException e) { throw new Error("Problem copying database from resource file."); } } public void openDataBase() throws SQLException { String myPath = DATABASE_PATH + DATABASE_NAME; dbSqlite = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); } @Override public synchronized void close() { if (dbSqlite != null) { dbSqlite.close(); } super.close(); } // the following two methods return the column you want and it's title // (getName) public Cursor getCursor() { SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder(); queryBuilder.setTables(TABLE_NAME); String[] asColumnsToReturn = new String[] { COLUMN_ID, COLUMN_TITLE }; // make sure you get your search pass correctly! Cursor mCursor = queryBuilder.query(dbSqlite, asColumnsToReturn, null, null, null, null, "_id"); // the name after the nulls dictates how the results are returned. ie in // order of "column name" return mCursor; } public String getName(Cursor c) { return (c.getString(1)); // where 1 refers to COLUMN_TITLE line 11 rows above (0 would be // COLUMN_ID and so on) } public Cursor getTrailByType(String id) { String[] args = {id}; return (getReadableDatabase() .rawQuery("SELECT _id, ObjectName FROM Databasing_Details WHERE Index_id=?", args)); } public Cursor getTrailByDetails(String id) { String[] args = {id}; return (getReadableDatabase() .rawQuery("SELECT _id, ObjectDescription FROM Databasing_Details WHERE ObjectName=?", args)); } } </code></pre> <p>First Activity</p> <pre><code>public class AllEnglandList extends Activity { // we use a string to hold the name of our extra, // it must include the full package name public final static String ID_EXTRA = "com.wills.master._ID"; private AllEnglandHelper dbDataBaseHelper = null; private Cursor ourCursor = null; private DataBaseAdapter adapter = null; @Override public void onCreate(Bundle savedInstanceState) { try { super.onCreate(savedInstanceState); setContentView(R.layout.trail_list); // this is our ListView element, obtained by id from our XML Layout ListView myListView = (ListView) findViewById(R.id.list_view); // create our database Helper dbDataBaseHelper = new AllEnglandHelper(this); // we call the create right after initializing the helper, just in // case // they have never run the app before dbDataBaseHelper.createDatabase(); // // open the database!! Our helper now has a SQLiteDatabase database // object dbDataBaseHelper.openDataBase(); // get our cursor. A cursor is a pointer to a dataset, in this case // a set of results from a database query ourCursor = dbDataBaseHelper.getCursor(); // tell android to start managing the cursor // we do this just incase our activity is interrupted or ends, we // want the activity // to close and deactivate the cursor, as needed startManagingCursor(ourCursor); // create our adapter adapter = new DataBaseAdapter(ourCursor); // set the adapter!!! myListView.setAdapter(adapter); // this is how we know what to do when a list item is clicked myListView.setOnItemClickListener(onListClick); } catch (Exception e) { // this is the line of code that sends a real message to the Log Log.e("ERROR", "ERROR IN CODE: " + e.toString()); // this is the line that prints out the location // the code where the error occurred. e.printStackTrace(); } } private AdapterView.OnItemClickListener onListClick = new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView&lt;?&gt; parent, View view, int position, long id) { // Create our intent, as per usual Intent i = new Intent(AllEnglandList.this, AllTrails.class); i.putExtra(ID_EXTRA, String.valueOf(id)); startActivity(i); } }; class DataBaseAdapter extends CursorAdapter { DataBaseAdapter(Cursor c) { super(AllEnglandList.this, c); } @Override // this is a CursorAdapter // instead of Using a getView and if(row=null) // we use a bindView and newView calls // we can get away with this because CursorAdapters have // a default implementation of getView that calls bindView and newView // as needed. This makes our code a bit cleaner, and is the better way // to // do this public void bindView(View row, Context ctxt, Cursor c) { DataBaseHolder holder = (DataBaseHolder) row.getTag(); holder.populateFrom(c, dbDataBaseHelper); } @Override public View newView(Context ctxt, Cursor c, ViewGroup parent) { LayoutInflater inflater = getLayoutInflater(); View row = inflater.inflate(R.layout.trail_list, parent, false); DataBaseHolder holder = new DataBaseHolder(row); row.setTag(holder); return (row); } } static class DataBaseHolder { private TextView name = null; DataBaseHolder(View row) { name = (TextView) row.findViewById(R.id.row); } void populateFrom(Cursor c, AllEnglandHelper r) { name.setText(r.getName(c)); } } } </code></pre> <p>Second Activity</p> <pre><code>public class AllTrails extends Activity{ String passedVar=null; boolean passedVar1=false; public final static String ID_EXTRA = "com.wills.master._ID"; private AllEnglandHelper dbTrailTypeHelper = null; private Cursor ourCursor = null; private TrailAdapter adapter=null; public void onCreate(Bundle savedInstanceState) { try { super.onCreate(savedInstanceState); setContentView(R.layout.trail_list); //Get our passed variable from our intent's EXTRAS passedVar=getIntent().getStringExtra(AllEnglandList.ID_EXTRA); //this is our ListView element, obtained by id from our XML layout ListView myListView = (ListView)findViewById(R.id.list_view); String string = passedVar; int passedInt = Integer.parseInt(string); if (passedInt==1) { passedVar1 = true; } //create our database Helper dbTrailTypeHelper=new AllEnglandHelper(this); //a set of results from a database query ourCursor=dbTrailTypeHelper.getTrailByType(passedVar); //tell android to start managing the cursor, //we do this just incase our activity is interrupted or ends, we want the activity //to close and deactivate the cursor, as needed startManagingCursor(ourCursor); //create our adapter adapter=new TrailAdapter(ourCursor); //set the adapter!!! myListView.setAdapter(adapter); myListView.setOnItemClickListener(onListClick); } catch (Exception e) { // this is the line of code that sends a real message to the Log Log.e("ERROR", "ERROR IN CODE: " + e.toString()); // this is the line that prints out the location // the code where the error occurred. e.printStackTrace(); } } private AdapterView.OnItemClickListener onListClick = new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView&lt;?&gt; parent, View view, int position, long id) { // Create our intent, as per usual Intent i = new Intent(AllTrails.this, AllEnglandTrails.class); i.putExtra(ID_EXTRA, String.valueOf(id)); startActivity(i); } }; class TrailAdapter extends CursorAdapter { TrailAdapter(Cursor c) { super(AllTrails.this, c); } @Override //this is a CusorAdapter //instead of Using a getView and if(row==null) // we use bindView and newView calls //we can get away with this because CursorAdapters have //a default implementation of getView that calls bindView and newView //as needed. This makes our code a bit cleaner, and is the better way to //do this. public void bindView(View row, Context ctxt, Cursor c) { TrailTypeHolder holder=(TrailTypeHolder)row.getTag(); holder.populateFrom(c, dbTrailTypeHelper); } @Override public View newView(Context ctxt, Cursor c, ViewGroup parent) { LayoutInflater inflater=getLayoutInflater(); View row=inflater.inflate(R.layout.trail_list, parent, false); TrailTypeHolder holder=new TrailTypeHolder(row); row.setTag(holder); return(row); } } static class TrailTypeHolder { private TextView name=null; TrailTypeHolder(View row) { name=(TextView)row.findViewById(R.id.row); } void populateFrom(Cursor c, AllEnglandHelper r) { name.setText(r.getName(c)); } } } </code></pre> <p>Third Activity</p> <pre><code>public class AllTrails extends Activity{ String passedVar=null; boolean passedVar1=false; public final static String ID_EXTRA = "com.wills.master._ID"; private AllEnglandHelper dbTrailTypeHelper = null; private Cursor ourCursor = null; private TrailAdapter adapter=null; public void onCreate(Bundle savedInstanceState) { try { super.onCreate(savedInstanceState); setContentView(R.layout.trail_list); //Get our passed variable from our intent's EXTRAS passedVar=getIntent().getStringExtra(AllEnglandList.ID_EXTRA); //this is our ListView element, obtained by id from our XML layout ListView myListView = (ListView)findViewById(R.id.list_view); String string = passedVar; int passedInt = Integer.parseInt(string); if (passedInt==1) { passedVar1 = true; } //create our database Helper dbTrailTypeHelper=new AllEnglandHelper(this); //a set of results from a database query ourCursor=dbTrailTypeHelper.getTrailByType(passedVar); //tell android to start managing the cursor, //we do this just incase our activity is interrupted or ends, we want the activity //to close and deactivate the cursor, as needed startManagingCursor(ourCursor); //create our adapter adapter=new TrailAdapter(ourCursor); //set the adapter!!! myListView.setAdapter(adapter); myListView.setOnItemClickListener(onListClick); } catch (Exception e) { // this is the line of code that sends a real message to the Log Log.e("ERROR", "ERROR IN CODE: " + e.toString()); // this is the line that prints out the location // the code where the error occurred. e.printStackTrace(); } } private AdapterView.OnItemClickListener onListClick = new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView&lt;?&gt; parent, View view, int position, long id) { // Create our intent, as per usual Intent i = new Intent(AllTrails.this, AllEnglandTrails.class); i.putExtra(ID_EXTRA, passedVar); startActivity(i); } }; class TrailAdapter extends CursorAdapter { TrailAdapter(Cursor c) { super(AllTrails.this, c); } @Override //this is a CusorAdapter //instead of Using a getView and if(row==null) // we use bindView and newView calls //we can get away with this because CursorAdapters have //a default implementation of getView that calls bindView and newView //as needed. This makes our code a bit cleaner, and is the better way to //do this. public void bindView(View row, Context ctxt, Cursor c) { TrailTypeHolder holder=(TrailTypeHolder)row.getTag(); holder.populateFrom(c, dbTrailTypeHelper); } @Override public View newView(Context ctxt, Cursor c, ViewGroup parent) { LayoutInflater inflater=getLayoutInflater(); View row=inflater.inflate(R.layout.trail_list, parent, false); TrailTypeHolder holder=new TrailTypeHolder(row); row.setTag(holder); return(row); } } static class TrailTypeHolder { private TextView name=null; TrailTypeHolder(View row) { name=(TextView)row.findViewById(R.id.row); } void populateFrom(Cursor c, AllEnglandHelper r) { name.setText(r.getName(c)); } } } </code></pre> <p>I have done a number of searches but have not found anything to specifically deal with this.</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload