转载

Android数据库操作(下)

一 前言

拖了这么久才能写下篇,主要是最近在忙着复习算法和操作系统的知识(马上要工作了,还是要要多锻炼一下内功),好,话不多说,先贴出上篇 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数据库操作(上)

我相信你肯定想看到完整的代码,幸运的是,这几篇文章是贯穿于一个笔记应用的,读起来很方便。 来,别犹豫啦,看完记得给我一个星星哦

原文  https://segmentfault.com/a/1190000004592913
正文到此结束
Loading...