aboutsummaryrefslogtreecommitdiff
path: root/src/net/cbaines/suma/DatabaseHelper.java
diff options
context:
space:
mode:
authorChristopher Baines <cbaines8@gmail.com>2012-01-04 21:15:15 +0000
committerChristopher Baines <cbaines8@gmail.com>2012-01-04 21:15:15 +0000
commit9f0e1e1520070a2d73137f799538c44c42c47c0c (patch)
tree0be4f0a3484ac1cec6078b3c997d3db79820b6af /src/net/cbaines/suma/DatabaseHelper.java
downloadsouthamptonuniversitymap-9f0e1e1520070a2d73137f799538c44c42c47c0c.tar
southamptonuniversitymap-9f0e1e1520070a2d73137f799538c44c42c47c0c.tar.gz
Initial commit.
Diffstat (limited to 'src/net/cbaines/suma/DatabaseHelper.java')
-rw-r--r--src/net/cbaines/suma/DatabaseHelper.java279
1 files changed, 279 insertions, 0 deletions
diff --git a/src/net/cbaines/suma/DatabaseHelper.java b/src/net/cbaines/suma/DatabaseHelper.java
new file mode 100644
index 0000000..28ad6a5
--- /dev/null
+++ b/src/net/cbaines/suma/DatabaseHelper.java
@@ -0,0 +1,279 @@
+/*
+ * Southampton University Map App
+ * Copyright (C) 2011 Christopher Baines
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+package net.cbaines.suma;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.sql.SQLException;
+
+import android.content.Context;
+import android.database.sqlite.SQLiteDatabase;
+import android.database.sqlite.SQLiteException;
+import android.util.Log;
+
+import com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper;
+import com.j256.ormlite.dao.Dao;
+import com.j256.ormlite.support.ConnectionSource;
+import com.j256.ormlite.table.TableUtils;
+
+public class DatabaseHelper extends OrmLiteSqliteOpenHelper {
+
+ private static final String DATABASE_PATH = "/data/data/net.cbaines.suma/databases/";
+ private static final String DATABASE_NAME = "data.db";
+
+ private static final int DATABASE_VERSION = 36;
+
+ private static final String TAG = "DatabaseHelper";
+
+ // the DAO object we use to access the SimpleData table
+ private Dao<Building, String> buildingDao = null;
+ private Dao<BusStop, String> busStopDao = null;
+ private Dao<BusRoute, Integer> busRouteDao = null;
+ private Dao<RouteStops, Integer> routeStopsDao = null;
+ private Dao<Site, String> siteDao = null;
+ private Dao<Bus, Integer> busDao = null;
+ private Dao<Stop, Integer> stopDao = null;
+
+ private Context context;
+
+ public DatabaseHelper(Context context) {
+ super(context, DATABASE_NAME, null, DATABASE_VERSION);
+ Log.i(TAG, "Database Helper created");
+ this.context = context;
+ }
+
+ @Override
+ public void onCreate(SQLiteDatabase database, ConnectionSource connectionSource) {
+ try {
+ Log.i(DatabaseHelper.class.getName(), "onCreate");
+ TableUtils.createTable(connectionSource, Building.class);
+ TableUtils.createTable(connectionSource, BusStop.class);
+ TableUtils.createTable(connectionSource, BusRoute.class);
+ TableUtils.createTable(connectionSource, RouteStops.class);
+ TableUtils.createTable(connectionSource, Site.class);
+ TableUtils.createTable(connectionSource, Bus.class);
+ TableUtils.createTable(connectionSource, Stop.class);
+ } catch (SQLException e) {
+ Log.e(DatabaseHelper.class.getName(), "Can't create database", e);
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
+ try {
+ Log.i(DatabaseHelper.class.getName(), "onUpgrade");
+ TableUtils.dropTable(connectionSource, Building.class, true);
+ TableUtils.dropTable(connectionSource, BusStop.class, true);
+ TableUtils.dropTable(connectionSource, BusRoute.class, true);
+ TableUtils.dropTable(connectionSource, RouteStops.class, true);
+ TableUtils.dropTable(connectionSource, Site.class, true);
+ TableUtils.dropTable(connectionSource, Bus.class, true);
+ TableUtils.dropTable(connectionSource, Stop.class, true);
+ // after we drop the old databases, we create the new ones
+ onCreate(database, connectionSource);
+ } catch (SQLException e) {
+ Log.e(DatabaseHelper.class.getName(), "Can't drop databases", e);
+ throw new RuntimeException(e);
+ }
+
+ }
+
+ /**
+ * Returns the Database Access Object (DAO) for our SimpleData class. It will create it or just give the cached value.
+ */
+ public Dao<Building, String> getBuildingDao() throws SQLException {
+ if (buildingDao == null) {
+ buildingDao = getDao(Building.class);
+ }
+ return buildingDao;
+ }
+
+ /**
+ * Returns the Database Access Object (DAO) for our SimpleData class. It will create it or just give the cached value.
+ */
+ public Dao<BusStop, String> getBusStopDao() throws SQLException {
+ if (busStopDao == null) {
+ busStopDao = getDao(BusStop.class);
+ }
+ return busStopDao;
+ }
+
+ /**
+ * Returns the Database Access Object (DAO) for our SimpleData class. It will create it or just give the cached value.
+ */
+ public Dao<BusRoute, Integer> getBusRouteDao() throws SQLException {
+ if (busRouteDao == null) {
+ busRouteDao = getDao(BusRoute.class);
+ }
+ return busRouteDao;
+ }
+
+ /**
+ * Returns the Database Access Object (DAO) for our SimpleData class. It will create it or just give the cached value.
+ */
+ public Dao<RouteStops, Integer> getRouteStopsDao() throws SQLException {
+ if (routeStopsDao == null) {
+ routeStopsDao = getDao(RouteStops.class);
+ }
+ return routeStopsDao;
+ }
+
+ /**
+ * Returns the Database Access Object (DAO) for our SimpleData class. It will create it or just give the cached value.
+ */
+ public Dao<Site, String> getSiteDao() throws SQLException {
+ if (siteDao == null) {
+ siteDao = getDao(Site.class);
+ }
+ return siteDao;
+ }
+
+ /**
+ * Returns the Database Access Object (DAO) for our SimpleData class. It will create it or just give the cached value.
+ */
+ public Dao<Bus, Integer> getBusDao() throws SQLException {
+ if (busDao == null) {
+ busDao = getDao(Bus.class);
+ }
+ return busDao;
+ }
+
+ /**
+ * Returns the Database Access Object (DAO) for our SimpleData class. It will create it or just give the cached value.
+ */
+ public Dao<Stop, Integer> getStopDao() throws SQLException {
+ if (stopDao == null) {
+ stopDao = getDao(Stop.class);
+ }
+ return stopDao;
+ }
+
+ /**
+ * 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
+ */
+ public boolean checkDataBase() {
+ Log.i(TAG, "Check database");
+
+ SQLiteDatabase checkDB = null;
+
+ try {
+ String myPath = DATABASE_PATH + DATABASE_NAME;
+ checkDB = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READONLY);
+ } catch (SQLiteException e) {
+
+ // database does't exist yet.
+
+ }
+
+ if (checkDB != null) {
+
+ checkDB.close();
+
+ }
+
+ Log.i(TAG, "Finished checking database");
+ 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.
+ * */
+ public void copyDataBase() throws IOException {
+ Log.i(TAG, "Begining copy database");
+
+ // 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.
+ Log.i(TAG, "GetReadableDatabase");
+ this.getWritableDatabase().close();
+
+ InputStream myInput = context.getAssets().open(DATABASE_NAME);
+
+ // Path to the just created empty db
+ String outFileName = DATABASE_PATH + DATABASE_NAME;
+
+ File database = new File(outFileName);
+ if (database.exists()) {
+ database.delete();
+ }
+
+ // 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();
+
+ // getWritableDatabase().close();
+
+ Log.i(TAG, "Finished copying db");
+
+ }
+
+ /**
+ * 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 {
+
+ try {
+ Log.i(TAG, "Copy database");
+ copyDataBase();
+ } catch (IOException e) {
+ throw new Error("Error copying database");
+ }
+ }
+
+ }
+
+ /**
+ * Close the database connections and clear any cached DAOs.
+ */
+ @Override
+ public void close() {
+ super.close();
+ buildingDao = null;
+ busStopDao = null;
+ busRouteDao = null;
+ routeStopsDao = null;
+ siteDao = null;
+ busDao = null;
+ stopDao = null;
+ }
+} \ No newline at end of file