摘要:一前言拖了這么久才能寫下篇,主要是最近在忙著復習算法和操作系統的知識馬上要工作了,還是要要多鍛煉一下內功,好,話不多說,先貼出上篇數據庫操作上上次代碼寫到類,這個類的構造函數接受的參數是一個,還記得是什么吧其實也類似于中的迭代模式。
一 前言
拖了這么久才能寫下篇,主要是最近在忙著復習算法和操作系統的知識(馬上要工作了,還是要要多鍛煉一下內功),好,話不多說,先貼出上篇Android數據庫操作(上)上次代碼寫到CursorWrapper類,這個類的構造函數接受的參數是一個Cursor,還記得Cursor是什么吧?其實也類似于java中的迭代模式。這里我把所有完成的代碼都傳到github上了,包含我前面幾篇文章的所有代碼,基本上是一個可以用的記錄筆記的小軟件。大家可以對照著學習。代碼在這里
二 讀取數據1.使用CursorWrapper
創建一個類如下:
public class NoteCursorWrapper extends CursorWrapper { public NoteCursorWrapper(Cursor cursor){ super(cursor); } }
我們把Cursor傳給它的構造函數,然后調用一下父類的構造方法。想了解細節的同學可以去看一下CursorWrapper的源碼。下面重點來了,看代碼:
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的記錄:
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就好了。好看代碼:
public ArrayListgetNotes() { // return notes; ArrayList 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 ArrayListnotes; private Context context; private SQLiteDatabase database; private NoteLab(Context c){ // notes = new ArrayList (); 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 balabalabalabalalabalabalabalabalala balabalabalabalalabalabalabalabalala balabalabalabalalabalabalabalabalala balabalabalabalalabalabalabalabalala "); // notes.add(note); // } } public static NoteLab getNoteLab(Context context){ if (sNoteLab == null){ sNoteLab = new NoteLab(context); } return sNoteLab; } public ArrayList getNotes() { // return notes; ArrayList notes = new ArrayList (); 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網絡操作。你可以把本地儲存的筆記數據同步到服務器上。:)
三 后記如果你完全讀了下面這些文章:
RecyclerView簡介與實例
ViewPager的使用
Android數據庫操作(上)
我相信你肯定想看到完整的代碼,幸運的是,這幾篇文章是貫穿于一個筆記應用的,讀起來很方便。來,別猶豫啦,看完記得給我一個星星哦
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/65615.html
閱讀 2723·2023-04-25 22:15
閱讀 1804·2021-11-19 09:40
閱讀 2149·2021-09-30 09:48
閱讀 3214·2021-09-03 10:36
閱讀 2026·2021-08-30 09:48
閱讀 1854·2021-08-24 10:00
閱讀 2725·2019-08-30 15:54
閱讀 699·2019-08-30 15:54