一.实验题目
纪念品管理APP
二.实验内容
总体思路:纪念品信息集合存放在sqlite数据库中,每次启动app从sqlite中通过databasehelper读取到数据库的信息,并且通过databasehelper实现对数据库的增删查改。纪念品列表使用的是RecyclerView来实现的,通过adpater设配器模式来实现纪念品数据的管理和操作。但需要在RecyclerView的item中多加一层CardView 来实现卡片形式的查看。在这个 app 中,我把纪念品 Souvenir 类作为 Room 的一个实体,并创建 SouvenirDao 类操作数据库,SouvenirDataBase作为数据库。其中,SouvenirViewModel是用来给app直接管理和操作从数据中读取出来的数据的,里面包含了一个 SouvenirRepository 类的对象。而 SouvenirRepository 类是作为 ViewModel和Room的中间层的辅助类,这样就可以让ViewModel与直接操作数据库分离,把底层对数据的操作交给 SouvenirRepository,这样在使用 ViewModel 时就可以专注于数据的操作,而不需要关心数据库的操作。
App中只有一个Activity,其余各个场景则均由fragment实现。main.xml中放置了一个NavHostfragment容器,用于对 Navigation 框架中对于每个 fragment 的导航和切换。所有的 fragment 则都由 nav.xml navigation resource file xml文件管理。
SouvenirDao的定义
里面有增删查改的实现,其中还有清除、模糊查找和全部查找。查找返回的是LiveData类型。
SouvenirDataBase:单例数据库的实现:
创建数据库用的是Room的databaseBuilder方法。
SouvenirRepository:
Room 和 ViewModel 的中间层,辅助对数据库的直接操作,数据库这这个类的实例中创建的。里面对于数据库的操作都是实例化了对应的AsyncTask类对象,确保操作在子线程中进行。

其中只要new出对应的AsyncTask实例后直接调用excute方法即可。


这里是各个AsyncTask的定义,还有一个FinishedListener 接口用于让DetailFragment在完成了对底层数据库的更新后,在进行碎片的切换,保证 UI 的刷新。其中 doInBackground 是在子线程中执行的方法,在 UpdateAsyncTask 中返回一个 boolean类型,来确认底层是否更新完成。
还有的就是关于图片的选择设置,目标是调用系统的相册,然后让用户选取照片,把照片在 ImageView 中显示。
其中 ImageView 所用的是 setImageBitmap() 方法,即需要提供一个 Bitmap 资源。在这里使用的是 BitmapFactory.decodeFile()方法,其中 decodeFile 方法里所传入的是图片在系统中的真实绝对路径,这就需要用到调用系统存储空间的权限。
先在Manifest文件中加入:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 开启 SD 卡读和写的访问权限。
当用户授权了权限申请之后会调用 openAlbum()方法,这里先是构建出了一个 Intent 对象,并将它的 action 指定为 android.intent.actio.GET_CONTENT。接着给这个 Intent 对象设置一些必要的参数,然后调用 startActivity
ForResult()方法就可以打开相册程序选择照片了。注意在调用 startActivityForResult()方法的时候,给第二个参数传入的值变成了 CHOOSEPHOTO 这样当从相册选择完图片回到 onActivityResult()方法时,就会进入 CHOOSE
PHOTO 的 case 来处理图片。为了兼容新老版本的手机,先做了一个判断,如果是 4.4 及以上系统的手机就调用 handleImageOnKitKat()方法来处理图片,否则就调用 handleImageBeforeKitKat()方法来处理图片。之所以要这样做,是因为 Android 系统从 4.4 版本开始,选取相册中的图片不再返回图片真实的 Uri 了,而是一个封装过的
Uri,因此如果是 4.4 版本以上的手机就需要对这个 Uri 进行解析才行。
三.实验的结果展示
四.实验心得体会
纪念品 APP 综合性非常强,通过这次实验,加强了我对开发程序过程中的整个框架规划与设计的理解,更加理解数据管理,界面分离等高级思维。但做的 APP 仍有许多不足之处。像是关于图片选择设计的实现没有做到 activity 与数据的分离,让相应控件的数据作为实例留在了 activity 里,这样非常僵硬且不可维护。再比如在 fragment 的切换中需要保证获得当前 item 的 id,但是由于用的是 listadapter,在搜索结果中能获得的只有过滤后的 id 而不是真实 id,进行切换就会出错,只能再去数据库中搜索,这样大大降低了程序的效率。这些不足还有
待以后学艺更进一步的时候去改善,现在则是老老实实地继续学习吧,相信未来能成为更好的程序员。
浙公网安备 33010602011771号