一 前言
拖了这么久才能写下篇,主要是最近在忙着复习算法和操作系统的知识(马上要工作了,还是要要多锻炼一下内功),好,话不多说,先贴出上篇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数据库操作(上)
我相信你肯定想看到完整的代码,幸运的是,这几篇文章是贯穿于一个笔记应用的,读起来很方便。来,别犹豫啦,看完记得给我一个星星哦
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。