1 package net.sf.openrocket.android.db;
\r
3 import net.sf.openrocket.android.motor.ExtendedThrustCurveMotor;
\r
4 import net.sf.openrocket.motor.Manufacturer;
\r
5 import net.sf.openrocket.motor.Motor;
\r
6 import net.sf.openrocket.motor.ThrustCurveMotor;
\r
7 import net.sf.openrocket.util.Coordinate;
\r
8 import android.content.ContentValues;
\r
9 import android.database.Cursor;
\r
10 import android.database.SQLException;
\r
11 import android.database.sqlite.SQLiteDatabase;
\r
12 import android.util.Log;
\r
14 public class MotorDao {
\r
16 private static final String TAG = "MotorDao";
\r
18 private SQLiteDatabase mDb;
\r
20 private final static String DATABASE_TABLE = "motor";
\r
21 private final static String DROP_TABLE = "DROP TABLE IF EXISTS " + DATABASE_TABLE;
\r
22 private final static String CREATE_TABLE =
\r
23 "create table "+ DATABASE_TABLE + " ( " +
\r
24 "_id integer primary key, "+
\r
25 "unique_name text unique, "+
\r
26 "designation text, "+
\r
28 "diameter number, "+
\r
29 "tot_impulse_ns number, "+
\r
30 "avg_thrust_n number, "+
\r
31 "max_thrust_n number, "+
\r
32 "burn_time_s number, "+
\r
34 "prop_mass_g number,"+
\r
35 "tot_mass_g number,"+
\r
37 "manufacturer text," +
\r
39 "impulse_class text," +
\r
40 "thrust_data blob,"+
\r
45 MotorDao( SQLiteDatabase mDb ) {
\r
49 static String[] create() { return new String[] {CREATE_TABLE}; }
\r
51 static String[] update( int oldVer, int newVer ) {
\r
52 return new String[] { DROP_TABLE, CREATE_TABLE };
\r
55 public final static String ID = "_id";
\r
56 public final static String UNIQUE_NAME = "unique_name";
\r
57 public final static String DESIGNATION = "designation";
\r
58 public final static String DELAYS = "delays";
\r
59 public final static String DIAMETER = "diameter";
\r
60 public final static String TOTAL_IMPULSE = "tot_impulse_ns";
\r
61 public final static String AVG_THRUST = "avg_thrust_n";
\r
62 public final static String MAX_THRUST = "max_thrust_n";
\r
63 public final static String BURN_TIME = "burn_time_s";
\r
64 public final static String LENGTH = "length";
\r
65 public final static String CASE_INFO = "case_info";
\r
66 public final static String MANUFACTURER = "manufacturer";
\r
67 public final static String TYPE = "type";
\r
68 public final static String IMPULSE_CLASS = "impulse_class";
\r
69 public final static String THRUST_DATA = "thrust_data";
\r
70 public final static String TIME_DATA = "time_data";
\r
71 public final static String CG_DATA = "cg_data";
\r
73 private final static String[] ALL_COLS = new String[] {
\r
92 public long insertOrUpdateMotor(ExtendedThrustCurveMotor mi) throws Exception {
\r
93 ContentValues initialValues = new ContentValues();
\r
94 final ThrustCurveMotor tcm = mi.getThrustCurveMotor();
\r
95 initialValues.put(ID, mi.getId());
\r
96 initialValues.put(UNIQUE_NAME, tcm.getManufacturer()+tcm.getDesignation());
\r
97 initialValues.put(DESIGNATION, tcm.getDesignation());
\r
98 initialValues.put(DELAYS, ConversionUtils.serializeArrayOfDouble(tcm.getStandardDelays()));
\r
99 initialValues.put(DIAMETER,tcm.getDiameter());
\r
100 initialValues.put(TOTAL_IMPULSE,tcm.getTotalImpulseEstimate());
\r
101 initialValues.put(AVG_THRUST,tcm.getAverageThrustEstimate());
\r
102 initialValues.put(MAX_THRUST,tcm.getMaxThrustEstimate());
\r
103 initialValues.put(BURN_TIME,tcm.getBurnTimeEstimate());
\r
104 initialValues.put(LENGTH, tcm.getLength());
\r
105 initialValues.put(CASE_INFO, mi.getCaseInfo());
\r
106 initialValues.put(TYPE, tcm.getMotorType().getName());
\r
107 initialValues.put(IMPULSE_CLASS,mi.getImpulseClass());
\r
108 initialValues.put(MANUFACTURER,tcm.getManufacturer().getSimpleName());
\r
109 initialValues.put(THRUST_DATA, ConversionUtils.serializeArrayOfDouble(tcm.getThrustPoints()));
\r
110 initialValues.put(TIME_DATA,ConversionUtils.serializeArrayOfDouble(tcm.getTimePoints()));
\r
111 initialValues.put(CG_DATA,ConversionUtils.serializeArrayOfCoordinate(tcm.getCGPoints()));
\r
113 Log.d(TAG,"insertOrUpdate Motor");
\r
114 long rv = mDb.insertWithOnConflict(DATABASE_TABLE, null, initialValues,SQLiteDatabase.CONFLICT_REPLACE);
\r
119 * Delete the motor and burn data with the given rowId
\r
121 * @param name name of motor to delete
\r
122 * @return true if deleted, false otherwise
\r
124 public boolean deleteMotor(Long id) {
\r
126 boolean rv = mDb.delete(DATABASE_TABLE, ID + "=" + id, null) > 0;
\r
136 public Cursor fetchAllInGroups( String groupCol, String groupVal ) {
\r
137 return mDb.query(DATABASE_TABLE,
\r
138 /* columns */ ALL_COLS,
\r
139 /* selection */groupCol + "=?",
\r
140 /* selection args*/new String[] {groupVal},
\r
143 /* orderby*/ DESIGNATION );
\r
148 * Fetch the groups based on groupCol
\r
152 public Cursor fetchGroups( String groupCol ) {
\r
153 return mDb.query(true, DATABASE_TABLE,
\r
154 /* columns */new String[] {
\r
157 /* selection */null,
\r
158 /* selection args*/null,
\r
167 * Return a Cursor over the list of all motors
\r
169 * @return Cursor over all notes
\r
171 public Cursor fetchAllMotors() {
\r
173 return mDb.query(DATABASE_TABLE,
\r
174 /* columns */ ALL_COLS,
\r
175 /* selection */null,
\r
176 /* selection args*/null,
\r
182 private ExtendedThrustCurveMotor hydrateMotor( Cursor mCursor ) throws Exception {
\r
183 ExtendedThrustCurveMotor mi = new ExtendedThrustCurveMotor();
\r
185 mi.setId(mCursor.getLong(mCursor.getColumnIndex(ID)));
\r
186 mi.setCaseInfo(mCursor.getString(mCursor.getColumnIndex(CASE_INFO)));
\r
187 mi.setImpulseClass(mCursor.getString(mCursor.getColumnIndex(IMPULSE_CLASS)));
\r
190 String designation = mCursor.getString(mCursor.getColumnIndex(DESIGNATION));
\r
191 double[] delays = ConversionUtils.deserializeArrayOfDouble( mCursor.getBlob(mCursor.getColumnIndex(DELAYS)));
\r
192 double diameter = mCursor.getDouble(mCursor.getColumnIndex(DIAMETER));
\r
193 double totImpulse = mCursor.getDouble(mCursor.getColumnIndex(TOTAL_IMPULSE));
\r
194 double avgImpulse = mCursor.getDouble(mCursor.getColumnIndex(AVG_THRUST));
\r
195 double maxThrust = mCursor.getDouble(mCursor.getColumnIndex(MAX_THRUST));
\r
196 double length = mCursor.getDouble(mCursor.getColumnIndex(LENGTH));
\r
197 Motor.Type type = Motor.Type.fromName( mCursor.getString(mCursor.getColumnIndex(TYPE)));
\r
198 Manufacturer manufacturer = Manufacturer.getManufacturer( mCursor.getString( mCursor.getColumnIndex(MANUFACTURER)));
\r
199 double[] thrustData = ConversionUtils.deserializeArrayOfDouble( mCursor.getBlob(mCursor.getColumnIndex(THRUST_DATA)));
\r
200 double[] timeData = ConversionUtils.deserializeArrayOfDouble( mCursor.getBlob(mCursor.getColumnIndex(TIME_DATA)));
\r
201 Coordinate[] cgData = ConversionUtils.deserializeArrayOfCoordinate( mCursor.getBlob(mCursor.getColumnIndex(CG_DATA)));
\r
203 ThrustCurveMotor tcm = new ThrustCurveMotor(manufacturer,
\r
214 mi.setThrustCurveMotor(tcm);
\r
220 public ExtendedThrustCurveMotor fetchMotor(Long id ) throws Exception {
\r
221 Cursor mCursor = mDb.query(DATABASE_TABLE,
\r
222 /* columns */ ALL_COLS,
\r
223 /* selection */ID + "="+id,
\r
224 /* selection args*/null,
\r
228 if ( mCursor == null ) {
\r
232 if (mCursor.getCount() == 0) {
\r
235 mCursor.moveToFirst();
\r
236 return hydrateMotor(mCursor);
\r
244 public ExtendedThrustCurveMotor fetchMotor(String manufacturerShortName, String designation ) throws Exception {
\r
245 Cursor mCursor = mDb.query(DATABASE_TABLE,
\r
246 /* columns */ ALL_COLS,
\r
247 /* selection */MANUFACTURER + "='"+manufacturerShortName + "' and "+DESIGNATION+"='"+designation+"'",
\r
248 /* selection args*/null,
\r
252 if ( mCursor == null ) {
\r
256 if (mCursor.getCount() == 0) {
\r
259 mCursor.moveToFirst();
\r
260 return hydrateMotor(mCursor);
\r
268 public static String extractPrettyDelayString( Cursor c ) {
\r
269 byte[] blob = c.getBlob(c.getColumnIndex(MotorDao.DELAYS));
\r
272 double[] delayarry = ConversionUtils.deserializeArrayOfDouble(blob);
\r
273 boolean first = true;
\r
274 for( double d:delayarry ) {
\r
280 if ( d == Motor.PLUGGED ) {
\r
283 s += Math.round(d);
\r
286 } catch ( Exception ex ) {
\r