Move the android package from the main trunk/src directory to trunk/android/src.
[debian/openrocket] / android / src / net / sf / openrocket / android / db / MotorDao.java
1 package net.sf.openrocket.android.db;\r
2 \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
8 \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
15 \r
16 public class MotorDao {\r
17 \r
18         private static final String TAG = "MotorDao";\r
19 \r
20         private SQLiteDatabase mDb;\r
21 \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
28                                         "name text, "+\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
34                                         "length number," +\r
35                                         "prop_mass_g number,"+\r
36                                         "tot_mass_g number,"+\r
37                                         "case_info text,"+\r
38                                         "manufacturer text," +\r
39                                         "impulse_class text," +\r
40                                         "burndata blob"+\r
41                                         ");";\r
42 \r
43         MotorDao( SQLiteDatabase mDb ) {\r
44                 this.mDb = mDb;\r
45         }\r
46 \r
47         static String[] create() { return new String[] {CREATE_TABLE}; }\r
48 \r
49         static String[] update( int oldVer, int newVer ) {\r
50                 return new String[] { DROP_TABLE, CREATE_TABLE };\r
51         }\r
52 \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
68 \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
85                 {\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
90                                 try {\r
91                                         ByteArrayOutputStream b = new ByteArrayOutputStream();\r
92                                         ObjectOutputStream os = new ObjectOutputStream(b);\r
93                                         os.writeObject(burndata);\r
94                                         os.close();\r
95                                         serObj = b.toByteArray();\r
96                                 } catch (Exception ex) {\r
97                                         Log.d(TAG,"unable to serialze burndata");\r
98                                 }\r
99                         }\r
100                         initialValues.put(BURNDATA, serObj);\r
101                 }\r
102 \r
103 \r
104                 Log.d(TAG,"insertOrUpdate Motor");\r
105                 long rv = mDb.insertWithOnConflict(DATABASE_TABLE, null, initialValues,SQLiteDatabase.CONFLICT_REPLACE);\r
106                 return rv;\r
107         }\r
108 \r
109         /**\r
110          * Delete the motor and burn data with the given rowId\r
111          * \r
112          * @param name name of motor to delete\r
113          * @return true if deleted, false otherwise\r
114          */\r
115         public boolean deleteMotor(Long id) {\r
116 \r
117                 boolean rv =  mDb.delete(DATABASE_TABLE, ID + "=" + id, null) > 0;\r
118                 return rv;\r
119         }\r
120 \r
121         /**\r
122          * \r
123          * @param groupCol\r
124          * @param groupVal\r
125          * @return\r
126          */\r
127         public Cursor fetchAllInGroups( String groupCol, String groupVal ) {\r
128                 return mDb.query(DATABASE_TABLE, \r
129                                 /* columns */new String[] {\r
130                                 ID,\r
131                                 NAME,\r
132                                 DIAMETER ,\r
133                                 TOTAL_IMPULSE,\r
134                                 AVG_THRUST ,\r
135                                 MAX_THRUST ,\r
136                                 BURN_TIME ,\r
137                                 LENGTH,\r
138                                 PROP_MASS,\r
139                                 TOT_MASS,\r
140                                 CASE_INFO,\r
141                                 IMPULSE_CLASS,\r
142                                 MANUFACTURER\r
143                 },\r
144                 /* selection */groupCol + "=?",\r
145                 /* selection args*/new String[] {groupVal},\r
146                 /* groupby */null,\r
147                 /* having*/null,\r
148                 /* orderby*/ NAME );\r
149 \r
150         }\r
151 \r
152         /**\r
153          * Fetch the groups based on groupCol\r
154          * @param groupCol\r
155          * @return\r
156          */\r
157         public Cursor fetchGroups( String groupCol ) {\r
158                 return mDb.query(true, DATABASE_TABLE, \r
159                                 /* columns */new String[] {\r
160                                 groupCol\r
161                 },\r
162                 /* selection */null,\r
163                 /* selection args*/null,\r
164                 /* groupby */null,\r
165                 /* having*/null,\r
166                 /* orderby*/null,\r
167                 /* limit*/ null);\r
168 \r
169         }\r
170 \r
171         /**\r
172          * Return a Cursor over the list of all motors\r
173          * \r
174          * @return Cursor over all notes\r
175          */\r
176         public Cursor fetchAllMotors() {\r
177 \r
178                 return mDb.query(DATABASE_TABLE, \r
179                                 /* columns */new String[] {\r
180                                 ID,\r
181                                 NAME,\r
182                                 DIAMETER ,\r
183                                 TOTAL_IMPULSE,\r
184                                 AVG_THRUST ,\r
185                                 MAX_THRUST ,\r
186                                 BURN_TIME ,\r
187                                 LENGTH,\r
188                                 PROP_MASS,\r
189                                 TOT_MASS,\r
190                                 CASE_INFO,\r
191                                 IMPULSE_CLASS,\r
192                                 MANUFACTURER\r
193                 },\r
194                 /* selection */null,\r
195                 /* selection args*/null,\r
196                 /* groupby */null,\r
197                 /* having*/null,\r
198                 /* orderby*/null);\r
199         }\r
200 \r
201         public Motor fetchMotor(Long id ) throws SQLException {\r
202                 Cursor mCursor = mDb.query(DATABASE_TABLE, \r
203                                 /* columns */new String[] {\r
204                                 ID,\r
205                                 NAME ,\r
206                                 DIAMETER ,\r
207                                 TOTAL_IMPULSE ,\r
208                                 AVG_THRUST ,\r
209                                 MAX_THRUST ,\r
210                                 BURN_TIME ,\r
211                                 LENGTH,\r
212                                 PROP_MASS,\r
213                                 TOT_MASS,\r
214                                 CASE_INFO,\r
215                                 IMPULSE_CLASS,\r
216                                 MANUFACTURER,\r
217                                 BURNDATA\r
218                 },\r
219                 /* selection */ID + "="+id,\r
220                 /* selection args*/null,\r
221                 /* groupby */null,\r
222                 /* having*/null,\r
223                 /* orderby*/null);\r
224                 if ( mCursor == null ) {\r
225                         return null;\r
226                 }\r
227                 try {\r
228                         if (mCursor.getCount() == 0) {\r
229                                 return null;\r
230                         }\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
246 \r
247                         {\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
252                                         try {\r
253                                                 ObjectInputStream is = new ObjectInputStream( new ByteArrayInputStream(serObj));\r
254                                                 burndata = (Vector<Double>) is.readObject();\r
255                                         }\r
256                                         catch (Exception ex) {\r
257                                                 Log.d(TAG,"cannot deserialize burndata");\r
258                                         }\r
259                                 }\r
260                                 mi.setBurndata(burndata);\r
261                         }\r
262                         return mi;\r
263                 }\r
264                 finally {\r
265                         mCursor.close();\r
266                 }\r
267 \r
268         }\r
269 \r
270 }\r