jeudi 31 mars 2016

Code passing a "null" to DB where there should be a String value

I am writing an app that is pulling info from an SQLite DB and passing it to a list. The code is not finalized, but I am unable to test past a certain point . The error message I am getting is that my table name is a "null" in my SQL Query, but I dont understand why that is happening. I have created a textview within the App that displays the data contained in the String I am passing in. That TextView is showing the correct information. So if the string is working to pass into a TextView, why isnt it working to pass it into a String based SQLQuery?

Specifically, the getBeerDrinkLabels() from the DBHelper is showing "null" for barTableName, which comes from Bar.testingBarSet, which comes from MainActivity.upperCaseName. Bar.testingBarSet shows the correct value in the String that loads into the setBarTester TextView, so why not in the DB Query?

DBHelper Class (Where the SQL Query lives within the public List getBeerDrinkLabels() method)

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

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;

public class DBHelper extends SQLiteOpenHelper {

    private static String DB_PATH = "/data/data/com.example.sixth/databases/";
    private static String DB_NAME = "BarSample.db"; 
    private final Context myContext;    
    public static String tableName = "BARS";
    public static String barTableName = Bar.testingBarSet;//Pass in the specific bar from the spinner choice
    public static String drinkType = Bar.setDrinkType;//Use this to pass in selected drink type to SQL query    
    //public static final String KEY_ROWID = "_id";
    //public static final String BARNAME = "Bar Name";
    public static final String BARCITY = "Bar City";
    private SQLiteDatabase myDataBase;


    public DBHelper(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 {
                this.close();
                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)) > 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) {

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }

    public List<String> getAllLabels(){
        List<String> labels = new ArrayList<String>();

        // Select All Query
        String selectQuery = "SELECT  * FROM " + tableName;

        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);

        // looping through all rows and adding to list
        if (cursor.moveToFirst()) {
            do {
                labels.add(cursor.getString(1) + " " + cursor.getString(2)+ ", " + cursor.getString(3));
            } while (cursor.moveToNext());
        }

        // closing connection
        cursor.close();
        db.close();

        // returning labels
        return labels;

    } // will returns all labels stored in database

    public List<String> getBeerDrinkLabels(){
        List<String> allBeerDrinkLabels = new ArrayList<String>();

        // Select All Query
        String sqlquery="SELECT * FROM "+barTableName + " WHERE DRINKTYPE='Beer';";
        String selectQuery = sqlquery;

        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery(selectQuery, null);

        // looping through all rows and adding to list
        if (cursor.moveToFirst()) {
            do {
                allBeerDrinkLabels.add(cursor.getString(1) + ", " + cursor.getString(2));
            } while (cursor.moveToNext());
        }

        // closing connection
        cursor.close();
        db.close();

        // returning labels
        return allBeerDrinkLabels;

    } // will returns all labels stored in database
}

Main Activity.java (where the String that eventually goes into the Query is created)

package com.example.sixth;
import java.io.IOException;
import java.util.List;
import android.app.Activity;
import android.content.Intent;
import android.database.SQLException;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;


public class MainActivity extends Activity implements
OnItemSelectedListener {
    DBHelper myDB;
    Button selectBar;   
    Spinner spinner;
    static String pullBar,setBar,name, cityState, upperCaseName;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button selectBar = (Button)findViewById(R.id.btnSelectBar);
        myDB = new DBHelper(this);
         // Spinner element
        spinner = (Spinner) findViewById(R.id.spinner);
     // Spinner click listener
        spinner.setOnItemSelectedListener(this);

        try {
            myDB.createDataBase();
        } catch (IOException ioe) {
            throw new Error("Unable to create database");
        }
        try {
            myDB.openDataBase();
        } catch (SQLException sqle) {
            throw sqle;
        }


        // Loading spinner data from database
        loadSpinnerData();

        selectBar.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                pullBar = String.valueOf(spinner.getSelectedItem());
                String[] parts = pullBar.split(" "); //returns an array with the 2 parts
                name = parts[0];

                String nlast = parts[parts.length-2];
                String last = parts[parts.length-1];

                cityState =  nlast+ " " + last;
                upperCaseName=name.toUpperCase();
                setBar = name.toLowerCase();
                Intent i = (new Intent(MainActivity.this, Bar.class));
                startActivity(i);           
            }

        }); 
    }


     private void loadSpinnerData() {
            // database handler
            DBHelper db = new DBHelper(getApplicationContext());

            // Spinner Drop down elements
            List<String> lables = db.getAllLabels();

            // Creating adapter for spinner
            ArrayAdapter<String> dataAdapter = new ArrayAdapter<String>(this,
                    android.R.layout.simple_spinner_item, lables);

            // Drop down layout style - list view with radio button
            dataAdapter
                    .setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

            // attaching data adapter to spinner
            spinner.setAdapter(dataAdapter);
        }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();
        if (id == R.id.action_settings) {
            return true;
        }
        return super.onOptionsItemSelected(item);
    }


    @Override
    public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
        // TODO Auto-generated method stub

    }


    @Override
    public void onNothingSelected(AdapterView<?> parent) {
        // TODO Auto-generated method stub

    }

}

