1 前言
由于项目需求,最近需要开发一个备忘录,备忘录对于Android是一个很普遍的功能。其实我内心os是每台手机自带的系统就有备忘录功能,在一个App中再开发一个备忘录功能实在是鸡肋。然鹅,做项目就是这样,老板喊做,那我就做着呗。由于为了毕业还要看文献看算法什么的,平时也没什么时间,所以这次只是简单的做了一个可以基于SQLite本地数据库进行备忘录增删查改操作的一个功能。主要实现以下几点功能:
- 备忘录的增删查改功能
- 每条备忘录包含标题、内容、时间
- 备忘录的排列顺序按照时间来,后来居上
2 预备知识
2.1 SQLite基础
在很多项目开发中,我们或多或少都会用到数据库。在Android中,我们一般使用SQLite。因为Android在android.database.sqlite
包封装了很多SQLite的API。
继承SQLiteOpenHelper
在使用SQLite时,首先创建一个继承SQLiteOpenHelper
的类,并重写onCreate()
和onUpgrade()
方法。
|
|
这个类的作用主要是用来创建数据库和建表用,一般来说,我们会再创建一个OrderDao类用于处理所有的数据操作方法。在OrderDao中实例化OrderDBHelper:
|
|
SQLite的增删查改操作
数据库操作无外乎“增删查改”,我们依据操作是否对数据库有改动将其分为两类:
“增删改”
对于“增删改”这类对表内容变换的操作,我们需要先调用getWritableDatabase()
,执行的时候可以调用通用的excecSQL(String sql)
方法或对应的操作API:insert()
、delete()
、update()
。“查”
对于“查”这种对表内容无影响的操作,我们需要调用getReadableDatabase()
,这时就不能用execSQL方法,而该改用query()
或rawQuery()
方法。
增加数据
- 数据量较多时
开启事物进行添加:
|
|
- 插入一条新数据
可以使用insert(String table, String nullColumnHack, ContentValues values)
方法来插入,ContentValues
内部实现就是HashMap,但是两者还是有区别的,ContentValues
的Key只能存储String类型,Value只能存储基本数据类型以及String类型这些,不能存储对象。
|
|
删除数据
delete(String table, String WhereClause, String[] WhereArgs)
,whereClause是删除条件,whereArgs是删除条件值数组
|
|
修改数据
update(String table, ContentValues, String whereClause, String[] whereArgs)
:
|
|
查找数据
public Cursor query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy,String limit)
query中的参数如下:
参数 | 含义 |
---|---|
table | 表名 |
columns | 列名称数组 |
selection | 条件字句,相当于where |
selectionArgs | 条件字句,参数数组 |
groupBy | 分组列 |
having | 分组条件 |
orderBy | 排序列 |
orderBy | 排序列 |
limit | 分页查询限制 |
cursor | 返回值 |
返回值类型是Cursor
,Cursor
是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move()
,获得列值。Cursor
游标常用方法如下:
public Cursor rawQuery(String sql, String[] selectionArgs)
类似execSQL
方法,不做介绍。
|
|
2.2 FloatingActionButton的使用
Floating Action Button(FAB)是众多专家大牛针对Material Design讨论比较细化的一个点,通过圆形元素与分割线、卡片、各种Bar的直线形成鲜明对比,并使用色彩设定中鲜艳的辅色,带来更具突破性的视觉效果。也正因此,在github上,有着许多与FAB相关的开源项目,其具有弹出特效与自动隐藏等功能,虽然本次并没有用到。简单介绍 如何使用:
2.2.1 导入依赖
|
|
2.2.2 添加View到layout的xml文件中
- 声明自定义命名空间
|
|
- 添加
com.getbase.floatingactionbutton.FloatingActionButton
|
|
2.2.3 实现弹出菜单功能
这次我并没有做弹出菜单功能,只是给button绑定了一个监听器进行activity之间的跳转。如果有需要用到其弹窗功能,可以参考以下链接:FloatingActionButton的使用
2.3 CardView的使用
CardView继承自FrameLayout类,是一种卡片视图,以卡片形式显示内容。卡片布局可以设置圆角与阴影,还可以布局其他的View。CardView可以作为一般的布局使用,也可以作为ListView和RecyclerView的Item使用。
2.3.1 导入依赖
CardView的位置在supportV7包之中,因此,在使用时,需要导入v7包的依赖。
|
|
2.3.2 CardView属性
android:cardCornerRadius
:设置card圆角的大小android:cardBackgroundColor
:设置card的背景颜色android:elevation
:设置阴影的大小android:contentPadding
:设置卡片内容与边界的间隔android:cardUseCompatPadding
:设置内边距,防止内容与边角的重叠
2.3.3 CardView作为listView中单个item的布局
用来显示单条备忘录内容的布局:
|
|
3 备忘录实战
3.1 数据库相关类封装
3.1.1 NoteOpenHelper继承自SQLiteOpenHelper
用于创建数据库及备忘录表,每条记录有4个字段,分别是id(主键,自增)、content(备忘录内容)、title(备忘录标题)、time(备忘录记录时间),其代码如下:
|
|
3.1.2 数据库操作类DBManager
SQLite的数据库的增删查改若不经过一番封装,代码将显得冗余不优雅,因此将其封装在一个操作类中,代码如下所示:
|
|
3.2 备忘录列表listView适配器
这个就没什么好说的了,为了提高性能,用了ViewHolder。
|
|
3.3 主界面和编辑界面
3.3.1 主界面
主界面布局:
|
|
主要是一个Listview和FAB,以及一个TextView,用以在当没有备忘录条目时,默认提示“点击右下方按钮增加备忘”。
Activity:
主要是初始化和三个监听事件函数:
- 点击addBtn时,跳转至编辑界面
- 短按listView中的条目时,跳转至编辑界面,修改备忘录内容界面
- 长按listView中的条目时,弹窗,提示是否删除该条备忘录
其中在跳转界面时,给Intent
设置标志FLAG_ACTIVITY_CLEAR_TOP
的原因在于,怕用户在主界面与编辑界面之间反复跳转时,会在栈中存留多个activity界面,而影响用户体验。
3.3.2 编辑界面
界面布局:
|
|
代码:
|
|
以及Note类:
|
|
值得一说的是,将listView倒序排列。用到的语句是:
|
|
以及重新编辑一条备忘之后,要将这条备忘的原记录删除,再将新编辑后的备忘置顶。
整个开发流程,大致就是这样。
上两张图吧: