Back to project page Go2-Rennes.
The source code is released under:
GNU General Public License
If you think the Android project Go2-Rennes listed in this page is inappropriate, such as containing malicious code/tools or violating the copyright, please email info at java2s dot com, thanks.
/******************************************************************************* * Copyright (c) 2011 Michel DAVID mimah35-at-gmail.com * //from w w w.j av a 2s. c o m * 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 3 of the License. * * 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, see <http://www.gnu.org/licenses/>. ******************************************************************************/ package fr.gotorennes.persistence; import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.URL; import java.util.zip.GZIPInputStream; import android.app.ProgressDialog; import android.content.Context; import android.content.SharedPreferences; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteException; import android.database.sqlite.SQLiteQueryBuilder; import android.util.Log; import fr.gotorennes.R; public class BusDatabase { private static final String TAG = "GoToRennes.BusDatabase"; private static final String PHONE_DB_PATH = "/data/data/fr.gotorennes/databases/bus.db"; private SQLiteDatabase dataBase; private final Context context; public BusDatabase(Context context) { this.context = context; } public synchronized void init(final ProgressDialog progress) { Log.i(TAG, "Initialisation de la base de donnes"); if (progress != null && progress.getOwnerActivity() != null) { progress.getOwnerActivity().runOnUiThread(new Runnable() { @Override public void run() { progress.setMessage(context.getString(R.string.checkDatabase)); } }); } int version = getCurrentVersion(); if (version != 0 && needUpdate(version)) { if (progress != null && progress.getOwnerActivity() != null) { progress.getOwnerActivity().runOnUiThread(new Runnable() { @Override public void run() { progress.setMessage(context.getString(R.string.updateDatabase)); } }); } close(); copy(); open(); updateVersion(version); } else { open(); } } protected int getCurrentVersion() { try { String stringVersion = new BufferedReader(new InputStreamReader(new URL("http://gotorennes.appspot.com/version").openStream())).readLine(); SharedPreferences prefs = context.getSharedPreferences("fr.gotorennes.Application", 0); prefs.edit().putString("gtfs", stringVersion).commit(); return Integer.parseInt(stringVersion); } catch (Exception ex) { Log.e(TAG, "Error while checking available version " + ex.getMessage()); } return 0; } protected boolean needUpdate(int version) { return !exists() || dataBase.getVersion() != version; } protected boolean exists() { try { open(); } catch (SQLiteException e) { Log.d(TAG, "La base de donnes n'existe pas"); } return dataBase != null; } protected void copy() { Log.i(TAG, "Copie de la base de donnes"); File outputFile = new File(PHONE_DB_PATH); GZIPInputStream myGzipInput = null; OutputStream myOutput = null; try { InputStream myInput = new URL("http://gotorennes.appspot.com/download").openStream(); myGzipInput = new GZIPInputStream(myInput); outputFile.getParentFile().mkdirs(); myOutput = new FileOutputStream(outputFile); byte[] buffer = new byte[1024]; int length; while ((length = myGzipInput.read(buffer)) > 0) { myOutput.write(buffer, 0, length); } } catch (IOException e) { Log.e(TAG, "Tlchargement de la base de donnes impossible", e); throw new Error("Tlchargement de la base de donnes impossible :( Veuillez redmarrer Go2Rennes.", e); } finally { try { if (myOutput != null) { myOutput.flush(); myOutput.close(); } if (myGzipInput != null) { myGzipInput.close(); } } catch (IOException e) { } } } protected void updateVersion(int version) { Log.i(TAG, "Mise jour de la version de la base de donnes"); dataBase.setVersion(version); Log.i(TAG, "Cration des index"); dataBase.execSQL("CREATE INDEX IF NOT EXISTS ID1 ON STATION_CIRCUIT (idStation)"); dataBase.execSQL("CREATE INDEX IF NOT EXISTS ID2 ON ARRET (idStation)"); dataBase.execSQL("CREATE INDEX IF NOT EXISTS ID3 ON TRAJET (idCircuit)"); dataBase.execSQL("CREATE INDEX IF NOT EXISTS ID4 ON STATION_CIRCUIT (idCircuit)"); dataBase.execSQL("CREATE INDEX IF NOT EXISTS ID5 ON ARRET (idTrajet)"); dataBase.execSQL("CREATE INDEX IF NOT EXISTS ID6 ON ARRET (idStation, idTrajet)"); } protected void open() { Log.i(TAG, "Ouverture de la base de donnes"); dataBase = SQLiteDatabase.openDatabase(PHONE_DB_PATH, null, SQLiteDatabase.OPEN_READWRITE); } public synchronized void close() { if (dataBase != null) { Log.i(TAG, "Fermeture de la base de donnes"); dataBase.close(); } } public Cursor query(String tables, String[] projections, String selection, String[] selectionArgs, String sort, String limit) { SQLiteQueryBuilder builder = new SQLiteQueryBuilder(); builder.setTables(tables); Cursor cursor = builder.query(dataBase, projections, selection, selectionArgs, null, null, sort, limit); if (cursor == null) { return null; } else if (!cursor.moveToFirst()) { cursor.close(); return null; } return cursor; } public Cursor query(String sql, String[] selectionArgs) { Cursor cursor = dataBase.rawQuery(sql, selectionArgs); if (cursor == null) { return null; } if (!cursor.moveToFirst()) { cursor.close(); return null; } return cursor; } }