Android数据库操作(下)

狗蛋的窝 2019-06-20

一 前言

拖了这么久才能写下篇,主要是最近在忙着复习算法和操作系统的知识(马上要工作了,还是要要多锻炼一下内功),好,话不多说,先贴出上篇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 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网络操作。你可以把本地储存的笔记数据同步到服务器上。:)

三 后记

如果你完全读了下面这些文章:
RecyclerView简介与实例
ViewPager的使用
Android数据库操作(上)
我相信你肯定想看到完整的代码,幸运的是,这几篇文章是贯穿于一个笔记应用的,读起来很方便。来,别犹豫啦,看完记得给我一个星星哦

相关推荐

李高峰 / 0评论 2020-05-25
淡风wisdon大大 / 0评论 2011-07-25