What is wrong with this simple java code to access SQLite database in Android?

437 views Asked by At

I created a database file (.db) with one table TEstTable using SQLiteManager and pasted it in /assets folder. I want to perform actions on this database from my Android Application.

In order to do so I followed this tutorial as recommended on Stack Overflow.

Added a bit more code to read it and save the result in a string and print that result, to be precise I only added a rawquery.

Check my code for DatabaseHelper class:

public class DatabaseHelper extends SQLiteOpenHelper {
    //The Android's default system path of your application database.
    private static final String DB_PATH = "/data/data/com.example.sqlitemanagerexample/databases/";

    private static final String DB_NAME = "managerSample";

    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)) > 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 String getEntries() {

            Cursor c = myDataBase.rawQuery("SELECT * FROM TestTable ;", null);
            String result = "";
            for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
                    result = result + c.getShort(0) + c.getString(1) + c.getString(2);

            }
            return result;

    }

    // Add your public helper methods to access and get content from the
    // database.
    // You could return cursors by doing "return myDataBase.query(....)" so it'd
    // be easy
    // to you to create adapters for your views.

}

And the code for View Activity:

public class View extends Activity {

    TextView tv;

    public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.viewdb);
            tv = (TextView) findViewById(R.id.textView1);

            DatabaseHelper myDbHelper ;
            myDbHelper = new DatabaseHelper(this);

            try {

                    myDbHelper.createDataBase();

            } catch (IOException ioe) {

                    throw new Error("Unable to create database");

            }

            try {

                    myDbHelper.openDataBase();

            } catch (SQLException sqle) {

                    throw sqle;

            }



            tv.setText(myDbHelper.getEntries());

    }
}

When I am running this code, the view activity is not starting and the application is getting forced closed. Logcat says:

E/AndroidRuntime(1764): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sqlitemanagerexample/com.example.sqlitemanagerexample.View}: android.database.sqlite.SQLiteException: no such table: TestTable: , while compiling: SELECT * FROM TestTable ;
android.database.sqlite.SQLiteException: no such table: TestTable: , while compiling: SELECT * FROM TestTable ;

2

There are 2 answers

1
Yaqub Ahmad On

Check the name of the database (which exists in the assests folder), it must be "managerSample", because of this line in your code:

private static final String DB_NAME = "managerSample"; 

EDIT:

This may help you.

1
Hans Hohenfeld On

Check you database, if Table TestTable exists, beacaus the error s caused by the select statement in the getEntries Method called from your activity. The error you've posted from the log indicates, that no such table exists.