1 package net.sf.openrocket.android.db;
\r
3 import java.io.ByteArrayInputStream;
\r
4 import java.io.ByteArrayOutputStream;
\r
5 import java.io.ObjectInputStream;
\r
6 import java.io.ObjectOutputStream;
\r
7 import java.util.Vector;
\r
9 import net.sf.openrocket.android.motor.Motor;
\r
10 import android.content.ContentValues;
\r
11 import android.database.Cursor;
\r
12 import android.database.SQLException;
\r
13 import android.database.sqlite.SQLiteDatabase;
\r
14 import android.util.Log;
\r
16 public class MotorDao {
\r
18 private static final String TAG = "MotorDao";
\r
20 private SQLiteDatabase mDb;
\r
22 private final static String DATABASE_TABLE = "motor";
\r
23 private final static String DROP_TABLE = "DROP TABLE IF EXISTS " + DATABASE_TABLE;
\r
24 private final static String CREATE_TABLE =
\r
25 "create table "+ DATABASE_TABLE + " ( " +
\r
26 "_id integer primary key, "+
\r
27 "unique_name text unique, "+
\r
29 "diameter number, "+
\r
30 "tot_impulse_ns number, "+
\r
31 "avg_thrust_n number, "+
\r
32 "max_thrust_n number, "+
\r
33 "burn_time_s number, "+
\r
35 "prop_mass_g number,"+
\r
36 "tot_mass_g number,"+
\r
38 "manufacturer text," +
\r
39 "impulse_class text," +
\r
43 MotorDao( SQLiteDatabase mDb ) {
\r
47 static String[] create() { return new String[] {CREATE_TABLE}; }
\r
49 static String[] update( int oldVer, int newVer ) {
\r
50 return new String[] { DROP_TABLE, CREATE_TABLE };
\r
53 public final static String ID = "_id";
\r
54 public final static String UNIQUE_NAME = "unique_name";
\r
55 public final static String NAME = "name";
\r
56 public final static String DIAMETER = "diameter";
\r
57 public final static String TOTAL_IMPULSE = "tot_impulse_ns";
\r
58 public final static String AVG_THRUST = "avg_thrust_n";
\r
59 public final static String MAX_THRUST = "max_thrust_n";
\r
60 public final static String BURN_TIME = "burn_time_s";
\r
61 public final static String LENGTH = "length";
\r
62 public final static String PROP_MASS = "prop_mass_g";
\r
63 public final static String TOT_MASS = "tot_mass_g";
\r
64 public final static String BURNDATA = "burndata";
\r
65 public final static String CASE_INFO = "case_info";
\r
66 public final static String MANUFACTURER = "manufacturer";
\r
67 public final static String IMPULSE_CLASS = "impulse_class";
\r
69 public long insertOrUpdateMotor(Motor mi) {
\r
70 ContentValues initialValues = new ContentValues();
\r
71 initialValues.put(ID, mi.getMotor_id());
\r
72 initialValues.put(NAME, mi.getName());
\r
73 initialValues.put(DIAMETER,mi.getDiameter());
\r
74 initialValues.put(TOTAL_IMPULSE,mi.getTotalImpulse());
\r
75 initialValues.put(AVG_THRUST,mi.getAvgThrust());
\r
76 initialValues.put(MAX_THRUST,mi.getMaxThrust());
\r
77 initialValues.put(BURN_TIME,mi.getBurnTime());
\r
78 initialValues.put(LENGTH, mi.getLength());
\r
79 initialValues.put(PROP_MASS, mi.getPropMass());
\r
80 initialValues.put(TOT_MASS,mi.getTotMass());
\r
81 initialValues.put(CASE_INFO, mi.getCaseInfo());
\r
82 initialValues.put(MANUFACTURER,mi.getManufacturer());
\r
83 initialValues.put(IMPULSE_CLASS,mi.getImpulseClass());
\r
84 initialValues.put(UNIQUE_NAME, mi.getManufacturer()+mi.getName());
\r
86 // Serialize the Vector of burn data
\r
87 Vector<Double> burndata = mi.getBurndata();
\r
88 byte[] serObj = null;
\r
89 if ( burndata != null ) {
\r
91 ByteArrayOutputStream b = new ByteArrayOutputStream();
\r
92 ObjectOutputStream os = new ObjectOutputStream(b);
\r
93 os.writeObject(burndata);
\r
95 serObj = b.toByteArray();
\r
96 } catch (Exception ex) {
\r
97 Log.d(TAG,"unable to serialze burndata");
\r
100 initialValues.put(BURNDATA, serObj);
\r
104 Log.d(TAG,"insertOrUpdate Motor");
\r
105 long rv = mDb.insertWithOnConflict(DATABASE_TABLE, null, initialValues,SQLiteDatabase.CONFLICT_REPLACE);
\r
110 * Delete the motor and burn data with the given rowId
\r
112 * @param name name of motor to delete
\r
113 * @return true if deleted, false otherwise
\r
115 public boolean deleteMotor(Long id) {
\r
117 boolean rv = mDb.delete(DATABASE_TABLE, ID + "=" + id, null) > 0;
\r
127 public Cursor fetchAllInGroups( String groupCol, String groupVal ) {
\r
128 return mDb.query(DATABASE_TABLE,
\r
129 /* columns */new String[] {
\r
144 /* selection */groupCol + "=?",
\r
145 /* selection args*/new String[] {groupVal},
\r
148 /* orderby*/ NAME );
\r
153 * Fetch the groups based on groupCol
\r
157 public Cursor fetchGroups( String groupCol ) {
\r
158 return mDb.query(true, DATABASE_TABLE,
\r
159 /* columns */new String[] {
\r
162 /* selection */null,
\r
163 /* selection args*/null,
\r
172 * Return a Cursor over the list of all motors
\r
174 * @return Cursor over all notes
\r
176 public Cursor fetchAllMotors() {
\r
178 return mDb.query(DATABASE_TABLE,
\r
179 /* columns */new String[] {
\r
194 /* selection */null,
\r
195 /* selection args*/null,
\r
201 public Motor fetchMotor(Long id ) throws SQLException {
\r
202 Cursor mCursor = mDb.query(DATABASE_TABLE,
\r
203 /* columns */new String[] {
\r
219 /* selection */ID + "="+id,
\r
220 /* selection args*/null,
\r
224 if ( mCursor == null ) {
\r
228 if (mCursor.getCount() == 0) {
\r
231 mCursor.moveToFirst();
\r
232 Motor mi = new Motor();
\r
233 mi.setMotor_id(mCursor.getLong(mCursor.getColumnIndex(ID)));
\r
234 mi.setName(mCursor.getString(mCursor.getColumnIndex(NAME)));
\r
235 mi.setDiameter(mCursor.getLong(mCursor.getColumnIndex(DIAMETER)));
\r
236 mi.setTotalImpulse(mCursor.getFloat(mCursor.getColumnIndex(TOTAL_IMPULSE)));
\r
237 mi.setAvgThrust(mCursor.getFloat(mCursor.getColumnIndex(AVG_THRUST)));
\r
238 mi.setMaxThrust(mCursor.getFloat(mCursor.getColumnIndex(MAX_THRUST)));
\r
239 mi.setBurnTime(mCursor.getFloat(mCursor.getColumnIndex(BURN_TIME)));
\r
240 mi.setLength(mCursor.getFloat(mCursor.getColumnIndex(LENGTH)));
\r
241 mi.setPropMass(mCursor.getDouble(mCursor.getColumnIndex(PROP_MASS)));
\r
242 mi.setCaseInfo(mCursor.getString(mCursor.getColumnIndex(CASE_INFO)));
\r
243 mi.setTotMass(mCursor.getDouble(mCursor.getColumnIndex(TOT_MASS)));
\r
244 mi.setManufacturer(mCursor.getString(mCursor.getColumnIndex(MANUFACTURER)));
\r
245 mi.setImpulseClass(mCursor.getString(mCursor.getColumnIndex(IMPULSE_CLASS)));
\r
248 // Deserialize burndata column
\r
249 byte[] serObj = mCursor.getBlob(mCursor.getColumnIndex(BURNDATA));
\r
250 Vector<Double> burndata = null;
\r
251 if (serObj != null ) {
\r
253 ObjectInputStream is = new ObjectInputStream( new ByteArrayInputStream(serObj));
\r
254 burndata = (Vector<Double>) is.readObject();
\r
256 catch (Exception ex) {
\r
257 Log.d(TAG,"cannot deserialize burndata");
\r
260 mi.setBurndata(burndata);
\r