简体   繁体   中英

Android cant open/create SQLiteDatabase

Hi im having an issue with opening/creating a SQLiteDatabase when called from another class. Im a student at the moment and this is very new to me so please be brutally clear with any answer so I can follow along.

Testing() under Route.java calls the database class to setup the database

DatabaseManager db = new DatabaseManager(Route.this, "dbSkyTrain.dbf", null, 1);

And crashes when DatabaseManager tries to run this line of code.

Thanks so much in advance for any help on this. Im pretty sure im just setting it up wrong.

Route.java:

public void Testing(){

        //Station Variables
        int StnID;           //Unique ID, Format: ##
        String StnLine;      //Format: XXX = Mil, Exp, Eve, Can or YVR
        int StnLineIndex;    //Format: ##
        int StnZone;         //1, 2, 3
        int StnTimePrev;     //Time in min to this station from previous station
        int StnTimeNext;     //Time in min from this station to the next station
        String StnSwitch;    //Is this a switching station T or F
        String StnName;      //Name

        //Path Variables
        int PathStartIndex;  //Start station index
        int PathEndIndex;    //Destination or Switching station index
        String PathLine;     //Line that the train is currently on
        String PathSwitch;   //Name of switching station or "False" if end index is destination

        DatabaseManager db = new DatabaseManager(Route.this, "dbSkyTrain.dbf", null, 1);
        Station station = new Station();
        Path path = new Path();


        //Get Station usage
        station = db.getStation("Lougheed");
        StnID = station.ID();
        StnLine = station.Line();
        StnLineIndex = station.LineIndex();
        StnZone = station.Zone();
        StnTimePrev = station.TimeNext();
        StnTimeNext = station.TimePrev();
        StnSwitch = station.Switch();
        StnName = station.Name();

        //alternative get station method
        station = db.getStation("Mil", 10);
        StnID = station.ID();
        StnLine = station.Line();
        StnLineIndex = station.LineIndex();
        StnZone = station.Zone();
        StnTimePrev = station.TimeNext();
        StnTimeNext = station.TimePrev();
        StnSwitch = station.Switch();
        StnName = station.Name();
        db.close();


        //Path usage - returns endIndex of destination station or switching station
        path = getPath("Lougheed", "YVR-Airport");
        PathStartIndex = path.StartIndex();
        PathEndIndex = path.EndIndex();
        PathLine = path.Line();
        PathSwitch = path.SwitchStn();

        Toast.makeText(Route.this, PathLine + " " + PathStartIndex + " " + PathEndIndex + " " + PathSwitch , Toast.LENGTH_LONG).show();




    }

    //Get Route instructions//////////////////////////////////////////////////////////////////////////////////////
    public Path getPath(String StartStation, String EndStation){

        String strSQL;
        String strLine, strLineStart, strLineEnd;
        int intIndexStart, intIndexEnd;
        String strSwitch;

        //Table Station Variables
        String tbl_Stations = "tblStations";

        String key_StnID = "StnID";
        String key_StnName = "StnName";
        String key_StnLine = "StnLine";
        String key_StnLineIndex = "StnLineIndex";
        String key_StnZone = "StnZone";
        String key_StnTimePrev = "StnTimePrev";
        String key_StnTimeNext = "StnTimeNext";
        String key_StnSwitch = "StnSwitch";



        DatabaseManager dbManager = new DatabaseManager(Route.this, "dbSkyTrain.dbf", null, 1);
        SQLiteDatabase db = dbManager.getWritableDatabase();

        //First Station
        strSQL = "SELECT * FROM " + tbl_Stations + " WHERE " + key_StnName + "=" + StartStation;
        Cursor c = db.rawQuery(strSQL, null);
        c.moveToFirst();

        Station station = new Station(c.getString(0), c.getString(1), c.getString(2), c.getString(3), c.getString(4), c.getString(5), c.getString(6), c.getString(7));

        strLineStart = station.Line();
        intIndexStart = station.LineIndex();


        //Second Station
        strSQL = "SELECT * FROM " + tbl_Stations + " WHERE " + key_StnName + "=" + EndStation;
        c = db.rawQuery(strSQL, null);
        c.moveToFirst();

        station = new Station(c.getString(0), c.getString(1), c.getString(2), c.getString(3), c.getString(4), c.getString(5), c.getString(6), c.getString(7));

        strLineEnd = station.Line();
        intIndexEnd = station.LineIndex();

        db.close();

DatabaseManager.java

package com.example.skytrainfinalproject;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;

public class DatabaseManager extends SQLiteOpenHelper{

    //Database variables
    String db_Name = "dbSkyTrain.dbf";

    //Table Station Variables
    String tbl_Stations = "tblStations";

    String key_StnID = "StnID";
    String key_StnName = "StnName";
    String key_StnLine = "StnLine";
    String key_StnLineIndex = "StnLineIndex";
    String key_StnZone = "StnZone";
    String key_StnTimePrev = "StnTimePrev";
    String key_StnTimeNext = "StnTimeNext";
    String key_StnSwitch = "StnSwitch";

    //Table Options Variables
    String tbl_Options = "tblOptions";

    String key_OptID = "OptID";
    String key_OptName = "OptName";
    String key_OptValue = "OptValue";

    //Table GPS Variables
    String tbl_Gps = "tblGps";

    String key_GpsID = "GpsID";
    String key_GpsName = "GpsName";
    String key_Gpslongitude = "Gpslongitude";
    String key_Gpslatitude = "Gpslatitude";


    //Constructor//////////////////////////////////////////////////////////////////////////////////////
    public DatabaseManager(Context context, String dbName, CursorFactory factory,
            int version) {
        super(context, dbName, factory, version);


    }

    @Override
    public void onCreate(SQLiteDatabase db) {


        //Drop tables -comment out tables to save
        db.execSQL("DROP TABLE IF EXISTS " + tbl_Stations);
        db.execSQL("DROP TABLE IF EXISTS " + tbl_Options);
        //db.execSQL("DROP TABLE IF EXISTS " + tbl_Gps);

        //Recreate tables
        CreateTblStations();
        CreateTblOptions();
        //CreateTblGps();

    }

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


    }

    //Create GPS Table//////////////////////////////////////////////////////////////////////////////////////
    public void CreateTblGps(){

    }

    //Add GPS//////////////////////////////////////////////////////////////////////////////////////
    public void addGps(){

    }

    //Get GPS//////////////////////////////////////////////////////////////////////////////////////
    public void getGps(){

    }

    //Create Options Table//////////////////////////////////////////////////////////////////////////////////////
    public void CreateTblOptions(){

        SQLiteDatabase db = getWritableDatabase();

        //Table Values
        String Create_tblOptions = "CREATE TABLE IF NOT EXISTS " + tbl_Options + "(" + 
                                    key_OptID + " INTEGER PRIMARY KEY," + 
                                    key_OptName +" TEXT," + 
                                    key_OptValue + " TEXT)";

        //Create Table
        db.execSQL(Create_tblOptions); 


        addOption(db, "01", "TicketDefault", "Adult");

        addOption(db, "02", "TicketA1", "2.75");
        addOption(db, "03", "TicketA2", "4.00");
        addOption(db, "04", "TicketA3", "5.50");

        addOption(db, "05", "TicketC1", "1.75");
        addOption(db, "06", "TicketC2", "2.75");
        addOption(db, "07", "TicketC3", "3.75");

        addOption(db, "08", "AfterHours", "6:30");
        addOption(db, "09", "YVRCharge", "5.00");

        db.close();     
    }

    //Add Option//////////////////////////////////////////////////////////////////////////////////////
    public void addOption(SQLiteDatabase db, String ID, String Name, String Value){

        String insertRow;


        insertRow = "INSERT INTO " + tbl_Options + " values ('" + Integer.parseInt(ID) + "', '" + Name + "', '" + Value + "');";
        db.execSQL(insertRow);

    }

    //Get Option//////////////////////////////////////////////////////////////////////////////////////
    public Option getOption(int ID){

        String strSQL;

        SQLiteDatabase db = getReadableDatabase();

        strSQL = "SELECT * FROM tblOptions WHERE OptID=" + String.valueOf(ID);
        Cursor c = db.rawQuery(strSQL, null);
        c.moveToFirst();

        Option option = new Option(c.getString(0), c.getString(1), c.getString(2));

        c.close();
        db.close();

        return option;
    }

    //Create Station Table//////////////////////////////////////////////////////////////////////////////////////
    public void CreateTblStations(){

        SQLiteDatabase db = getWritableDatabase();

        //Table Values
        String Create_tblStations = "CREATE TABLE IF NOT EXISTS " + tbl_Stations + "(" + 
                                    key_StnID + " INTEGER PRIMARY KEY," + 
                                    key_StnLine +" TEXT," + 
                                    key_StnLineIndex + " INTEGER," + 
                                    key_StnZone + " INTEGER," +
                                    key_StnTimePrev + " INTEGER," + 
                                    key_StnTimeNext + " INTEGER," +
                                    key_StnSwitch + " TEXT," + 
                                    key_StnName + " TEXT)"; 

        //Create Table
        db.execSQL(Create_tblStations); 



        //Fill Table

        //Format (StnID, LineIndex, Line, Zone, TimePrev, TimeNext, Switch, Name)           
        addStation(db, "01", "19", "Exp", "3", "2", "3", "F", "King George");
        addStation(db, "02", "18", "Exp", "3", "3", "2", "F", "Surrey Central");
        addStation(db, "03", "17", "Exp", "3", "2", "3", "F", "Gateway");
        addStation(db, "04", "16", "Exp", "3", "3", "2", "F", "Scott Road");

        addStation(db, "05", "28", "Mil", "1", "1", "0", "F", "VCC-Clark");
        addStation(db, "06", "27", "Mil", "1", "3", "1", "T", "Commercial");
        addStation(db, "07", "26", "Mil", "1", "1", "3", "F", "Renfrew");
        addStation(db, "08", "25", "Mil", "1", "3", "1", "F", "Rupert");
        addStation(db, "09", "24", "Mil", "2", "1", "3", "F", "Gilmore");
        addStation(db, "10", "23", "Mil", "2", "2", "1", "F", "Brentwood");
        addStation(db, "11", "22", "Mil", "2", "2", "2", "F", "Holdom");
        addStation(db, "12", "21", "Mil", "2", "2", "2", "F", "Sperling/Burnaby Lake");
        addStation(db, "13", "20", "Mil", "2", "3", "2", "F", "Lake City");
        addStation(db, "14", "19", "Mil", "2", "2", "3", "F", "Production Way/University");
        addStation(db, "15", "18", "Mil", "2", "3", "2", "T", "Lougheed");
        addStation(db, "16", "17", "Mil", "2", "2", "3", "F", "Braid");
        addStation(db, "17", "16", "Mil", "2", "3", "2", "F", "Sapperton");

        addStation(db, "18", "15", "Mil-Exp", "2", "1", "3", "T", "Columbia");
        addStation(db, "19", "14", "Mil-Exp", "2", "4", "1", "F", "New Westminster");
        addStation(db, "20", "13", "Mil-Exp", "2", "2", "4", "F", "22nd St");
        addStation(db, "21", "12", "Mil-Exp", "2", "3", "2", "F", "Edmonds");
        addStation(db, "22", "11", "Mil-Exp", "2", "2", "3", "F", "Royal Oak");
        addStation(db, "23", "10", "Mil-Exp", "2", "1", "2", "F", "Metrotown");
        addStation(db, "24", "09", "Mil-Exp", "1", "2", "1", "F", "Patterson");
        addStation(db, "25", "08", "Mil-Exp", "1", "2", "2", "F", "Joyce");
        addStation(db, "26", "07", "Mil-Exp", "1", "1", "2", "F", "29th Ave");
        addStation(db, "27", "06", "Mil-Exp", "1", "3", "1", "F", "Nanaimo");
        addStation(db, "28", "05", "Mil-Exp", "1", "3", "3", "T", "Commercial");
        addStation(db, "29", "04", "Mil-Exp", "1", "2", "3", "F", "Main");
        addStation(db, "30", "03", "Mil-Exp", "1", "1", "2", "F", "Stadium");
        addStation(db, "31", "02", "Mil-Exp", "1", "1", "1", "F", "Granville");
        addStation(db, "32", "01", "Mil-Exp", "1", "2", "1", "F", "Burrard");

        addStation(db, "33", "00", "Mil-Exp-Can-YVR", "1", "0", "2", "T", "Waterfront");

        addStation(db, "34", "01", "Can-YVR", "1", "2", "2", "F", "Vancouver City Center");
        addStation(db, "35", "02", "Can-YVR", "1", "2", "2", "F", "Yaletown-Roundhouse");
        addStation(db, "36", "03", "Can-YVR", "1", "2", "1", "F", "Olympic Village");
        addStation(db, "37", "04", "Can-YVR", "1", "1", "2", "F", "Broadway-City Hall");
        addStation(db, "38", "05", "Can-YVR", "1", "2", "3", "F", "King Edward");
        addStation(db, "39", "06", "Can-YVR", "1", "3", "2", "F", "Oakridge-41st");
        addStation(db, "40", "07", "Can-YVR", "1", "2", "3", "F", "Langara-49th");
        addStation(db, "41", "08", "Can-YVR", "1", "3", "2", "F", "Marine Drive");
        addStation(db, "42", "09", "Can-YVR", "2", "2", "9", "T", "Bridgeport");

        addStation(db, "43", "10", "Can", "2", "2", "2", "F", "Aberdeen");
        addStation(db, "44", "11", "Can", "2", "2", "2", "F", "Lansdowne");
        addStation(db, "45", "12", "Can", "2", "2", "0", "F", "Brighouse");

        addStation(db, "46", "10", "YVR", "2", "9", "2", "F", "Templeton");
        addStation(db, "47", "11", "YVR", "2", "2", "2", "F", "Sea Island Center");
        addStation(db, "48", "12", "YVR", "2", "2", "0", "F", "YVR-Airport");

        db.close();

    }

    //Add Station//////////////////////////////////////////////////////////////////////////////////////
    public void addStation(SQLiteDatabase db, String ID, String LineIndex, String Line, String Zone, String TimePrev, String TimeNext, String Switch, String Name){

        String insertRow;


        insertRow = "INSERT INTO " + tbl_Stations + " values ('" + Integer.parseInt(ID) + "', '" + Integer.parseInt(LineIndex) + "', '" + Line + "', '" + Integer.parseInt(Zone) + "', '" + Integer.parseInt(TimePrev) + "', '" + Integer.parseInt(TimeNext) + "', '" + Switch + "', '" + Name + "');";
        db.execSQL(insertRow);


    }

    //Get Station//////////////////////////////////////////////////////////////////////////////////////
    public Station getStation(String strStnName){

        String strSQL;

        SQLiteDatabase db = getReadableDatabase();

        strSQL = "SELECT * FROM " + tbl_Stations + " WHERE " + key_StnName + "=" + strStnName;
        Cursor c = db.rawQuery(strSQL, null);
        c.moveToFirst();

        Station station = new Station(c.getString(0), c.getString(1), c.getString(2), c.getString(3), c.getString(4), c.getString(5), c.getString(6), c.getString(7));

        c.close();
        db.close();

        return station;

    }

    public Station getStation(String strLine, int intLineIndex){

        String strSQL;

        SQLiteDatabase db = getReadableDatabase();

        strSQL = "SELECT * FROM " + tbl_Stations + " WHERE " + key_StnLine + "=" + strLine + " AND " + key_StnLineIndex + "=" + String.valueOf(intLineIndex);
        Cursor c = db.rawQuery(strSQL, null);
        c.moveToFirst();

        Station station = new Station(c.getString(0), c.getString(1), c.getString(2), c.getString(3), c.getString(4), c.getString(5), c.getString(6), c.getString(7));

        c.close();
        db.close();

        return station;

    }





}

