资讯专栏INFORMATION COLUMN

Android数据库操作(下)

hizengzeng / 1363人阅读

摘要:一前言拖了这么久才能写下篇,主要是最近在忙着复习算法和操作系统的知识马上要工作了,还是要要多锻炼一下内功,好,话不多说,先贴出上篇数据库操作上上次代码写到类,这个类的构造函数接受的参数是一个,还记得是什么吧其实也类似于中的迭代模式。

一 前言

拖了这么久才能写下篇,主要是最近在忙着复习算法和操作系统的知识(马上要工作了,还是要要多锻炼一下内功),好,话不多说,先贴出上篇Android数据库操作(上)上次代码写到CursorWrapper类,这个类的构造函数接受的参数是一个Cursor,还记得Cursor是什么吧?其实也类似于java中的迭代模式。这里我把所有完成的代码都传到github上了,包含我前面几篇文章的所有代码,基本上是一个可以用的记录笔记的小软件。大家可以对照着学习。代码在这里

二 读取数据

1.使用CursorWrapper
创建一个类如下:

</>复制代码

  1. public class NoteCursorWrapper extends CursorWrapper {
  2. public NoteCursorWrapper(Cursor cursor){
  3. super(cursor);
  4. }
  5. }

我们把Cursor传给它的构造函数,然后调用一下父类的构造方法。想了解细节的同学可以去看一下CursorWrapper的源码。下面重点来了,看代码:

</>复制代码

  1. public class NoteCursorWrapper extends CursorWrapper {
  2. public NoteCursorWrapper(Cursor cursor){
  3. super(cursor);
  4. }
  5. public Note getNote(){
  6. String uuidString = getString(getColumnIndex(NoteDbScheme.NoteTable.Cols.UUID));
  7. String title = getString(getColumnIndex(NoteDbScheme.NoteTable.Cols.TITLE));
  8. String content = getString(getColumnIndex(NoteDbScheme.NoteTable.Cols.CONTENT));
  9. String tag = getString(getColumnIndex(NoteDbScheme.NoteTable.Cols.TAG));
  10. long date = getLong(getColumnIndex(NoteDbScheme.NoteTable.Cols.DATE));
  11. Note note = new Note(UUID.fromString(uuidString));
  12. note.setTitle(title);
  13. note.setContent(content);
  14. note.setTag(tag);
  15. note.setDate(new Date(date));
  16. return note;
  17. }
  18. }

代码看着是不是很清爽,先用getString或者getLong方法从数据库中取出对应的值,然后再组装成Note型返回。为什么写得这么简单?因为我们把Cursor传递给CursorWrapper构造方法了,它为我们做了很多额外工作。
2.修改getNode方法
准备工作都差不多做好了,现在我们修改之前的getNode方法,查出给定uuid的记录:

</>复制代码

  1. public Note getNote(UUID uuid){
  2. // for (Note note : notes){
  3. // if (note.getUuid().equals(uuid)){
  4. // return note;
  5. // }
  6. // }
  7. // return null;
  8. NoteCursorWrapper cursorWrapper = queryNote(NoteDbScheme.NoteTable.Cols.UUID+"=?",new String[]{uuid.toString()});
  9. try {
  10. if (cursorWrapper.getCount() == 0){
  11. return null;
  12. }
  13. cursorWrapper.moveToFirst();
  14. return cursorWrapper.getNote();
  15. }finally {
  16. cursorWrapper.close();
  17. }
  18. }

注意queryNote中参数的写法等同于sql语句中的where,细节在于那个问号,这是防止sql注入的好习惯。第二个需要注意的地方就是要记得执行 cursorWrapper.close方法。

3.修改getNotes方法
除了查出给定uuid的字段,通常我们还需要查出数据库里存在的所有的记录,所有的方法和上面的类似,把条件设置成null就好了。好看代码:

</>复制代码

  1. public ArrayList getNotes() {
  2. // return notes;
  3. ArrayList nodes = new ArrayList<>();
  4. NoteCursorWrapper wrapper = queryNote(null,null);
  5. try{
  6. wrapper.moveToFirst();
  7. while (!wrapper.isAfterLast()){
  8. nodes.add(wrapper.getNote());
  9. wrapper.moveToFirst();
  10. }
  11. }finally {
  12. wrapper.close();
  13. }
  14. return nodes;
  15. }

