摘要:一前言拖了這么久才能寫下篇,主要是最近在忙著復(fù)習(xí)算法和操作系統(tǒng)的知識(shí)馬上要工作了,還是要要多鍛煉一下內(nèi)功,好,話不多說(shuō),先貼出上篇數(shù)據(jù)庫(kù)操作上上次代碼寫到類,這個(gè)類的構(gòu)造函數(shù)接受的參數(shù)是一個(gè),還記得是什么吧其實(shí)也類似于中的迭代模式。
一 前言
拖了這么久才能寫下篇,主要是最近在忙著復(fù)習(xí)算法和操作系統(tǒng)的知識(shí)(馬上要工作了,還是要要多鍛煉一下內(nèi)功),好,話不多說(shuō),先貼出上篇Android數(shù)據(jù)庫(kù)操作(上)上次代碼寫到CursorWrapper類,這個(gè)類的構(gòu)造函數(shù)接受的參數(shù)是一個(gè)Cursor,還記得Cursor是什么吧?其實(shí)也類似于java中的迭代模式。這里我把所有完成的代碼都傳到github上了,包含我前面幾篇文章的所有代碼,基本上是一個(gè)可以用的記錄筆記的小軟件。大家可以對(duì)照著學(xué)習(xí)。代碼在這里
二 讀取數(shù)據(jù)1.使用CursorWrapper
創(chuàng)建一個(gè)類如下:
public class NoteCursorWrapper extends CursorWrapper { public NoteCursorWrapper(Cursor cursor){ super(cursor); } }
我們把Cursor傳給它的構(gòu)造函數(shù),然后調(diào)用一下父類的構(gòu)造方法。想了解細(xì)節(jié)的同學(xué)可以去看一下CursorWrapper的源碼。下面重點(diǎn)來(lái)了,看代碼:
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方法從數(shù)據(jù)庫(kù)中取出對(duì)應(yīng)的值,然后再組裝成Note型返回。為什么寫得這么簡(jiǎn)單?因?yàn)槲覀儼袰ursor傳遞給CursorWrapper構(gòu)造方法了,它為我們做了很多額外工作。
2.修改getNode方法
準(zhǔn)備工作都差不多做好了,現(xiàn)在我們修改之前的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中參數(shù)的寫法等同于sql語(yǔ)句中的where,細(xì)節(jié)在于那個(gè)問(wèn)號(hào),這是防止sql注入的好習(xí)慣。第二個(gè)需要注意的地方就是要記得執(zhí)行 cursorWrapper.close方法。
3.修改getNotes方法
除了查出給定uuid的字段,通常我們還需要查出數(shù)據(jù)庫(kù)里存在的所有的記錄,所有的方法和上面的類似,把條件設(shè)置成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; }
結(jié)合上面一段代碼,我們應(yīng)該能體會(huì)到CursorWrapper類是怎么用的,去復(fù)習(xí)一下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); } }
好了,代碼寫到這里差不多了,一個(gè)簡(jiǎn)單的記筆記的軟件就完成啦。要想豐富好Note的功能,大家可以去了解一下Android下面的富文本編輯器以及Android網(wǎng)絡(luò)操作。你可以把本地儲(chǔ)存的筆記數(shù)據(jù)同步到服務(wù)器上。:)
三 后記如果你完全讀了下面這些文章:
RecyclerView簡(jiǎn)介與實(shí)例
ViewPager的使用
Android數(shù)據(jù)庫(kù)操作(上)
我相信你肯定想看到完整的代碼,幸運(yùn)的是,這幾篇文章是貫穿于一個(gè)筆記應(yīng)用的,讀起來(lái)很方便。來(lái),別猶豫啦,看完記得給我一個(gè)星星哦
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/65615.html
閱讀 2846·2023-04-25 22:15
閱讀 1870·2021-11-19 09:40
閱讀 2217·2021-09-30 09:48
閱讀 3298·2021-09-03 10:36
閱讀 2104·2021-08-30 09:48
閱讀 1933·2021-08-24 10:00
閱讀 2772·2019-08-30 15:54
閱讀 753·2019-08-30 15:54