ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Android记账App开发全流程:从数据库设计到答辩通关指南

Android记账App开发全流程:从数据库设计到答辩通关指南 简介本资源是一份面向高校移动开发初学者的Android期末大作业实战项目——记账App完整交付包适用于K12及高职本科阶段Android应用开发课程实践与能力验证。项目基于Android Studio开发采用Java语言实现涵盖收支记录、数据库持久化SQLite、账目隐藏/删除、数据清空及收支图表可视化等核心功能代码规范、逻辑清晰曾获95分高分评价。压缩包共1065个文件含36个Java源码、262个XML布局与配置文件、229个Flat资源编译产物、146个PNG图标及20个WebP图片另有3个可直接安装的APK、Gradle构建脚本及完整依赖配置总大小19.33MB。目前已有3624人学习下载提供开箱即用的源码工程、导出APK安装包及全链路运行截图便于快速部署、调试验证与功能复现是理解Android基础组件、数据存储与UI交互的优质教学案例。 没写过安卓期末大作业的人永远不知道这里面的水有多深。你以为写完代码就完了错了真正折磨人的是“代码跑起来没问题一交上去就被打回”——要么是没导出APK要么是没写清楚运行环境要么是演示的时候在模拟器上崩溃要么是老师问一句“你的数据库存在哪”就当场卡壳。这篇东西就是把我自己折腾记账App的完整过程、踩过的坑、最后怎么从前到后整理成一个“能直接交差还能拿高分”的项目的经验全部拆开给你看。不管你是刚学完Java基础、第一次碰Android Studio还是已经写完代码但不知道怎么整理交付这篇都值得你花十分钟看完。1. 项目定题与需求拆解为什么选记账App期末大作业选方向第一条原则是“老师看得懂你自己写得完”。市面上常见的选题比如商城、社交、外卖听着牛逼但功能一展开就收不住购物车、订单状态、聊天、推送……每一样都能把你拖进坑里。记账App最大的好处是核心业务逻辑非常闭环——记一笔、存起来、算个总数、画个图就这四件事做完就是完整产品。我当时选记账App还有一个现实原因课程只讲到了Activity、Intent、ListView、SQLite再往上的高级框架没学。找个需求天花乱坠的项目自己写不出来还得靠抄抄又抄不明白答辩一问就露馅。记账App用课程范围内的技术完全能覆盖还能适当加点“超出课程”的小亮点比如图表统计这就成了加分项而不是负担。需求拆解上我给自己定了几个硬性标准模块功能优先级记账增、删、改、查账单记录必做分类支出/收入分类标签可自定义必做统计按月汇总、分类占比、趋势图加分预算月度预算提醒加分体验界面干净、有启动图标、有引导语必做这里有个心得期末大作业不要追求“全”追求“顺”。一个功能做到能演示、能讲清原理比五个功能每个都有bug强十倍。你问十个做过大作业的人九个会告诉你最后悔的事就是“当时功能做太多差点没调试完”。所以一开始就要学会做减法。我最后砍掉了多账本、周期记账、语音记账这些花哨需求只保留“日常记账—分类统计—预算提醒”这条主线开发周期控制在两周内剩下时间全部用来打磨界面、写报告、录演示视频。2. 技术选型与项目结构用最稳的方案别炫技技术选型只有一句话课程教了什么就用什么课程没教的用最主流、资料最多的那套。这直接决定你卡住的时候能不能在搜索引擎里找到答案。我当时用的是开发工具Android Studio版本无所谓用你上课那个就行语言Java因为课里教的是JavaKotlin虽然现在更主流但期末大作业不是你学新语言的时候数据库SQLite配合 SQLiteOpenHelper 管理列表展示RecyclerView虽然课里教的可能是 ListView但 RecyclerView 现在更通用而且代码写起来并不难图表MPAndroidChart第三方库GitHub 上一万多 star接入简单是图表功能最稳的选项架构没上 MVP/MVVM就普通的Activity Adapter DBHelper清晰直白为什么要用 SQLite 而不用其他因为安卓原生自带不需要额外服务器老师一问“数据存哪”你就答“SQLite 数据库存在 App 私有目录下”干净利落。如果非要用 MySQL 做远程存储你得搞服务器、搞接口、搞网络请求期末答辩的网络环境还可能给你脸色看完全没必要。项目结构我按功能分包不用教程里那种“按类分包”的方式activity包、adapter包、bean包、db包巴拉巴拉因为期末作业的代码量还没大到需要分那么细。我采用的是com.example.bookkeeping ├── MainActivity.java // 主界面 底部导航 ├── RecordActivity.java // 记账页新增/编辑 ├── StatisticsActivity.java // 统计页 ├── BudgetActivity.java // 预算设置页 ├── adapter │ ├── RecordAdapter.java // 账单列表适配器 │ └── ChartAdapter.java // 图表标签适配器如果用到 ├── db │ ├── DBHelper.java // 数据库帮助类 │ └── RecordDao.java // 账单数据访问对象 ├── bean │ ├── RecordBean.java // 账单实体类 │ └── BudgetBean.java // 预算实体类 ├── utils │ ├── DateUtils.java // 日期工具 │ └── MoneyUtils.java // 金额格式化 └── res ├── layout/ // 各种布局文件 ├── menu/ // 底部导航菜单 ├── drawable/ // 图标和背景 └── values/ // 颜色、字符串、主题这个结构的好处是答辩的时候你可以说“我按职责分包每个类负责单一功能”老师一听就觉得你懂工程化哪怕代码量不大印象分先加上。工具栏和依赖配置上有个坑要提醒MPAndroidChart 这个库需要在 build.gradle 里加依赖而且它老版本和 AndroidX 有兼容性问题。如果你用的项目模板是 AndroidX一定要引入适配版本我用的版本号是com.github.PhilJay:MPAndroidChart:v3.1.0这个版本支持 AndroidX实测没问题。如果 Gradle 同步报错八成是仓库地址没配全要在build.gradle的allprojects.repositories里加上maven { url https://jitpack.io }。3. 核心功能实现记账模块的完整开发流程这一章是我最想详细写的因为网上教程很多但缺少“从零到能跑”的完整串联。我会把每个核心功能的实现思路和关键代码都拆开讲。3.1 数据库设计与建表语句写任何有数据存储的功能第一步绝对是设计表结构不是先画界面。这张表的字段直接决定你后面写代码时有多痛苦。我设计的账单表就五个核心字段加一个自增主键CREATE TABLE record ( id INTEGER PRIMARY KEY AUTOINCREMENT, type INTEGER NOT NULL, -- 0支出1收入 category TEXT NOT NULL, -- 分类名称如餐饮交通 amount REAL NOT NULL, -- 金额 note TEXT, -- 备注 date TEXT NOT NULL, -- 日期格式 yyyy-MM-dd create_time TEXT DEFAULT (datetime(now, localtime)) );type 用 Integer 而不是 String是为了后面统计时方便按类型分组date 用 TEXT 存标准格式是为了按月查询时用LIKE 2025-06%这种写法直接匹配非常方便。建表语句写在 DBHelper 的 onCreate 里注意版本号要从1开始如果以后改了表结构把版本号加1并在 onUpgrade 里处理否则会出现“table already exists”的崩溃。预算表更简单就存月份和预算金额CREATE TABLE budget ( id INTEGER PRIMARY KEY AUTOINCREMENT, month TEXT NOT NULL, -- 格式 yyyy-MM amount REAL NOT NULL );3.2 记账页的交互实现记账页是整个App的“门面”用户打开App最常用的就是这个页面。我把它做成了三个部分顶部类型切换支出/收入、中间金额输入区、底部分类选择区。先说金额输入区这个设计我是参考了很多记账App总结出来的。直接用系统弹出的软键盘输入数字虽然简单但口感和体验都不好。我实现了一个自定义数字键盘// 自定义数字键盘的核心逻辑 public class NumberKeyBoard extends LinearLayout { private TextView mInputView; // 显示当前输入金额 private String currentInput ; private void handleKey(String key) { if (DEL.equals(key)) { if (!currentInput.isEmpty()) { currentInput currentInput.substring(0, currentInput.length() - 1); } } else if (key.equals(.)) { // 控制只能输入一个小数点 if (!currentInput.contains(.)) { currentInput .; } } else { // 限制小数位数最多两位 if (currentInput.contains(.)) { String[] parts currentInput.split(\\.); if (parts.length 1 parts[1].length() 2) { return; } } currentInput key; } mInputView.setText(currentInput); } }为什么自己写键盘核心逻辑是自定义键盘可以把每个按钮的点击事件统一处理不需要监听系统软键盘的输入回调逻辑更可控而且可以禁用系统键盘弹出避免双层键盘覆盖。这在答辩演示时会显得非常“有思考”。分类选择区用的是一个横向滚动的 RecyclerView每个 item 是“图标文字”。图标我用的是本地 drawable 资源不是网络图片原因很简单离线也能跑演示时不会出现图片加载失败的尴尬。新增记录时先判断必填项是否为空if (recordDao.insert(recordBean) 0) { Toast.makeText(this, 记账成功, Toast.LENGTH_SHORT).show(); finish(); // 返回主页并刷新 } else { Toast.makeText(this, 记账失败请重试, Toast.LENGTH_SHORT).show(); }这个Toast提示虽然简单但演示的时候非常重要——它能让你在台上清晰地向评委展示“每一步操作都有反馈”而且也是答辩时容易答的问题“如何让用户知道操作成功了”答案就是 Toast 加列表刷新。3.3 账单列表展示与编辑删除账单列表是数据展示的核心。我用 RecyclerView 实现每个列表项显示分类图标、分类名称、备注、日期、金额红色支出、绿色收入。列表项的布局文件 record_item.xml 大概是LinearLayout ImageView id:iv_category_icon / !-- 分类图标 -- LinearLayout TextView id:tv_category_name / !-- 分类名称 -- TextView id:tv_note / !-- 备注 -- TextView id:tv_date / !-- 日期 -- /LinearLayout TextView id:tv_amount / !-- 金额 -- /LinearLayoutAdapter 的关键是 bindData 方法里要根据记录类型切换金额颜色Override public void onBindViewHolder(NonNull ViewHolder holder, int position) { RecordBean bean mList.get(position); int color; if (bean.getType() 1) { color Color.parseColor(#4CAF50); // 收入绿色 } else { color Color.parseColor(#F44336); // 支出红色 } holder.tvAmount.setTextColor(color); holder.tvAmount.setText((bean.getType() 1 ? : -) bean.getAmount()); }这里有个小技巧金额展示一律带正负号红加绿减这是所有记账App的通用视觉规则老师不用看你演示光看截图就觉得“这个学生产品意识不错”。编辑和删除我做了两个入口点击列表项跳转编辑页长按弹出确认删除的对话框。写删除时要特别注意——数据库操作不能卡主线程new AlertDialog.Builder(context) .setTitle(删除记录) .setMessage(确定要删除这笔账单吗) .setPositiveButton(删除, (dialog, which) - { // 注意这里如果数据量大最好放到子线程执行 recordDao.delete(bean.getId()); mList.remove(position); notifyItemRemoved(position); notifyItemRangeChanged(position, mList.size()); }) .setNegativeButton(取消, null) .show();对话框删除这个交互比直接滑动删除好用也比按钮删除更安全防止误触。我遇到过一次问题删除后列表不刷新数据还在界面上后来排查发现是notifyDataSetChanged()和notifyItemRemoved()的机制差异——前者是全部刷新后者是局部刷新但必须配合notifyItemRangeChanged才能让后续 item 的 position 正确。这是 RecyclerView 很典型的坑写代码时一定要记住。3.4 月度统计与图表展示统计模块是区分“及格”和“优秀”的分水岭。大部分同学交的大作业就是“能增删改查”如果你做出一个能看图表的统计页分数直接上一个档次。统计页的逻辑是用户先选月份默认当前月然后查询该月所有支出记录按分类分组求和用饼图展示占比再用折线图展示近7天的消费趋势。按月查询的 SQL 用到了 SQLite 的日期函数String sql SELECT category, SUM(amount) as total FROM record WHERE type 0 AND date LIKE ? GROUP BY category;注意date LIKE ?的参数是2025-06%这种字符串匹配方式在月份筛选场景下够用但如果你有大量数据并追求性能可以考虑用strftime(%Y-%m, date)这种函数。对于期末作业体量的数据LIKE 完全没问题。MPAndroidChart 的饼图核心配置如下PieChart pieChart findViewById(R.id.pie_chart); ListPieEntry entries new ArrayList(); for (CategoryTotal ct : list) { entries.add(new PieEntry(ct.total, ct.category)); } PieDataSet dataSet new PieDataSet(entries, 支出构成); dataSet.setColors(new int[]{...}); // 自定义一组颜色 PieData data new PieData(dataSet); data.setValueFormatter(new PercentFormatter(pieChart)); pieChart.setData(data); pieChart.invalidate(); // 刷新图表这里有一个非常大的坑要提醒MPAndroidChart 的数据必须设置过后才能显示但不少人忘了调用invalidate()结果图表空白然后到处找原因。看到图表不显示第一反应应该是“数据set了吗invalidate了吗”折线图展示近7天消费趋势时数据源需要自己做一次日期连续化处理。因为数据库里很可能某天没有记录你不能直接查出来的空档日不显示要自己补0// 生成近7天的日期列表 ListString last7Days DateUtils.getLastDays(7); ListFloat totals new ArrayList(); for (String day : last7Days) { float dayTotal recordDao.getDayTotal(day); // 查不到就返回0 totals.add(dayTotal); }这段逻辑写成一个小工具函数别塞在Activity里不然后面报告里写“复用性高”都有点心虚。4. UI设计与用户体验期末大作业的隐形加分项很多人的期末项目代码能跑但界面丑到老师不想细看。说难听点期末大作业的评分UI 占的比重可能比你想象的大得多——老师一天看几十份作业界面整洁的第一印象直接体现在“印象分”上。4.1 整体配色与主题我没有自己设计颜色用的是 Material Design 的配色规范主色选的是蓝绿色系#00897B辅助色是白色和浅灰色。选这个颜色的原因很朴素它看起来很“健康”适合财务类应用而且 Material 官方文档里就有配套的颜色组合抄起来不会错。在colors.xml里我定义了color namecolorPrimary#00897B/color color namecolorPrimaryDark#00695C/color color namecolorAccent#FFB300/color然后在 styles.xml 里引用style nameAppTheme parentTheme.AppCompat.Light.NoActionBar item namecolorPrimarycolor/colorPrimary/item item namecolorPrimaryDarkcolor/colorPrimaryDark/item item namecolorAccentcolor/colorAccent/item /style为什么不用 ActionBar因为底部导航加顶部标题栏的双栏设计太传统我选择的是侧滑返回手势 自定义顶部标题栏这样界面的现代感更强截图出来更漂亮。4.2 底部导航与页面切换主界面采用三个 Tab账单、统计、我的预算设置放在这里。实现方式是用 BottomNavigationView 加三个 Fragment选这种方式是因为代码结构清晰每个页面独立互不干扰这也是主流App的通用架构。BottomNavigationView navView findViewById(R.id.nav_view); navView.setOnNavigationItemSelectedListener(item - { int itemId item.getItemId(); if (itemId R.id.nav_record) { getSupportFragmentManager().beginTransaction() .replace(R.id.fragment_container, new RecordFragment()).commit(); } else if (itemId R.id.nav_statistics) { ... } return true; });Fragment 之间切换用replace就好别整add和hide/show那套复杂逻辑。期末作业最怕的就是在 Fragment 生命周期上踩坑——replace虽然每次切换都会重建视图但胜在逻辑简单数据量小性能完全扛得住。4.3 空列表状态的处理列表为空时显示什么这个问题很多教程不写但用户体验上特别重要。如果数据库没有数据RecyclerView 就是一片空白用户会以为App坏了。我在布局里加了一个空状态视图LinearLayout id:layout_empty ImageView srcdrawable/ic_empty / TextView text还没有账单点击右下角开始记账吧 / /LinearLayout然后在代码里控制显隐if (mList.isEmpty()) { layoutEmpty.setVisibility(View.VISIBLE); recyclerView.setVisibility(View.GONE); } else { layoutEmpty.setVisibility(View.GONE); recyclerView.setVisibility(View.VISIBLE); }这个细节不算复杂但答辩时非常加分——你可以说“我考虑了用户首次使用时的引导体验”这就叫产品思维。4.4 启动图标与App名称启动图标是我花了一个晚上用 Photoshop 画的一个绿色的圆形背景中间一个白色的“¥”符号。不要觉得画图标麻烦这是让App看起来“正规”的最快方式。设置App名称在 AndroidManifest.xml 里application android:iconmipmap/ic_launcher android:label轻记账 android:themestyle/AppTheme可以在res/values/strings.xml中定义app_name然后在 manifest 中引用这样更规范。5. 导出APK与运行截图交付环节的成败细节代码写完只是第一步期末大作业要“交得漂亮”还得把导出APK和截图这些事做到位。这里面的坑一点都不比写代码少。5.1 生成并导出可安装的APK老师要的是能装到手机上跑的APK不是你在Android Studio里点“Run”那种只能在模拟器上跑的debug包。虽然debug包也能装但正规做法是导出release包。流程是点击菜单栏Build-Generate Signed Bundle or APK选择APK点击Next选择Create new...填好 Key store 信息这一步会生成一个.jks签名文件千万保存好填写 alias 和两个密码选择release勾选签名点击Finish生成完成后Android Studio 会提示locate链接点击它就能打开APK所在目录默认在app/release/app-release.apk。这里有几个细节极其重要签名文件.jks一定要保存好并且记住密码。如果你后续要更新App必须用同一个签名文件否则安装时会提示“签名不一致无法安装”。导出的APK体积通常只有几 MB如果你的APK特别大几十MB检查一下是不是把无用的 so 库或大图片打进去了。有的手机装不上旧设备是因为minSdkVersion设置太高。期末作业一般设minSdkVersion 21就够了覆盖了绝大多数安卓手机。5.2 运行环境说明和模拟器截图提交运行截图最好是用真机截图而不是模拟器截图。原因是真机截图更有说服力老师看到的是“它真的能在真实手机上跑”。但如果你手边没有安卓手机也没关系Android Studio 自带的 AVD 模拟器截图完全可用重点是让截图看起来“干净”模拟器窗口不要有调试信息把Logcat窗口关掉状态栏显示的时间、电量不搭调可以在模拟器设置里调整一下截图里不要有“正在安装”“USB调试”等提示悬浮窗截图内容一般要包括截图场景说明启动页/主界面App图标点开后首页展示账单列表记账页正在输入一笔支出展示分类选择和金额键盘统计页饼图和折线图展示图表效果预算页设置月度预算展示提醒功能编辑页修改某条账单展示表单回显删除确认弹窗展示交互细节每个截图文件名改成中文的比如“1-首页账单列表.png”、“2-新增支出.png”打包时放在“运行截图”文件夹里老师打开一目了然。5.3 演示视频录制很多学校现在要求“提交演示视频”或者不强制但录一个会加分。我录视频用的是 Android Studio 自带的 Screen Record 功能或者手机自带的录屏1080P 30帧就够时间控制在3分钟以内。视频结构建议打开App展示启动过程新增一笔支出完整输入过程新增一笔收入回到列表展示刚才的记录出现切到统计页展示图表变化删除一条记录设置预算展示超预算提示如果做的话录完视频用剪映或PR简单裁剪、加个开头标题就够了别搞花里胡哨的特效老师要看的是功能。6. 课程设计报告与答辩准备代码之外的成败关键很多人以为写完代码就万事大吉结果报告写得像流水账答辩被问得哑口无言。说实话期末大作业的评分里代码只占一半另一半看你怎么把项目“说”出来。6.1 课程设计报告的结构与写法一份标准的安卓课程设计报告基本是这几个部分需求分析项目背景、功能需求、用户角色系统设计功能模块图、数据库设计、界面设计核心代码说明挑3-4个有代表性的功能模块贴关键代码并逐段讲解运行结果截图加文字说明遇到的问题与解决写2-3个调试中遇到的坑这是最好的“独立完成”的证据心得体会重点写“通过这次项目学会了什么”写报告时最忌讳的就是大段贴代码。老师真要看你代码会去看你的源码文件夹报告里的代码只是用来“证明你写了”的所以贴的每一段代码都要配讲解讲清楚这段代码实现了什么、用了什么关键API、为什么这么写。6.2 答辩必问问题清单根据我当年答辩和帮别人模拟答辩的经验老师翻来覆去就问那几个问题提前背熟答案基本不会翻车问你的App数据存在哪里答存在应用自带的 SQLite 数据库里数据库文件在应用私有目录下其他应用无法访问。通过 SQLiteOpenHelper 帮助类进行管理我建了两张表record 表和 budget 表。问数据库升级了怎么办答把数据库版本号加1在 onUpgrade 方法里做表结构变更比如ALTER TABLE新增字段。问为什么用 RecyclerView 而不是 ListView答RecyclerView 有 ViewHolder 模式性能更好自带的布局管理器支持线性、网格、瀑布流等多种布局局部刷新粒度更细数据变化时可以只更新对应的 item。问如果数据量大你的统计会不会卡答目前期末项目的数据量在几百条级别查询耗时几乎可以忽略。如果数据量达到几十万条可以在 category 字段上建索引或者把统计逻辑放到子线程用 AsyncTask / Handler 来做。问图表是怎么实现的答用的是开源库 MPAndroidChart它底层是基于 Canvas 自绘的不是一张静态图片所以数据变化后可以平滑地刷新动画。这些问题每道题你都要能脱稿、流利地答出来。答辩的时候最怕的不是答错而是“卡壳”——一卡壳老师就开始怀疑代码不是你自己写的。6.3 讲好“遇到的问题与解决”这一节在报告里最容易写虚。很多同学写的是“刚开始遇到报错上网搜索后解决了”完全没有信息量。我教你一个写法模板“现象—排查过程—最终原因—解决方案—经验总结”。举个例子我当时遇到的真实问题是统计页饼图在第一次进入时是空的必须退出再进一次才会有数据。现象就是第一次显示空白。排查过程先打日志确认数据查询有没有返回——打了数据有说明不是数据库问题再确认图表数据有没有 set——也 set 了最后查了 MPAndroidChart 的文档才发现数据设置后需要调用invalidate()来触发重绘而我把invalidate()写在了一个只在第二次进入时才会执行的分支里解决方案就是调整调用逻辑把invalidate()放到所有数据设置完成后的固定位置。就这么个问题写了满满一页老师看了就觉得你真是在实际操作中遇到问题并解决的。7. 常见问题与排查技巧实录最后这一部分我把做记账App过程中最容易踩的坑整理成一份速查表都是实际调试过的结论不是从文档里抄的。问题可能原因解决方案安装APK时提示“应用未安装”签名的key和已安装版本不一致卸载旧版本重装或者用同一个keystore打包中文乱码编译器默认编码与文件编码不一致在 build.gradle 中配置compileOptions.encoding UTF-8模拟器上运行很卡AVD 配置的 RAM/存储太小创建 AVD 时给 2GB RAM或用真机调试SQLite 报 “no such table”建表语句在 onCreate中但数据库版本未变卸载App重装或把版本号1并处理 onUpgradeRecyclerView 数据更新后界面不刷新忘记调用 notifyDataSetChanged数据变化后一定调用 adapter 的通知方法图表不显示忘记 invalidate或者数据为空确认 setData 后调用 invalidate空数据显示“暂无数据”占位高版本真机无法安装targetSdkVersion 太高且有权限问题targetSdkVersion 设为 30 左右并声明需要的权限真机连 Android Studio 没反应USB调试未打开或驱动问题手机开启开发者选项并允许USB调试换一根数据线试试生成APK时签名报错keystore 密码不对或路径找不到重新选择 keystore 文件确认密码和别名再单独说一个我认为最值得提的坑——数据库升级的坑。你在开发过程中改了表结构比如给表加了一个字段如果直接在旧代码上跑SQLite 会报“table record already exists”导致App启动就崩。很多人第一反应是卸载重装但如果你已经录了演示视频、装了别的数据重装后数据就没了。正确做法是把数据库版本从1改成2在 onUpgrade 里执行ALTER TABLE语句这样既保留旧数据又更新表结构。这是工作中最常遇到的场景期末能写出这种处理方式绝对加分。还有一个隐藏很深的坑就是金额计算的精度。如果你直接用 float 存金额、用 float 做加减短期看不出问题但统计页合计出来的数可能会变成0.30000000000000004这种鬼样子。强烈建议金额用int存“分”比如12.34元存成1234展示时再除以100转成“元”或者用BigDecimal做运算避免浮点误差。我做的项目里一开始没注意这个问题统计页合计金额偶尔出现23.450000000000003当场社死。后来统一改成以“分”为单位存储所有界面展示时再格式化成两位小数这个问题彻底消失。代码写法// 存储时元转分 int amountFen (int)(Math.round(amountYuan * 100)); // 展示时分转元 String display String.format(%.2f, amountFen / 100.0);8. 最后再分享一点我做这个项目的体会做这个记账App最值钱的不是那一百行核心代码而是整套交付的思维方式。代码写完只是完成了50分剩下50分在报告、截图、视频、答辩里。你想想老师收到的作业里有多少是光秃秃一堆代码文件连个说明都没有你只要把运行截图打包好、报告写清楚、录一段演示视频就已经超过了80%的人。另一个体会是做得简单做得完整比做得复杂但半成品好一百倍。就算你的功能只有“增删改查统计”只要你把它打磨得没有bug、界面风格统一、交互流畅、答辩能讲清楚老师照样会给高分。相反有些人功能写了一堆结果每个都在演示时崩溃最后分数反而不高。如果你现在还在纠结选什么题目或者已经选了记账App但不知道从哪写起按我这个流程走一遍先定需求控制范围——再选技术用熟不用生——写核心功能数据库→列表→图表——打磨UI配色和空状态——导出APK签名打包——整理交付截图和报告——准备答辩背熟必问问题。七步走完这门课的成绩基本稳了。最后说个小技巧源码压缩包命名千万别用“最终版”三个字要写“项目名学号姓名”比如“记账App_2021012345_张三.rar”老师整理文件时直接按文件名归档你对他的善良会以分数回报你的。本文还有配套的精品资源点击获取
返回列表