Error Log

03-30 18:23:32.736: W/ApplicationPackageManager(27014): getCSCPackageItemText()
03-30 18:23:35.038: D/AndroidRuntime(27014): Shutting down VM
03-30 18:23:35.038: W/dalvikvm(27014): threadid=1: thread exiting with uncaught exception (group=0x4189cda0)
03-30 18:23:35.048: E/AndroidRuntime(27014): FATAL EXCEPTION: main
03-30 18:23:35.048: E/AndroidRuntime(27014): Process: com.example.skytrainfinalproject, PID: 27014
03-30 18:23:35.048: E/AndroidRuntime(27014): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.skytrainfinalproject/com.example.skytrainfinalproject.Route}: java.lang.IllegalStateException: getDatabase called recursively
03-30 18:23:35.048: E/AndroidRuntime(27014):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305)
03-30 18:23:35.048: E/AndroidRuntime(27014):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2363)
03-30 18:23:35.048: E/AndroidRuntime(27014):    at android.app.ActivityThread.access$900(ActivityThread.java:161)
03-30 18:23:35.048: E/AndroidRuntime(27014):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1265)
03-30 18:23:35.048: E/AndroidRuntime(27014):    at android.os.Handler.dispatchMessage(Handler.java:102)
03-30 18:23:35.048: E/AndroidRuntime(27014):    at android.os.Looper.loop(Looper.java:157)
03-30 18:23:35.048: E/AndroidRuntime(27014):    at android.app.ActivityThread.main(ActivityThread.java:5356)
03-30 18:23:35.048: E/AndroidRuntime(27014):    at java.lang.reflect.Method.invokeNative(Native Method)
03-30 18:23:35.048: E/AndroidRuntime(27014):    at java.lang.reflect.Method.invoke(Method.java:515)
03-30 18:23:35.048: E/AndroidRuntime(27014):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1265)
03-30 18:23:35.048: E/AndroidRuntime(27014):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)
03-30 18:23:35.048: E/AndroidRuntime(27014):    at dalvik.system.NativeStart.main(Native Method)
03-30 18:23:35.048: E/AndroidRuntime(27014): Caused by: java.lang.IllegalStateException: getDatabase called recursively
03-30 18:23:35.048: E/AndroidRuntime(27014):    at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:204)
03-30 18:23:35.048: E/AndroidRuntime(27014):    at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
03-30 18:23:35.048: E/AndroidRuntime(27014):    at com.example.skytrainfinalproject.DatabaseManager.CreateTblStations(DatabaseManager.java:152)
03-30 18:23:35.048: E/AndroidRuntime(27014):    at com.example.skytrainfinalproject.DatabaseManager.onCreate(DatabaseManager.java:61)
03-30 18:23:35.048: E/AndroidRuntime(27014):    at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
03-30 18:23:35.048: E/AndroidRuntime(27014):    at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188)
03-30 18:23:35.048: E/AndroidRuntime(27014):    at com.example.skytrainfinalproject.DatabaseManager.getStation(DatabaseManager.java:249)
03-30 18:23:35.048: E/AndroidRuntime(27014):    at com.example.skytrainfinalproject.Route.Testing(Route.java:62)
03-30 18:23:35.048: E/AndroidRuntime(27014):    at com.example.skytrainfinalproject.Route.onCreate(Route.java:28)
03-30 18:23:35.048: E/AndroidRuntime(27014):    at android.app.Activity.performCreate(Activity.java:5426)
03-30 18:23:35.048: E/AndroidRuntime(27014):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105)
03-30 18:23:35.048: E/AndroidRuntime(27014):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2269)
03-30 18:23:35.048: E/AndroidRuntime(27014):    ... 11 more
03-30 18:23:37.160: I/Process(27014): Sending signal. PID: 27014 SIG: 9

If you are using SQLiteOpenHelper then you most likely don't want to call SQLiteDatabase.openOrCreateDatabase(...). The helper class provides an abstraction layer to SQLiteDatabase. Your constructor should look like this:

public DatabaseManager(Context context, String dbName, CursorFactory factory,
        int version) {
    super(context, dbName, factory, version);
}

Then you can use your database like this:

DatabaseManager dbManager = new DatabaseManager(context, "dbSkyTrain.dbf", null, 1);
SQLiteDatabase db = dbManager.getWritableDatabase();
// Do database operations
db.close();

The onCreate method will be called as needed.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM