狗蛋的窝 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数据库操作(上)
我相信你肯定想看到完整的代码,幸运的是,这几篇文章是贯穿于一个笔记应用的,读起来很方便。来,别犹豫啦,看完记得给我一个星星哦