结合上面一段代码,我们应该能体会到CursorWrapper类是怎么用的,去复习一下java的迭代模式也很容易理解。 这里给出完整的代码:

</>复制代码

  1. public class NoteLab {
  2. private static NoteLab sNoteLab; //for the global use
  3. // private ArrayList notes;
  4. private Context context;
  5. private SQLiteDatabase database;
  6. private NoteLab(Context c){
  7. // notes = new ArrayList();
  8. this.context = c;
  9. database = new NoteBaseHelper(context).getWritableDatabase();
  10. //generate 100 Note Objects
  11. // for (int i=0;i<100;i++){
  12. // Note note = new Note();
  13. // note.setTitle("this is title "+i);
  14. // note.setContent("this is content "+i+"balabalabalabalalabalabalabalabalala
  15. balabalabalabalalabalabalabalabalala
  16. balabalabalabalalabalabalabalabalala
  17. balabalabalabalalabalabalabalabalala
  18. balabalabalabalalabalabalabalabalala
  19. ");
  20. // notes.add(note);
  21. // }
  22. }
  23. public static NoteLab getNoteLab(Context context){
  24. if (sNoteLab == null){
  25. sNoteLab = new NoteLab(context);
  26. }
  27. return sNoteLab;
  28. }
  29. public ArrayList getNotes() {
  30. // return notes;
  31. ArrayList notes = new ArrayList();
  32. NoteCursorWrapper wrapper = queryNote(null,null);
  33. try{
  34. wrapper.moveToFirst();
  35. while (!wrapper.isAfterLast()){
  36. notes.add(wrapper.getNote());
  37. wrapper.moveToNext();
  38. }
  39. }finally {
  40. wrapper.close();
  41. }
  42. return notes;
  43. }
  44. public void addNote(Note note){
  45. // notes.add(note);
  46. ContentValues values = getValues(note);
  47. database.insert(NoteDbScheme.NoteTable.name,null,values);
  48. }
  49. public Note getNote(UUID uuid){
  50. // for (Note note : notes){
  51. // if (note.getUuid().equals(uuid)){
  52. // return note;
  53. // }
  54. // }
  55. // return null;
  56. NoteCursorWrapper cursorWrapper = queryNote(NoteDbScheme.NoteTable.Cols.UUID+"=?",new String[]{uuid.toString()});
  57. try {
  58. if (cursorWrapper.getCount() == 0){
  59. return null;
  60. }
  61. cursorWrapper.moveToFirst();
  62. return cursorWrapper.getNote();
  63. }finally {
  64. cursorWrapper.close();
  65. }
  66. }
  67. private ContentValues getValues(Note note){
  68. ContentValues values = new ContentValues();
  69. values.put(NoteDbScheme.NoteTable.Cols.UUID,note.getUuid().toString());
  70. values.put(NoteDbScheme.NoteTable.Cols.TITLE,note.getTitle());
  71. values.put(NoteDbScheme.NoteTable.Cols.CONTENT,note.getContent());
  72. values.put(NoteDbScheme.NoteTable.Cols.DATE,note.getDate().toString());
  73. values.put(NoteDbScheme.NoteTable.Cols.TAG,note.getTag());
  74. return values;
  75. }
  76. private NoteCursorWrapper queryNote(String whereClause, String[] whereArgs){
  77. Cursor cursor = database.query(
  78. NoteDbScheme.NoteTable.name,
  79. null,
  80. whereClause,
  81. whereArgs,
  82. null,
  83. null,
  84. null
  85. );
  86. return new NoteCursorWrapper(cursor);
  87. }

好了,代码写到这里差不多了,一个简单的记笔记的软件就完成啦。要想丰富好Note的功能,大家可以去了解一下Android下面的富文本编辑器以及Android网络操作。你可以把本地储存的笔记数据同步到服务器上。:)

三 后记

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/65615.html

相关文章

发表评论

0条评论

最新活动
阅读需要支付1元查看
<