package de.graeb.adsbsniffer;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteConstraintException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.location.Location;
import android.util.Log;
import java.util.Date;
import de.graeb.adsbsniffer.adbsreceiver.Packet;
/**
* @author markus
*/
public class DatabaseHelper extends SQLiteOpenHelper {
private static final int VERSION = 2;
private static final String CREATE_MESSAGES = "CREATE TABLE IF NOT EXISTS messages(" +
"id INTEGER NOT NULL PRIMARY KEY," +
"flight INTEGER NOT NULL," +
"timestamp INTEGER," +
"time INTEGER NOT NULL," +
"icao24 TEXT NOT NULL," +
"format INTEGER NOT NULL," +
"message TEXT NOT NULL," +
"checksum INTEGER NOT NULL," +
"FOREIGN KEY(flight) REFERENCES flights(id)" +
");";
private static final String CREATE_FLIGHT_STATE = "CREATE TABLE IF NOT EXISTS flight_state(" +
"id INTEGER NOT NULL PRIMARY KEY," +
"flight INTEGER NOT NULL," +
"time INTEGER NOT NULL," +
"adsb_cnt INTEGER NOT NULL," +
"smode_cnt INTEGER NOT NULL," +
"FOREIGN KEY(flight) REFERENCES flights(id)" +
");";
private static final String CREATE_FLIGHTS = "CREATE TABLE IF NOT EXISTS flights (" +
"id INTEGER NOT NULL PRIMARY KEY," +
"first INTEGER NOT NULL," +
"last INTEGER," +
"icao24 TEXT NOT NULL" +
");";
private static final String CREATE_POSITION = "CREATE TABLE IF NOT EXISTS position(" +
"time INTEGER NOT NULL PRIMARY KEY," +
"latitude REAL NOT NULL," +
"longitude REAL NOT NULL," +
"altitude REAL," +
"speed REAL," +
"direction REAL" +
");";
private static final String CREATE_METADATA = "CREATE TABLE IF NOT EXISTS metadata(" +
"name TEXT" +
");";
public static final String TABLE_MESSAGES = "messages";
public static final String TABLE_FLIGHT_STATE = "flight_state";
public static final String TABLE_FLIGHTS = "flights";
public static final String TABLE_POSITION = "position";
public static final String TABLE_METADATA = "metadata";
public DatabaseHelper(Context context, String databaseName) {
super(context, databaseName, null, VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(CREATE_FLIGHTS);
db.execSQL(CREATE_FLIGHT_STATE);
db.execSQL(CREATE_MESSAGES);
db.execSQL(CREATE_POSITION);
db.execSQL(CREATE_METADATA);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// on new Version just create the new tables
onCreate(db);
}
public long storePacket(Packet packet, long flightId) {
SQLiteDatabase db = getWritableDatabase();
return storePacket(db, packet, flightId);
}
public long storePacket(SQLiteDatabase db, Packet packet, long flightId) {
ContentValues values = new ContentValues(5);
values.put("flight", flightId);
if (packet.externalTimestamp > 0) {
values.put("timestamp", packet.externalTimestamp);
}
values.put("time", packet.internalTimestamp.getTime() / 1000);
values.put("icao24", packet.icao24);
values.put("format", packet.format);
values.put("message", packet.message);
values.put("checksum", packet.checksumCorrect.value);
return db.insertOrThrow(TABLE_MESSAGES, null, values);
}
public long storePosition(Location location) {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues(6);
values.put("time", location.getTime() / 1000);
values.put("latitude", location.getLatitude());
values.put("longitude", location.getLongitude());
if (location.hasAltitude()) {
values.put("altitude", location.getAltitude());
}
if (location.hasSpeed()) {
values.put("speed", location.getSpeed());
}
if (location.hasBearing()) {
values.put("direction", location.getBearing());
}
long id;
try {
id = db.insertOrThrow(TABLE_POSITION, null, values);
} catch (SQLiteConstraintException e) {
Log.e("DatabaseHelper", "storePosition, ConstraintException");
id = -1;
}
return id;
}
public long storeFlightState(long flightId, Date date, int adsbCnt, int smodeCnt) {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues(4);
values.put("flight", flightId);
values.put("time", date.getTime() / 1000);
values.put("adsb_cnt", adsbCnt);
values.put("smode_cnt", smodeCnt);
return db.insert(TABLE_FLIGHT_STATE, null, values);
}
public long storeFlight(Date first, String icao24) {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues(6);
values.put("first", first.getTime() / 1000);
values.putNull("last");
values.put("icao24", icao24);
return db.insert(TABLE_FLIGHTS, null, values);
}
/**
* Update the last value in the flight table
* @param id of the flight
* @param last the value
* @return id
*/
public long updateFlight(long id, Date last) {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues(1);
values.put("last", last.getTime() / 1000);
return db.update(TABLE_FLIGHTS, values, "id = " + id, null);
}
/**
* Creates an index "index_time" in the messages table
*/
public void createIndex() {
SQLiteDatabase db = getWritableDatabase();
db.execSQL("CREATE INDEX IF NOT EXISTS index_time ON messages (time);");
}
/**
* Stores the name of the recording
* @param name name of the recording
* @return 1 if successful
*/
public long storeName(String name) {
SQLiteDatabase db = getWritableDatabase();
ContentValues values = new ContentValues(2);
values.put("name", name);
values.put("rowid", 1);
return db.replace(TABLE_METADATA, null, values);
}
/**
* Get the name, set by storeName()
* @return name or null
*/
public String getName() {
SQLiteDatabase db = getWritableDatabase();
String[] columns = {"name"};
Cursor cursor = db.query(TABLE_METADATA, columns, null, null, null, null, null);
cursor.moveToFirst();
return cursor.getCount() > 0 ? cursor.getString(0) : null;
}
}