Bar.java (Where the string going in to the Query is finalized)

public class Bar extends Activity{
    String setBarTest = MainActivity.setBar;
    static String testingBarSet = MainActivity.upperCaseName;
    String barNameHolder, picHolder, barContactHolder, barPhoneHolder; 
    int imageInt, textInt1,textInt2, textInt3, textInt4;
    TextView setBarName, setBarContact,setBarPhone, setBarHours;
    static TextView setBarTester;
    ImageView barPic;
    Button viewAll, beer, wine, mixedDrinks, other, specials, getTaxi;
    static String setDrinkType;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_bar);

        Button viewAll = (Button)findViewById(R.id.btnviewAll); 
        Button specials = (Button)findViewById(R.id.btnSpecials);   
        Button getTaxi = (Button)findViewById(R.id.btnTaxi);

        barPic = (ImageView) findViewById(R.id.barPic);
        String picHolder = "drawable/"+setBarTest;      
        imageInt = getResources().getIdentifier(picHolder, null, getPackageName());
        barPic.setImageResource(imageInt);

        setBarName = (TextView)findViewById(R.id.barName);
        String barNameHolder = "@string/"+setBarTest;
        textInt1 = getResources().getIdentifier(barNameHolder, null, getPackageName());
        setBarName.setText(textInt1);

        setBarContact = (TextView)findViewById(R.id.barContact);
        String barContactHolder = "@string/"+setBarTest+"Contact";
        textInt2 = getResources().getIdentifier(barContactHolder, null, getPackageName());
        setBarContact.setText(textInt2);

        setBarPhone = (TextView)findViewById(R.id.barPhone);
        String barPhoneHolder = "@string/"+setBarTest+"Phone";
        textInt3 = getResources().getIdentifier(barPhoneHolder, null, getPackageName());
        setBarPhone.setText(textInt3);

        setBarHours = (TextView)findViewById(R.id.barHours);
        String barHoursHolder = "@string/"+setBarTest+"Hours";
        textInt4 = getResources().getIdentifier(barHoursHolder, null, getPackageName());
        setBarHours.setText(textInt4);

        setBarTester = (TextView)findViewById(R.id.setBarTester);
        String barTesterHolder = testingBarSet ;
        //int textInt5 = getResources().getIdentifier(barTesterHolder, null, getPackageName());
        setBarTester.setText(barTesterHolder);

        viewAll.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = (new Intent(Bar.this, Drinks.class));
                startActivity(i);           
            }

        });

        specials.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = (new Intent(Bar.this, NoResult.class));
                startActivity(i);           
            }

        });

        getTaxi.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = (new Intent(Bar.this, Taxi.class));
                startActivity(i);           
            }

        });


    }
}

Drinks.java (Where the DB call is made that is giving the Null value)

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ExpandableListView.OnGroupClickListener;
import android.widget.ExpandableListView.OnGroupCollapseListener;
import android.widget.ExpandableListView.OnGroupExpandListener;
import android.widget.ListView;
import android.widget.Toast;

