资讯专栏INFORMATION COLUMN

Android数据库操作(下)

zzir / 3149人阅读

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

一 前言

拖了这么久才能写下篇,主要是最近在忙着复习算法和操作系统的知识(马上要工作了,还是要要多锻炼一下内功),好,话不多说,先贴出上篇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 getNotes() {
//        return notes;
        ArrayList 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 notes;
    private Context context;
    private SQLiteDatabase database;

    private NoteLab(Context c){
//        notes = new ArrayList();
        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
balabalabalabalalabalabalabalabalala
balabalabalabalalabalabalabalabalala
balabalabalabalalabalabalabalabalala
balabalabalabalalabalabalabalabalala
");
//            notes.add(note);
//        }
    }

    public static NoteLab getNoteLab(Context context){
        if (sNoteLab == null){
            sNoteLab = new NoteLab(context);
        }

        return sNoteLab;
    }

    public ArrayList getNotes() {
//        return notes;
        ArrayList notes = new ArrayList();
        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://www.ucloud.cn/yun/12649.html

相关文章

  • Android Studio

    摘要:应用程序响应速度最糟糕的是应用程序无响应对话框。然而,不幸的是,并不能获取所要的结果,宽高值均为。提供侧滑操作的控件这是一款提供侧滑功能的,可以设置它的滑动方向左右上下。 写给 Android 开发者的混淆使用手册 点击打开链接 毫无疑问,混淆是打包过程中最重要的流程之一,在没有特殊原因的情况下,所有 app 都应该开启混淆。 首先,这里说的的混淆其实是包括了代码压缩、代码混淆以及资源...

    dunizb 评论0 收藏0
  • Android面试知识整理

    摘要:全面而详尽的面试题集面试系列总结全方面覆盖知识结构什么是如何避免指的是应用程序在一段时间内无响应,系统会向用户弹出一个应用无响应的对话框,用户可以选择关闭应用或者继续等待应用响应,这往往是由于程序的性能所引发的。 全面而详尽的Android面试题集Android面试系列2018总结(全方面覆盖Android知识结构) 1. 什么是ANR?如何避免? ANR(Application N...

    U2FsdGVkX1x 评论0 收藏0
  • 腾讯优测-优社区干货精选 | android开发在路上:少去踩坑,多走捷径()

    摘要:文腾讯公司陈江峰优测小优有话说开发的坑自然是不少,不想掉坑快来优测优社区开发中其它需要提醒的问题在线程无法进行网络操作。合理使用数据结构链表和数组,及时释放引用,使用弱引用等能降低情况发生。统计每个版本的率,并把进行修复。 文/腾讯公司 陈江峰 优测小优有话说: android开发的坑自然是不少,不想掉坑快来优测优社区~ 6.Android APP开发中其它需要提醒的问题 andro...

    liukai90 评论0 收藏0
  • Android开发优化的几点建议

    摘要:网络数据优化移动端获取网络数据优化可以从以下几点着手连接复用节省连接建立时间,如开启。 安卓开发大军浩浩荡荡,经过近十年的发展,Android技术优化日异月新,如今Android 9.0 已经发布,Android系统性能也已经非常流畅,可以在体验上完全媲美iOS。但是,到了各大厂商手里,改源码、自定义系统,使得Android原生系统变得鱼龙混杂,然后到了不同层次的开发工程师手里,因为技...

    赵连江 评论0 收藏0
  • 国内值得关注的官方API集合

    摘要:电影豆瓣电影豆瓣电影支持电影条目,影人条目,搜索和榜单等。音乐豆瓣音乐支持音乐信息,评论信息,标签信息,搜索音乐,某个音乐中标记最多的标签,发表修改删除评论,用户对音乐的所有标签等内容。 项目地址:https://github.com/marktony/A... 本页仅收集国内部分官方API,如需查看其他版本,请点击这里。 目录 笔记 出行 词典 电商 地图 电影 即时通讯 开发者网...

    gaomysion 评论0 收藏0
  • 国内值得关注的官方API集合

    摘要:电影豆瓣电影豆瓣电影支持电影条目,影人条目,搜索和榜单等。音乐豆瓣音乐支持音乐信息,评论信息,标签信息,搜索音乐,某个音乐中标记最多的标签,发表修改删除评论,用户对音乐的所有标签等内容。 项目地址:https://github.com/marktony/A... 本页仅收集国内部分官方API,如需查看其他版本,请点击这里。 目录 笔记 出行 词典 电商 地图 电影 即时通讯 开发者网...

    miqt 评论0 收藏0

发表评论

0条评论

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