3 import java.io.ByteArrayOutputStream;
\r
4 import java.io.IOException;
\r
5 import java.io.InputStream;
\r
6 import java.util.ArrayList;
\r
7 import java.util.List;
\r
9 import android.content.ContentValues;
\r
10 import android.content.Context;
\r
11 import android.database.Cursor;
\r
12 import android.database.SQLException;
\r
13 import android.database.sqlite.SQLiteDatabase;
\r
14 import android.database.sqlite.SQLiteStatement;
\r
16 import com.jm.JmPattern;
\r
18 import com.jm.common.Constant;
\r
19 import com.jm.pref.EditPrefUtil;
\r
20 import com.jm.utility.Debug;
\r
21 import com.jm.utility.JmException;
\r
23 public class Dao implements IDao<SQLiteDatabase> {
\r
24 private static Dao instance = new Dao();
\r
25 private SQLiteStatement insertStmt = null;
\r
26 private SQLiteStatement updateStmt = null;
\r
27 private SQLiteStatement deleteStmt = null;
\r
28 private SQLiteStatement patternFileDeleteStmt = null;
\r
30 private Context context;
\r
32 public static Dao getInstance() {
\r
40 public void setContext(Context context) {
\r
41 this.context = context;
\r
44 public void init(SQLiteDatabase db, Context context) {
\r
45 this.context = context;
\r
47 db.execSQL("create table pattern (" + "id integer primary key, "
\r
48 + "type integer not null, " + "siteswap text not null, "
\r
49 + "height integer, " + "dwell integer, " + "name integer, "
\r
50 + "motion text," + "lang integer," + "idx integer);");
\r
53 initData2to3(db, context);
\r
56 public void initData2to3(SQLiteDatabase db, Context context) {
\r
58 id = initPatternList(db, "pattern.jm", false);
\r
59 initPatternList(db, "pattern_ja.jm", false);
\r
61 EditPrefUtil pref = new EditPrefUtil(context);
\r
62 pref.put(Constant.PREF_SELECTED_PATTERN_INDEX, id);
\r
66 public void init2to3(SQLiteDatabase db) {
\r
67 db.execSQL("create table pattern_file ("
\r
68 + android.provider.BaseColumns._ID
\r
69 + " integer primary key autoincrement, "
\r
70 + "name text not null, " + "value blob not null, "
\r
71 + "iswritable integer not null);");
\r
74 public void start(SQLiteDatabase db) {
\r
75 insertStmt = db.compileStatement("insert into pattern ("
\r
76 + "type, siteswap, height, dwell, name, motion, lang, idx"
\r
77 + ") values (" + "?, ?, ?, ?, ?, ?, ?, ?" + ");");
\r
78 updateStmt = db.compileStatement("update pattern set "
\r
79 + "siteswap = ?, height = ?, dwell = ?, name = ?, motion = ? "
\r
80 + "where id = ? and lang = ?;");
\r
82 .compileStatement("delete from pattern where id = ? and lang = ?;");
\r
83 patternFileDeleteStmt = db
\r
84 .compileStatement("delete from pattern_file where "
\r
85 + android.provider.BaseColumns._ID + " = ?;");
\r
88 public void add(JmPattern jp, int index) throws JmException {
\r
89 DatabaseHelper helper = DatabaseHelper.getInstance();
\r
90 add(jp, helper.getLangId(), index);
\r
93 public void addNT(JmPattern jp, int index) throws JmException {
\r
94 DatabaseHelper helper = DatabaseHelper.getInstance();
\r
95 addNT(jp, helper.getLangId(), index);
\r
98 public void add(JmPattern jp, int lang, int index) throws JmException {
\r
99 DatabaseHelper helper = DatabaseHelper.getInstance();
\r
100 SQLiteDatabase db = helper.getWritableDatabase();
\r
101 db.beginTransaction();
\r
104 SQLiteStatement stmt = insertStmt;
\r
105 stmt.bindLong(i++, jp.getType());
\r
106 stmt.bindString(i++, jp.getSiteSwap().toString());
\r
107 stmt.bindLong(i++, jp.getHeight());
\r
108 stmt.bindLong(i++, jp.getDwell());
\r
109 stmt.bindString(i++, jp.getName());
\r
110 stmt.bindString(i++, jp.motionToString());
\r
111 stmt.bindLong(i++, lang);
\r
112 stmt.bindLong(i++, index);
\r
113 stmt.executeInsert();
\r
114 db.setTransactionSuccessful();
\r
115 } catch (SQLException e) {
\r
116 throw new JmException(e);
\r
118 db.endTransaction();
\r
122 public void addNT(JmPattern jp, int lang, int index) throws JmException {
\r
125 SQLiteStatement stmt = insertStmt;
\r
126 stmt.bindLong(i++, jp.getType());
\r
127 stmt.bindString(i++, jp.getSiteSwap().toString());
\r
128 stmt.bindLong(i++, jp.getHeight());
\r
129 stmt.bindLong(i++, jp.getDwell());
\r
130 stmt.bindString(i++, jp.getName());
\r
131 stmt.bindString(i++, jp.motionToString());
\r
132 stmt.bindLong(i++, lang);
\r
133 stmt.bindLong(i++, index);
\r
134 stmt.executeInsert();
\r
135 } catch (SQLException e) {
\r
136 throw new JmException(e);
\r
140 public void set(JmPattern jp) throws JmException {
\r
141 DatabaseHelper helper = DatabaseHelper.getInstance();
\r
142 SQLiteDatabase db = helper.getWritableDatabase();
\r
143 db.beginTransaction();
\r
146 SQLiteStatement stmt = updateStmt;
\r
147 stmt.bindString(i++, jp.getSiteSwap().toString());
\r
148 stmt.bindLong(i++, jp.getHeight());
\r
149 stmt.bindLong(i++, jp.getDwell());
\r
150 stmt.bindString(i++, jp.getName());
\r
151 stmt.bindString(i++, jp.motionToString());
\r
152 stmt.bindLong(i++, jp.getId());
\r
153 stmt.bindLong(i++, helper.getLangId());
\r
155 db.setTransactionSuccessful();
\r
156 } catch (SQLException e) {
\r
157 throw new JmException(e);
\r
159 db.endTransaction();
\r
163 public void delete(int id) throws JmException {
\r
164 DatabaseHelper helper = DatabaseHelper.getInstance();
\r
165 SQLiteDatabase db = helper.getWritableDatabase();
\r
166 db.beginTransaction();
\r
169 SQLiteStatement stmt = deleteStmt;
\r
170 stmt.bindLong(i++, id);
\r
171 stmt.bindLong(i++, helper.getLangId());
\r
173 db.setTransactionSuccessful();
\r
174 } catch (SQLException e) {
\r
175 throw new JmException(e);
\r
177 db.endTransaction();
\r
181 public JmPattern[] get(int type) throws JmException {
\r
182 JmPattern[] list = null;
\r
184 DatabaseHelper helper = DatabaseHelper.getInstance();
\r
185 SQLiteDatabase db = helper.getReadableDatabase();
\r
186 list = get(db, type);
\r
187 } catch (SQLException e) {
\r
188 throw new JmException(e);
\r
193 public JmPattern[] get(SQLiteDatabase db, int type) throws JmException {
\r
194 DatabaseHelper helper = DatabaseHelper.getInstance();
\r
195 String selection = "lang = " + helper.getLangId() + " and type = "
\r
197 String orderBy = "idx";
\r
198 return get(db, selection, orderBy);
\r
201 public JmPattern[] get(SQLiteDatabase db, String selection, String orderBy)
\r
202 throws JmException {
\r
203 //DatabaseHelper helper = DatabaseHelper.getInstance();
\r
204 JmPattern[] list = null;
\r
205 Cursor c = db.query("pattern", new String[] { "id", "type", "siteswap",
\r
206 "height", "dwell", "name", "motion" }, selection, null, null,
\r
209 list = new JmPattern[c.getCount()];
\r
210 for (int i = 0; i < list.length; i++) {
\r
211 JmPattern jp = new JmPattern(c.getInt(0), // id
\r
212 c.getInt(1), // type
\r
213 c.getString(5), // name
\r
214 c.getString(2), // siteswap
\r
215 c.getInt(3), // height
\r
216 c.getInt(4), // dwell
\r
217 JmPattern.getMotion(c.getString(6))); // motions
\r
225 public JmPattern[] getFromId(long id) throws JmException {
\r
226 JmPattern[] list = null;
\r
228 DatabaseHelper helper = DatabaseHelper.getInstance();
\r
229 SQLiteDatabase db = helper.getReadableDatabase();
\r
230 String selection = "id = " + id + " and lang = "
\r
231 + helper.getLangId();
\r
232 Cursor c = db.query("pattern", new String[] { "id", "type",
\r
233 "siteswap", "height", "dwell", "name", "motion" },
\r
234 selection, null, null, null, null);
\r
236 list = new JmPattern[c.getCount()];
\r
237 for (int i = 0; i < list.length; i++) {
\r
238 JmPattern jp = new JmPattern(c.getInt(0), // id
\r
239 c.getInt(1), // type
\r
240 c.getString(5), // name
\r
241 c.getString(2), // siteswap
\r
242 c.getInt(3), // height
\r
243 c.getInt(4), // dwell
\r
244 JmPattern.getMotion(c.getString(6))); // motions
\r
249 } catch (SQLException e) {
\r
250 throw new JmException(e);
\r
255 public int max(int type) throws JmException {
\r
258 DatabaseHelper helper = DatabaseHelper.getInstance();
\r
259 SQLiteDatabase db = helper.getReadableDatabase();
\r
260 String sql = "select max(idx) from pattern where type = " + type
\r
261 + " and lang = " + helper.getLangId();
\r
262 Cursor c = db.rawQuery(sql, null);
\r
266 } catch (SQLException e) {
\r
267 throw new JmException(e);
\r
272 public int countAll() throws JmException {
\r
275 DatabaseHelper helper = DatabaseHelper.getInstance();
\r
276 SQLiteDatabase db = helper.getReadableDatabase();
\r
277 String sql = "select count(*) from pattern;";
\r
278 Cursor c = db.rawQuery(sql, null);
\r
280 count = c.getInt(0); // count;
\r
282 } catch (SQLException e) {
\r
283 throw new JmException(e);
\r
288 public int count() throws JmException {
\r
291 DatabaseHelper helper = DatabaseHelper.getInstance();
\r
292 SQLiteDatabase db = helper.getReadableDatabase();
\r
293 String sql = "select count(*) from pattern where lang = "
\r
294 + helper.getLangId() + ";";
\r
295 Cursor c = db.rawQuery(sql, null);
\r
297 count = c.getInt(0); // count;
\r
299 } catch (SQLException e) {
\r
300 throw new JmException(e);
\r
305 public int count(int type) throws JmException {
\r
308 DatabaseHelper helper = DatabaseHelper.getInstance();
\r
309 SQLiteDatabase db = helper.getReadableDatabase();
\r
310 String sql = "select count(*) from pattern where type = " + type
\r
311 + " and lang = " + helper.getLangId() + ";";
\r
312 Cursor c = db.rawQuery(sql, null);
\r
314 count = c.getInt(0); // count;
\r
316 } catch (SQLException e) {
\r
317 throw new JmException(e);
\r
322 public PatternFile getPatternFile(long id) {
\r
323 DatabaseHelper helper = DatabaseHelper.getInstance();
\r
324 SQLiteDatabase db = helper.getReadableDatabase();
\r
326 String selection = android.provider.BaseColumns._ID + " = ?";
\r
327 String[] selectionArgs = { String.valueOf(id) };
\r
328 String orderBy = null;
\r
329 List<PatternFile> list = getPatternFile(db, selection, selectionArgs,
\r
331 if (list.size() <= 0) {
\r
334 return list.get(0);
\r
337 public List<PatternFile> getPatternFile() {
\r
338 DatabaseHelper helper = DatabaseHelper.getInstance();
\r
339 SQLiteDatabase db = helper.getReadableDatabase();
\r
340 String orderBy = "name";
\r
341 return getPatternFile(db, null, null, orderBy, false);
\r
344 public List<PatternFile> getPatternFile(SQLiteDatabase db) {
\r
345 return getPatternFile(db, null, null, null, false);
\r
348 private List<PatternFile> getPatternFile(SQLiteDatabase db,
\r
349 String selection, String[] selectionArgs, String orderBy,
\r
351 List<PatternFile> list = new ArrayList<PatternFile>();
\r
352 Cursor cursor = null;
\r
354 cursor = db.query("pattern_file", new String[] {
\r
355 android.provider.BaseColumns._ID, "name", "value",
\r
356 "iswritable" }, selection, selectionArgs, null, null,
\r
358 int size = cursor.getCount();
\r
360 cursor.moveToFirst();
\r
362 for (int i = 0; i < size; i++) {
\r
363 PatternFile pf = new PatternFile(cursor.getLong(0),
\r
364 cursor.getString(1), (isBlob) ? cursor.getBlob(2)
\r
365 : null, cursor.getInt(3) != 0);
\r
367 cursor.moveToNext();
\r
369 } catch (SQLException e) {
\r
370 Debug.d(this, null, e);
\r
372 } catch (Exception e) {
\r
373 Debug.d(this, null, e);
\r
376 if (cursor != null) {
\r
384 // public PatternFile[] getPatternFile(SQLiteDatabase db) throws JmException
\r
386 // String selection = null;
\r
387 // String orderBy = "name";
\r
388 // return getPatternFile(db, selection, orderBy);
\r
391 // public PatternFile[] getPatternFile(SQLiteDatabase db, String selection,
\r
392 // String orderBy) throws JmException {
\r
393 // PatternFile[] list = null;
\r
394 // Cursor c = db.query("pattern_file", new String[] { "id", "name" },
\r
395 // selection, null, null, null, orderBy);
\r
396 // c.moveToFirst();
\r
397 // list = new PatternFile[c.getCount()];
\r
398 // for (int i = 0; i < list.length; i++) {
\r
399 // PatternFile pf = new PatternFile(c.getInt(0), // id
\r
400 // c.getString(1)); // name
\r
408 // public PatternFile getPatternFile(long id) {
\r
409 // String selection = android.provider.BaseColumns._ID + " = ?";
\r
410 // String[] selectionArgs = { String.valueOf(id) };
\r
411 // String orderBy = null;
\r
412 // List<PatternFile> list = getPatternFile(selection, selectionArgs,
\r
414 // if (list.size() <= 0) {
\r
417 // return list.get(0);
\r
420 public long addPatternFile(String name, byte[] blob, boolean isWritable) {
\r
421 DatabaseHelper helper = DatabaseHelper.getInstance();
\r
422 SQLiteDatabase db = helper.getWritableDatabase();
\r
423 return addPatternFile(db, name, blob, isWritable);
\r
426 public long addPatternFile(SQLiteDatabase db, String name, byte[] blob,
\r
427 boolean isWritable) {
\r
428 ContentValues values = new ContentValues();
\r
429 values.put("name", name);
\r
430 values.put("value", blob);
\r
431 values.put("iswritable", isWritable ? 1 : 0);
\r
433 return db.insert("pattern_file", null, values);
\r
436 public void deletePatternFile(long id) throws JmException {
\r
437 DatabaseHelper helper = DatabaseHelper.getInstance();
\r
438 SQLiteDatabase db = helper.getWritableDatabase();
\r
439 db.beginTransaction();
\r
442 SQLiteStatement stmt = patternFileDeleteStmt;
\r
443 stmt.bindLong(i++, id);
\r
445 db.setTransactionSuccessful();
\r
446 } catch (SQLException e) {
\r
447 throw new JmException(e);
\r
449 db.endTransaction();
\r
453 public String[] getMenu() {
\r
454 String[] list = { context.getString(R.string.list0_1),
\r
455 context.getString(R.string.list0_2),
\r
456 context.getString(R.string.list0_3),
\r
457 context.getString(R.string.list0_4),
\r
458 context.getString(R.string.list0_5),
\r
459 context.getString(R.string.list0_6),
\r
460 context.getString(R.string.list0_7),
\r
461 context.getString(R.string.list0_8) };
\r
466 public long initPatternList(SQLiteDatabase db, String filename,
\r
467 boolean isWritable) {
\r
468 InputStream is = null;
\r
470 is = getClass().getClassLoader().getResourceAsStream(filename);
\r
471 return insertPatternList(db, is, filename, isWritable);
\r
476 } catch (IOException e) {
\r
477 Debug.d(this, e.getMessage());
\r
484 public long insertPatternList(InputStream is, String name,
\r
485 boolean isWritable) {
\r
486 DatabaseHelper helper = DatabaseHelper.getInstance();
\r
487 SQLiteDatabase db = helper.getWritableDatabase();
\r
488 return insertPatternList(db, is, name, isWritable);
\r
491 public long insertPatternList(SQLiteDatabase db, InputStream is,
\r
492 String name, boolean isWritable) {
\r
495 byte[] b = toByteArray(is);
\r
499 Dao dao = Dao.getInstance();
\r
500 id = dao.addPatternFile(db, name, b, isWritable);
\r
507 private void close(InputStream is) {
\r
511 } catch (IOException e) {
\r
512 Debug.d(this, e.getMessage());
\r
517 private byte[] toByteArray(InputStream inputStream) {
\r
518 ByteArrayOutputStream bout = new ByteArrayOutputStream();
\r
519 byte[] buffer = new byte[1024];
\r
523 len = inputStream.read(buffer);
\r
527 bout.write(buffer, 0, len);
\r
529 return bout.toByteArray();
\r
530 } catch (IOException e) {
\r
531 Debug.d(this, e.getMessage());
\r
537 public boolean isWritable() {
\r