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.