拖了這麼久才能寫下篇,主要是最近在忙着複習算法和操做系統的知識(立刻要工做了,仍是要要多鍛鍊一下內功),好,話很少說,先貼出上篇Android數據庫操做(上)上次代碼寫到CursorWrapper類,這個類的構造函數接受的參數是一個Cursor,還記得Cursor是什麼吧?其實也相似於java中的迭代模式。這裏我把全部完成的代碼都傳到github上了,包含我前面幾篇文章的全部代碼,基本上是一個能夠用的記錄筆記的小軟件。你們能夠對照着學習。代碼在這裏java
1.使用CursorWrapper
建立一個類以下:node
public class NoteCursorWrapper extends CursorWrapper { public NoteCursorWrapper(Cursor cursor){ super(cursor); } }
咱們把Cursor傳給它的構造函數,而後調用一下父類的構造方法。想了解細節的同窗能夠去看一下CursorWrapper的源碼。下面重點來了,看代碼:git
public class NoteCursorWrapper extends CursorWrapper { public NoteCursorWrapper(Cursor cursor){ super(cursor); } public Note getNote(){ String uuidString = getString(getColumnIndex(NoteDbScheme.NoteTable.Cols.UUID)); String title = getString(getColumnIndex(NoteDbScheme.NoteTable.Cols.TITLE)); String content = getString(getColumnIndex(NoteDbScheme.NoteTable.Cols.CONTENT)); String tag = getString(getColumnIndex(NoteDbScheme.NoteTable.Cols.TAG)); long date = getLong(getColumnIndex(NoteDbScheme.NoteTable.Cols.DATE)); Note note = new Note(UUID.fromString(uuidString)); note.setTitle(title); note.setContent(content); note.setTag(tag); note.setDate(new Date(date)); return note; } }
代碼看着是否是很清爽,先用getString或者getLong方法從數據庫中取出對應的值,而後再組裝成Note型返回。爲何寫得這麼簡單?由於咱們把Cursor傳遞給CursorWrapper構造方法了,它爲咱們作了不少額外工做。
2.修改getNode方法
準備工做都差很少作好了,如今咱們修改以前的getNode方法,查出給定uuid的記錄:github
public Note getNote(UUID uuid){ // for (Note note : notes){ // if (note.getUuid().equals(uuid)){ // return note; // } // } // return null; NoteCursorWrapper cursorWrapper = queryNote(NoteDbScheme.NoteTable.Cols.UUID+"=?",new String[]{uuid.toString()}); try { if (cursorWrapper.getCount() == 0){ return null; } cursorWrapper.moveToFirst(); return cursorWrapper.getNote(); }finally { cursorWrapper.close(); } }
注意queryNote中參數的寫法等同於sql語句中的where,細節在於那個問號,這是防止sql注入的好習慣。第二個須要注意的地方就是要記得執行 cursorWrapper.close方法。算法
3.修改getNotes方法
除了查出給定uuid的字段,一般咱們還須要查出數據庫裏存在的全部的記錄,全部的方法和上面的相似,把條件設置成null就行了。好看代碼:sql
public ArrayList<Note> getNotes() { // return notes; ArrayList<Note> nodes = new ArrayList<>(); NoteCursorWrapper wrapper = queryNote(null,null); try{ wrapper.moveToFirst(); while (!wrapper.isAfterLast()){ nodes.add(wrapper.getNote()); wrapper.moveToFirst(); } }finally { wrapper.close(); } return nodes; }
結合上面一段代碼,咱們應該能體會到CursorWrapper類是怎麼用的,去複習一下java的迭代模式也很容易理解。 這裏給出完整的代碼:數據庫
public class NoteLab { private static NoteLab sNoteLab; //for the global use // private ArrayList<Note> notes; private Context context; private SQLiteDatabase database; private NoteLab(Context c){ // notes = new ArrayList<Note>(); this.context = c; database = new NoteBaseHelper(context).getWritableDatabase(); //generate 100 Note Objects // for (int i=0;i<100;i++){ // Note note = new Note(); // note.setTitle("this is title "+i); // note.setContent("this is content "+i+"balabalabalabalalabalabalabalabalala\nbalabalabalabalalabalabalabalabalala\nbalabalabalabalalabalabalabalabalala\nbalabalabalabalalabalabalabalabalala\nbalabalabalabalalabalabalabalabalala\n"); // notes.add(note); // } } public static NoteLab getNoteLab(Context context){ if (sNoteLab == null){ sNoteLab = new NoteLab(context); } return sNoteLab; } public ArrayList<Note> getNotes() { // return notes; ArrayList<Note> notes = new ArrayList<Note>(); NoteCursorWrapper wrapper = queryNote(null,null); try{ wrapper.moveToFirst(); while (!wrapper.isAfterLast()){ notes.add(wrapper.getNote()); wrapper.moveToNext(); } }finally { wrapper.close(); } return notes; } public void addNote(Note note){ // notes.add(note); ContentValues values = getValues(note); database.insert(NoteDbScheme.NoteTable.name,null,values); } public Note getNote(UUID uuid){ // for (Note note : notes){ // if (note.getUuid().equals(uuid)){ // return note; // } // } // return null; NoteCursorWrapper cursorWrapper = queryNote(NoteDbScheme.NoteTable.Cols.UUID+"=?",new String[]{uuid.toString()}); try { if (cursorWrapper.getCount() == 0){ return null; } cursorWrapper.moveToFirst(); return cursorWrapper.getNote(); }finally { cursorWrapper.close(); } } private ContentValues getValues(Note note){ ContentValues values = new ContentValues(); values.put(NoteDbScheme.NoteTable.Cols.UUID,note.getUuid().toString()); values.put(NoteDbScheme.NoteTable.Cols.TITLE,note.getTitle()); values.put(NoteDbScheme.NoteTable.Cols.CONTENT,note.getContent()); values.put(NoteDbScheme.NoteTable.Cols.DATE,note.getDate().toString()); values.put(NoteDbScheme.NoteTable.Cols.TAG,note.getTag()); return values; } private NoteCursorWrapper queryNote(String whereClause, String[] whereArgs){ Cursor cursor = database.query( NoteDbScheme.NoteTable.name, null, whereClause, whereArgs, null, null, null ); return new NoteCursorWrapper(cursor); } }
好了,代碼寫到這裏差很少了,一個簡單的記筆記的軟件就完成啦。要想豐富好Note的功能,你們能夠去了解一下Android下面的富文本編輯器以及Android網絡操做。你能夠把本地儲存的筆記數據同步到服務器上。:)segmentfault
若是你徹底讀了下面這些文章:
RecyclerView簡介與實例
ViewPager的使用
Android數據庫操做(上)
我相信你確定想看到完整的代碼,幸運的是,這幾篇文章是貫穿於一個筆記應用的,讀起來很方便。來,別猶豫啦,看完記得給我一個星星哦服務器