public class Drinks extends Activity {
    // TextView drinkHolder;
    public static String drinkType = DBHelper.drinkType;
    String drinkTestHolder = "";
    ExpandableListAdapter listAdapter;
    ExpandableListView expListView;
    List<String> listDataHeader;
    HashMap<String, List<String>> listDataChild;


    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_drinks);
        Bundle bundle = getIntent().getExtras();
        if (bundle != null) {
            drinkType = bundle.getString("sample_name");
        }
        // get the listview
        expListView = (ExpandableListView) findViewById(R.id.lvExp);

        // preparing list data
        prepareListData();

        listAdapter = new ExpandableListAdapter(this, listDataHeader, listDataChild);

        // setting list adapter
        expListView.setAdapter(listAdapter);

    }

    private void prepareListData() {
        listDataHeader = new ArrayList<String>();
        listDataChild = new HashMap<String, List<String>>();


        // Adding child data

         listDataHeader.add("Beer"); 
         listDataHeader.add("Mixed Drinks");
         listDataHeader.add("Other Drinks"); 
         listDataHeader.add("Shots");
         listDataHeader.add("Wine");

         //Get Beer entries
         DBHelper db = new DBHelper(getApplicationContext());
         List<String> beerLables = db.getBeerDrinkLabels();


        // Adding child data
        List<String> beer = new ArrayList<String>();

        //beer.add("The Shawshank Redemption");
        for (int i = 0; i < beerLables.size(); i++) {
            beer.add(beerLables.get(i));
        }

        /*
           beer.add("The Godfather");
         * beer.add("The Godfather: Part II"); beer.add("Pulp Fiction");
         * beer.add("The Good, the Bad and the Ugly"); beer.add(
         * "The Dark Knight"); beer.add("12 Angry Men");
         */

        List<String> wine = new ArrayList<String>();
        /*
         * wine.add("The Conjuring"); wine.add("Despicable Me 2");
         * wine.add("Turbo"); wine.add("Grown Ups 2"); wine.add("Red 2");
         * wine.add("The Wolverine");
         */

        List<String> shots = new ArrayList<String>();
        /*
         * shots.add("2 Guns"); shots.add("The Smurfs 2"); shots.add(
         * "The Spectacular Now"); shots.add("The Canyons"); shots.add(
         * "Europa Report");
         */

        List<String> mixedDrinks = new ArrayList<String>();
        /*
         * mixedDrinks.add("2 Guns"); mixedDrinks.add("The Smurfs 2");
         * mixedDrinks.add("The Spectacular Now"); mixedDrinks.add("The Canyons"
         * ); mixedDrinks.add("Europa Report");
         */

        List<String> otherDrinks = new ArrayList<String>();
        /*
         * otherDrinks.add("2 Guns"); otherDrinks.add("The Smurfs 2");
         * otherDrinks.add("The Spectacular Now"); otherDrinks.add("The Canyons"
         * ); otherDrinks.add("Europa Report");
         */

        listDataChild.put(listDataHeader.get(0), beer); // Header, Child data
        listDataChild.put(listDataHeader.get(1), wine);
        listDataChild.put(listDataHeader.get(2), shots);
        listDataChild.put(listDataHeader.get(3), mixedDrinks);
        listDataChild.put(listDataHeader.get(4), otherDrinks);
    }
}

I originally had the DBHelper pulling the String right from MainActivity, but was getting Null value no matter where I put it.

LogCat

 FATAL EXCEPTION: main
 java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sixth/com.example.sixth.Drinks}: android.database.sqlite.SQLiteException: near "null": syntax error (code 1): , while compiling: SELECT * FROM null WHERE DRINKTYPE='Beer';
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2211)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2261)
    at android.app.ActivityThread.access$600(ActivityThread.java:141)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:137)
    at android.app.ActivityThread.main(ActivityThread.java:5103)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:525)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: android.database.sqlite.SQLiteException: near "null": syntax error (code 1): , while compiling: SELECT * FROM null WHERE DRINKTYPE='Beer';
    at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
    at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:889)
    at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:500)
    at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
    at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
    at android.database.sqlite.SQLiteQuery.<init>(SQLiteQuery.java:37)
    at android.database.sqlite.SQLiteDirectCursorDriver.query(SQLiteDirectCursorDriver.java:44)
    at android.database.sqlite.SQLiteDatabase.rawQueryWithFactory(SQLiteDatabase.java:1314)
    at android.database.sqlite.SQLiteDatabase.rawQuery(SQLiteDatabase.java:1253)
    at com.example.sixth.DBHelper.getBeerDrinkLabels(DBHelper.java:180)
    at com.example.sixth.Drinks.prepareListData(Drinks.java:62)
    at com.example.sixth.Drinks.onCreate(Drinks.java:38)
    at android.app.Activity.performCreate(Activity.java:5133)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2175) 

Aucun commentaire:

Enregistrer un commentaire