1 package com.yuji.ef.dao;
3 import java.util.ArrayList;
6 import android.database.Cursor;
7 import android.database.SQLException;
8 import android.database.sqlite.SQLiteDatabase;
9 import android.database.sqlite.SQLiteStatement;
11 import com.yuji.ef.common.CommonUtil;
12 import com.yuji.ef.utility.Debug;
14 public class NodeDaoImpl implements IDao<Node>, NodeDao {
15 private static IDao<Node> instance = null;
16 private SQLiteStatement insertStmt = null;
17 private SQLiteStatement updateChildrenStmt = null;
18 private SQLiteStatement updateStatusStmt = null;
19 private SQLiteStatement updateNameStmt = null;
20 private SQLiteStatement updateGuidStmt = null;
21 private SQLiteStatement updateSelectedStmt = null;
22 private SQLiteStatement updateNoteFlagStmt = null;
23 private SQLiteStatement updateFlagStmt = null;
24 private SQLiteStatement updateParentStmt = null;
25 private SQLiteStatement deleteStmt = null;
26 private SQLiteStatement deleteIdStmt = null;
28 public static IDao<Node> getInstance() {
29 if (instance == null) {
30 instance = new NodeDaoImpl();
35 protected NodeDaoImpl() {
43 * com.yuji.ef.dao.NodeDao#onCreate(android.database.sqlite.SQLiteDatabase)
46 public void onCreate(SQLiteDatabase db) {
47 db.execSQL("CREATE TABLE Node (" + android.provider.BaseColumns._ID
48 + " INTEGER PRIMARY KEY AUTOINCREMENT," + "TYPE INTEGER,"
49 + "GUID TEXT," + "PARENT INTEGER," + "NAME TEXT,"
50 + "CHILDREN TEXT," + "STATUS INTEGER," + "SELECTED INTEGER,"
58 * @see com.yuji.ef.dao.NodeDao#init(android.database.sqlite.SQLiteDatabase)
61 public void init(SQLiteDatabase db) {
62 insertStmt = db.compileStatement("INSERT INTO Node (" + "TYPE,"
63 + "GUID," + "PARENT," + "NAME," + "CHILDREN," + "STATUS"
64 + ") VALUES (" + "?,?,?,?,?,?" + ");");
65 updateChildrenStmt = db
66 .compileStatement("UPDATE Node SET CHILDREN = ? WHERE "
67 + android.provider.BaseColumns._ID + " = ?");
69 .compileStatement("UPDATE Node SET STATUS = ? WHERE "
70 + android.provider.BaseColumns._ID + " = ?");
71 updateNameStmt = db.compileStatement("UPDATE Node SET NAME = ? WHERE "
72 + android.provider.BaseColumns._ID + " = ?");
74 .compileStatement("UPDATE Node SET GUID = ?, TYPE = ? WHERE "
75 + android.provider.BaseColumns._ID + " = ?");
76 updateSelectedStmt = db
77 .compileStatement("UPDATE Node SET SELECTED = ? WHERE "
78 + android.provider.BaseColumns._ID + " = ?");
79 updateNoteFlagStmt = db
80 .compileStatement("UPDATE Node SET FLAG = ? WHERE "
83 .compileStatement("UPDATE Node SET FLAG = ? WHERE "
84 + android.provider.BaseColumns._ID + " = ?");
86 .compileStatement("UPDATE Node SET PARENT = ? WHERE "
87 + android.provider.BaseColumns._ID + " = ?");
88 deleteStmt = db.compileStatement("DELETE FROM Node");
89 deleteIdStmt = db.compileStatement("DELETE FROM Node WHERE "
90 + android.provider.BaseColumns._ID + " = ?");
97 * com.yuji.ef.dao.NodeDao#start(android.database.sqlite.SQLiteDatabase)
100 public void start(SQLiteDatabase db) {
107 * @see com.yuji.ef.dao.NodeDao#search()
110 public List<Node> search() {
111 return search(DatabaseHelper.getInstance().getSQLiteDatabase(), null,
118 * @see com.yuji.ef.dao.NodeDao#searchRoot()
121 public Node searchRoot() {
122 return searchRoot(DatabaseHelper.getInstance().getSQLiteDatabase());
129 * com.yuji.ef.dao.NodeDao#searchRoot(android.database.sqlite.SQLiteDatabase
133 public Node searchRoot(SQLiteDatabase db) {
134 String selection = "TYPE = ?";
135 String[] selectionArgs = { String.valueOf(Node.TYPE_ROOT) };
136 String orderBy = null;
137 List<Node> list = search(db, selection, selectionArgs, orderBy);
138 if (list.size() <= 0) {
145 public List<Node> searchNote() {
146 return searchNote(DatabaseHelper.getInstance().getSQLiteDatabase());
150 public List<Node> searchNote(SQLiteDatabase db) {
151 String selection = "TYPE = ?";
152 String[] selectionArgs = { String.valueOf(Node.TYPE_NOTE) };
153 String orderBy = null;
154 List<Node> list = search(db, selection, selectionArgs, orderBy);
159 public List<Node> searchBook() {
160 return searchBook(DatabaseHelper.getInstance().getSQLiteDatabase());
164 public List<Node> searchBook(SQLiteDatabase db) {
165 String selection = "TYPE = ?";
166 String[] selectionArgs = { String.valueOf(Node.TYPE_BOOK) };
167 String orderBy = "NAME";;
168 List<Node> list = search(db, selection, selectionArgs, orderBy);
173 public List<Node> searchSelectedBook() {
174 return searchSelectedBook(DatabaseHelper.getInstance()
175 .getSQLiteDatabase());
179 public List<Node> searchSelectedBook(SQLiteDatabase db) {
180 String selection = "TYPE = ? AND SELECTED = ?";
181 String[] selectionArgs = { String.valueOf(Node.TYPE_BOOK), "1" };
182 String orderBy = null;
183 List<Node> list = search(db, selection, selectionArgs, orderBy);
188 public List<Node> searchNoteByFlag(int flag) {
189 return searchNoteByFlag(DatabaseHelper.getInstance()
190 .getSQLiteDatabase(), flag);
194 public List<Node> searchNoteByFlag(SQLiteDatabase db, int flag) {
195 String selection = "TYPE = ? AND FLAG = ?";
196 String[] selectionArgs = { String.valueOf(Node.TYPE_NOTE),
197 String.valueOf(flag) };
198 String orderBy = null;
199 List<Node> list = search(db, selection, selectionArgs, orderBy);
206 * @see com.yuji.ef.dao.NodeDao#searchById(long)
209 public Node searchById(long id) {
210 return searchById(DatabaseHelper.getInstance().getSQLiteDatabase(), id);
217 * com.yuji.ef.dao.NodeDao#searchById(android.database.sqlite.SQLiteDatabase
221 public Node searchById(SQLiteDatabase db, long id) {
222 String selection = android.provider.BaseColumns._ID + " = ?";
223 String[] selectionArgs = { String.valueOf(id) };
224 String orderBy = null;
225 List<Node> list = search(db, selection, selectionArgs, orderBy);
226 if (list.size() <= 0) {
236 * com.yuji.ef.dao.NodeDao#searchByGuid(android.database.sqlite.SQLiteDatabase
237 * , java.lang.String)
240 public Node searchByGuid(SQLiteDatabase db, String guid) {
241 String selection = "GUID = ?";
242 String[] selectionArgs = { guid };
243 String orderBy = null;
244 List<Node> list = search(db, selection, selectionArgs, orderBy);
245 if (list.size() <= 0) {
251 private List<Node> search(SQLiteDatabase db, String selection,
252 String[] selectionArgs, String orderBy) {
253 List<Node> list = new ArrayList<Node>();
254 Cursor cursor = null;
256 NodeFactory factory = NodeFactory.getInstance();
258 cursor = db.query("Node", new String[] {
259 android.provider.BaseColumns._ID, "TYPE", "GUID", "PARENT",
260 "NAME", "CHILDREN", "STATUS", "SELECTED" }, selection,
261 selectionArgs, null, null, orderBy);
262 cursor.moveToFirst();
263 int size = cursor.getCount();
264 for (int i = 0; i < size; i++) {
266 // Node Node = new Node(
267 // cursor.getLong(0),
268 // cursor.getString(1),
269 // cursor.getString(2),
270 // cursor.getLong(3),
271 // cursor.getLong(4));
272 Node node = factory.create(cursor.getLong(0), cursor.getInt(1),
273 cursor.getString(2), cursor.getLong(3),
274 cursor.getString(4), cursor.getString(5),
275 cursor.getInt(6), (cursor.getInt(7) != 0));
279 } catch (SQLException e) {
280 Debug.d(this, null, e);
282 } catch (Exception e) {
283 Debug.d(this, null, e);
286 if (cursor != null) {
297 * @see com.yuji.ef.dao.NodeDao#isEmpty()
300 public boolean isEmpty() {
301 // List<Node> list = search();
302 // return list == null || list.size() <= 0;
303 return this.searchRoot() == null;
309 * @see com.yuji.ef.dao.NodeDao#add(com.yuji.ef.dao.Node)
312 public long add(Node node) {
313 DatabaseHelper helper = DatabaseHelper.getInstance();
314 SQLiteDatabase db = helper.getWritableDatabase();
315 return add(db, node);
318 private long add(SQLiteDatabase db, Node node) {
320 db.beginTransaction();
323 db.setTransactionSuccessful();
333 * @see com.yuji.ef.dao.NodeDao#addNT(com.yuji.ef.dao.Node)
336 public long addNT(Node node) {
339 SQLiteStatement stmt = insertStmt;
340 stmt.bindLong(i++, node.getType());
341 stmt.bindString(i++, CommonUtil.nz(node.getGuid()));
342 stmt.bindLong(i++, node.getParent());
343 stmt.bindString(i++, node.getName());
344 stmt.bindString(i++, CommonUtil.nz(node.getChildrenString()));
345 stmt.bindLong(i++, Node.getStatusCode(node.getStatus()));
346 id = stmt.executeInsert();
353 * @see com.yuji.ef.dao.NodeDao#addChildrenId(com.yuji.ef.dao.Node, long)
356 public long addChildrenId(Node node, long id) {
357 DatabaseHelper helper = DatabaseHelper.getInstance();
358 SQLiteDatabase db = helper.getWritableDatabase();
359 return addChildrenId(db, node, id);
362 private long addChildrenId(SQLiteDatabase db, Node node, long aid) {
364 db.beginTransaction();
366 id = addChildrenIdNT(node, aid);
367 db.setTransactionSuccessful();
377 * @see com.yuji.ef.dao.NodeDao#addChildrenIdNT(com.yuji.ef.dao.Node, long)
380 public long addChildrenIdNT(Node node, long id) {
381 List<Long> l = node.getChildren();
382 if (l.contains(id)) {
387 return updateChildrenNT(node, Node.concatChildren(l));
393 * @see com.yuji.ef.dao.NodeDao#updateChildrenNT(com.yuji.ef.dao.Node,
397 public long updateChildrenNT(Node node, String children) {
400 SQLiteStatement stmt = updateChildrenStmt;
401 //stmt.bindString(i++, node.getChildrenString());
402 stmt.bindString(i++, children);
403 stmt.bindLong(i++, node.getId());
404 id = stmt.executeInsert();
411 * @see com.yuji.ef.dao.NodeDao#remoteChildrenId(com.yuji.ef.dao.Node, long)
414 public long removeChildrenId(Node node, long id) {
415 DatabaseHelper helper = DatabaseHelper.getInstance();
416 SQLiteDatabase db = helper.getWritableDatabase();
417 return remoteChildrenId(db, node, id);
420 private long remoteChildrenId(SQLiteDatabase db, Node node, long aid) {
422 db.beginTransaction();
424 id = removeChildrenIdNT(node, aid);
425 db.setTransactionSuccessful();
435 * @see com.yuji.ef.dao.NodeDao#remoteChildrenIdNT(com.yuji.ef.dao.Node,
439 public long removeChildrenIdNT(Node node, long id) {
440 List<Long> l = node.getChildren();
441 if (!l.contains(id)) {
446 return updateChildrenNT(node, Node.concatChildren(l));
452 * @see com.yuji.ef.dao.NodeDao#updateStatus(com.yuji.ef.dao.Node,
453 * com.yuji.ef.dao.Node.Status)
456 public long updateStatus(Node node, Node.Status status) {
457 return updateStatus(DatabaseHelper.getInstance().getSQLiteDatabase(),
465 * com.yuji.ef.dao.NodeDao#updateStatus(android.database.sqlite.SQLiteDatabase
466 * , com.yuji.ef.dao.Node, com.yuji.ef.dao.Node.Status)
469 public long updateStatus(SQLiteDatabase db, Node node, Node.Status status) {
472 db.beginTransaction();
474 id = updateStatusNT(node, status);
475 db.setTransactionSuccessful();
485 * @see com.yuji.ef.dao.NodeDao#updateStatusNT(com.yuji.ef.dao.Node,
486 * com.yuji.ef.dao.Node.Status)
489 public long updateStatusNT(Node node, Node.Status status) {
492 int code = Node.getStatusCode(status);
494 SQLiteStatement stmt = updateStatusStmt;
495 stmt.bindLong(i++, code);
496 stmt.bindLong(i++, node.getId());
497 id = stmt.executeInsert();
504 * @see com.yuji.ef.dao.NodeDao#updateName(com.yuji.ef.dao.Node,
508 public long updateName(Node node, String name) {
509 return updateName(DatabaseHelper.getInstance().getSQLiteDatabase(),
517 * com.yuji.ef.dao.NodeDao#updateName(android.database.sqlite.SQLiteDatabase
518 * , com.yuji.ef.dao.Node, java.lang.String)
521 public long updateName(SQLiteDatabase db, Node node, String name) {
524 db.beginTransaction();
526 id = updateNameNT(node, name);
527 db.setTransactionSuccessful();
537 * @see com.yuji.ef.dao.NodeDao#updateNameNT(com.yuji.ef.dao.Node,
541 public long updateNameNT(Node node, String name) {
545 SQLiteStatement stmt = updateNameStmt;
546 stmt.bindString(i++, name);
547 stmt.bindLong(i++, node.getId());
548 id = stmt.executeInsert();
553 public long updateGuid(Node node, String guid) {
554 return updateGuid(DatabaseHelper.getInstance().getSQLiteDatabase(),
559 public long updateGuid(SQLiteDatabase db, Node node, String guid) {
562 db.beginTransaction();
564 id = updateGuid(node, guid);
565 db.setTransactionSuccessful();
573 public long updateGuidNT(Node node, String guid) {
577 SQLiteStatement stmt = updateGuidStmt;
578 if (CommonUtil.isNull(guid)) {
580 stmt.bindLong(i++, (node instanceof FileNode) ? Node.TYPE_NOTE
583 stmt.bindString(i++, guid);
584 stmt.bindLong(i++, (node instanceof FileNode) ? Node.TYPE_NOTE
587 stmt.bindLong(i++, node.getId());
588 id = stmt.executeInsert();
593 public long updateSelected(Node node, boolean isSelected) {
594 return updateSelected(DatabaseHelper.getInstance().getSQLiteDatabase(),
599 public long updateSelected(SQLiteDatabase db, Node node, boolean isSelected) {
602 db.beginTransaction();
604 id = updateSelectedNT(node, isSelected);
605 db.setTransactionSuccessful();
613 public long updateSelectedNT(Node node, boolean isSelected) {
617 SQLiteStatement stmt = updateSelectedStmt;
618 stmt.bindLong(i++, isSelected ? 1 : 0);
619 stmt.bindLong(i++, node.getId());
620 id = stmt.executeInsert();
627 * @see com.yuji.ef.dao.NodeDao#updateParent(com.yuji.ef.dao.Node, long)
630 public long updateParent(Node node, long parent) {
631 return updateParent(DatabaseHelper.getInstance().getSQLiteDatabase(),
639 * com.yuji.ef.dao.NodeDao#updateParent(android.database.sqlite.SQLiteDatabase
640 * , com.yuji.ef.dao.Node, long)
643 public long updateParent(SQLiteDatabase db, Node node, long parent) {
646 db.beginTransaction();
648 id = updateParentNT(node, parent);
649 db.setTransactionSuccessful();
659 * @see com.yuji.ef.dao.NodeDao#updateParentNT(com.yuji.ef.dao.Node, long)
662 public long updateParentNT(Node node, long parent) {
666 SQLiteStatement stmt = updateParentStmt;
667 stmt.bindLong(i++, parent);
668 stmt.bindLong(i++, node.getId());
669 id = stmt.executeInsert();
674 public long updateNoteFlag(int flag) {
675 return updateNoteFlag(DatabaseHelper.getInstance().getSQLiteDatabase(),
680 public long updateNoteFlag(SQLiteDatabase db, int flag) {
683 db.beginTransaction();
685 id = updateNoteFlagNT(flag);
686 db.setTransactionSuccessful();
694 public long updateNoteFlagNT(int flag) {
698 SQLiteStatement stmt = updateNoteFlagStmt;
699 stmt.bindLong(i++, flag);
700 stmt.bindLong(i++, Node.TYPE_NOTE);
701 id = stmt.executeInsert();
706 public long updateFlag(Node node, int flag) {
707 return updateFlag(DatabaseHelper.getInstance().getSQLiteDatabase(),
712 public long updateFlag(SQLiteDatabase db, Node node, int flag) {
715 db.beginTransaction();
717 id = updateFlagNT(node, flag);
718 db.setTransactionSuccessful();
726 public long updateFlagNT(Node node, int flag) {
730 SQLiteStatement stmt = updateFlagStmt;
731 stmt.bindLong(i++, flag);
732 stmt.bindLong(i++, node.getId());
733 id = stmt.executeInsert();
740 * @see com.yuji.ef.dao.NodeDao#updateChildren(com.yuji.ef.dao.Node,
744 public long updateChildren(Node node, String children) {
745 DatabaseHelper helper = DatabaseHelper.getInstance();
746 SQLiteDatabase db = helper.getWritableDatabase();
747 return updateChildren(db, node, children);
750 private long updateChildren(SQLiteDatabase db, Node node, String children) {
752 db.beginTransaction();
754 id = updateChildrenNT(node, children);
755 db.setTransactionSuccessful();
765 * @see com.yuji.ef.dao.NodeDao#delete(long)
768 public long delete(long id) {
769 DatabaseHelper helper = DatabaseHelper.getInstance();
770 SQLiteDatabase db = helper.getWritableDatabase();
771 return delete(db, id);
778 * com.yuji.ef.dao.NodeDao#delete(android.database.sqlite.SQLiteDatabase,
782 public long delete(SQLiteDatabase db, long did) {
785 db.beginTransaction();
788 db.setTransactionSuccessful();
798 * @see com.yuji.ef.dao.NodeDao#deleteNT(long)
801 public long deleteNT(long did) {
802 long id = -1; // TODO
805 SQLiteStatement stmt = deleteIdStmt;
806 stmt.bindLong(i++, did);
814 * @see com.yuji.ef.dao.NodeDao#delete()
817 public long delete() {
818 DatabaseHelper helper = DatabaseHelper.getInstance();
819 SQLiteDatabase db = helper.getWritableDatabase();
827 * com.yuji.ef.dao.NodeDao#delete(android.database.sqlite.SQLiteDatabase)
830 public long delete(SQLiteDatabase db) {
833 db.beginTransaction();
836 db.setTransactionSuccessful();
846 * @see com.yuji.ef.dao.NodeDao#deleteNT()
849 public void deleteNT() {
850 SQLiteStatement stmt = deleteStmt;