成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Android數(shù)據(jù)庫(kù)操作(下)

hizengzeng / 1349人閱讀

摘要:一前言拖了這么久才能寫下篇,主要是最近在忙著復(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 ArrayList getNotes() {
//        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 ArrayList notes;
    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

相關(guān)文章

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<