大象笔记

知者行之始,行者知之成

保质期管理 app, 基于 SQLite 的过期时间排序

在基于 Android XML View 重写 Jetpack Compose 版保质期管理 app 时, 用 SQLDelight 替代了 Room 来做 SQLite 数据库管理。 但是在实现过期时间排序功能时,引入了一个 bug。 原来的数据库中的过期时间字段有两种值,NULL 或者时间对应的秒数。 现在又引入了零值。导致排序混乱。 正确的排序效果 在保质期管理 app 中,已过期的物品,或者快过期的应该排列在前面,而不会过期的应该排在后面,如图所示: 零值是否合理 例如录入一个物品时,可以不填写过期时间,那么数据库中应该存储 null 还是 0。 这里确实应该存储 NULL,而不是 ...

阅读全文...

日期时间差计算小程序,计算今天后的日期,及日期差

收到大象计算器微信小程序的热心用户“青”的建议,希望可以增加一个日期差计算功能。 这就安排上,大概是好久没写小程序,代码生疏了不少,最终还是花了一个小时实现了这个小功能。 功能界面 功能简介: 计算几天后的日期 输入起始日期,及相差几天(支持负值),自动计算出目标日期。 日期差为负值时,向前计算日期。 计算日期差 输入起始日期,及结束日期,自动计算出日期差。 在线体验 可以微信扫码下方小程序码直接体验。 也可以在微信中搜索“大象计算器”小程序,进入后,在功能列表下方找到“日期时间计算”功能, 点击进入即可体验。 计算日期差的现实应用场景 旅游行程规划:计算出旅游行程中每个景点之间的时间间 ...

阅读全文...

运费毛利计算器,输入公里数/单价/运费,计算毛利率

今天一位大象计算器微信小程序的热心用户“好梦”加我,希望能实现一个运费毛利率计算的功能。 她之前是在 Excel 表格里用公式自动计算的,但是希望能在手机上通过小程序来计算毛利。 原因是: 因为我们随时随地要计算,下班也要计算,就是不想开电脑 为了勤劳勇敢的中国人民业余时间能远离笨重的电脑,特别是在这个炎热的夏天,我决定牺牲小我成全大我, 在烟台今夏最热辣的一天,抱着滚烫的电脑,在中暑头痛欲裂的情况下 Ctrl-C Ctrl-V 实现了运费毛利计算功能。 功能界面 运费毛利计算功能概要 输入: 公里数 每公里单价 运费(报价) 折扣 税率 点击计算按钮,自动得出: 含税合同价 (公 ...

阅读全文...

Kotlin Flow 基础概念

本以为我的 Android 开发技术已经天下无敌了😅,没想到连 Flow / Channel 我都第一次见。。。不得不说 Android 的新概念层出不穷。 周末看了一堆文档,有了一个大概的了解。我发现微信公众号的文章质量还真是高,不少高手都做了详细的对比说明。 但是最终我一个也没有关注,从这些人的近期推文看都堕落了,不是贩卖焦炉,就是无脑卖其他骗子的课。扯远了,开始正题。 Flow 为何而生 一个挂起函数 (suspending function) 可以异步地返回一个值,但是没法多次返回。于是 Flow 就诞生了。 这也是为什么 Flow 获取 select 结果不需要加上 suspend ...

阅读全文...

Android Fragment 顶部菜单右上角添加删除/搜索按钮

例如,我想在 Android APP 首页顶部显示搜索按钮,在详情页顶部显示删除按钮。 叫 Menu 还是 Top App Bar 搜素 Android Menu https://developer.android.com/develop/ui/views/components/menus 在官方文档里可以看到: XML View 中称之为 Menu Jetpack Compose 中称之为 Top App Bar Activity 中添加还是 Fragment 中添加 You can declare items for the options menu from either you ...

阅读全文...

对话机器人 Rasa(九): docker compose 同时部署 rasa core 和 actions 服务

尝试手动启动了两个 docker containter: 一个用于 rasa core 一个用于 rasa actions 但是,发现测试对话不涉及 actions 服务的,一切正常返回; 但是跟 actions 相关的,没有任何返回。 查看 docker 容器日志 docker logs -f <containter-id> 这样就能实时查看 docker 容器中 rasa 的运行日志,跟 tail -f 效果等同。非常方便。 异常日志 查看了一下 rasa core 的日志: rasa.shared.exceptions.RasaException: Failed to ...

阅读全文...

对话机器人 Rasa(八): actions 通过 Python 查询天气信息

非常典型地一个应用场景,即通过 rasa 从提交消息中提取城市和时间,然后调用三方天气接口查询天气,再返回用户。 但是按照官方文档,及电子书,网上资料里配置,jieba dict 也好,lookup table 也好,都会因为 DIETClassifier 报奇怪的异常。我感觉是版本的 bug,目前还没有定位到问题。 折腾了两天,没有头绪,看了部分 rasa 源代码,印象也非常不好,许多配置规则没有在文档中体现,需要看源码才能理清。 距离这个项目验收的时间不多了,我也懒得折腾,干脆直接在 actions 中直接获取消息原文,用 python 通过正则提取 entity,这本应由 DIETCla ...

阅读全文...

Android SQLDelight (七) 从 Room 迁移的改造点

继续将原有的 Compose 项目重写为 XML View,本来不想折腾,心想要不直接沿用原来的 Room 代码,但是看了 DAO 和 Repository 这种风格的代码,还是忍不了。 既然没有退路了,就得保证对历史数据的兼容。 数据库名称 注意,用 SQLDelight 指定数据库名称时,不要加 .db 后缀。否则跟之前 Room 生成的文件名不一致。 - val driver: SqlDriver = AndroidSqliteDriver(Database.Schema, context, "item_database.db") + val driver: Sq ...

阅读全文...

Android SQLDelight (五) 查询单条数据库记录,并更新 UI

之前用 Android SQLDelight 查询批量数据非常方便,没想到查询单条数据反而有点搞不清。 第一种做法 这样查询就是在主线程里,即 UI 线程。实际操作很快,没有任何卡顿。 val id = args.id if (id != 0L) { val item = viewModel.database.itemQueries.findOne(id).executeAsOne() binding.name.setText(item.name) binding.number.setText(item.num.toString()) } 第二种做法 val id = args.id ...

阅读全文...

Jetpack Navigation 在 fragment 间跳转时使用 Safe Args 传参数

在一个 Android APP 中,需要由 Fragment A 跳转到 B 时进行传参,官方推荐使用 Safe Args。 Safe Args 主打的就是类型安全 (type-safety),测试了一下。 配置 build.gradle SafeArgs 和导航组件的其它模块不太一样,它本身并不是一个 API,而是一个可以生成代码的 gradle 插件。 所以需要将它设置为 gradle 依赖,并且在构建时使其能够正确运行来生成所需的代码。 首先,在项目级 project build.gradle 中增加配置: buildscript { dependencies { ...

阅读全文...

Jetpack Navigation 点击返回 home fragment 时 onCreateView 被再次调用

在写一个 Android App,结构是一个 MainActivity,两个 fragment 分别是 home list fragment / detail fragment。 点击 home 页的 FAB 添加按钮,跳转 detail 页。 疑惑 我不明白为何 home fragment -> edit/detail fragment, 再返回时,home fragment onCreateView 又被调用了一遍。 navController.navigate(R.id.nav_edit) 难道,默认不支持 back stack ? 类似的问题 https://stackover ...

阅读全文...

如何快速水一篇软件系统使用说明书

这种文字性的工作要是没有一个大纲,很容易不知所措,写着写着就走神了,效率低下。 整理了一下流程,然后无脑照着做就行了。 流程 所有软件截图黏贴到 word 文档中。图片居中排版。 根据截图补充文字说明。开篇一张图,内容全靠... 生成目录。使用二级,三级标题,方便生成目录。WPS 支持一键生成目录,搜索目录功能即可找到此功能。 编写系统概述/简介。ChatGPT 伺候,全是应付性文字,生成一篇 800 字的内容之后修修补补即可。 软件功能说明书应该包含哪些内容 包含以下几个部分: 标题页和版权声明:这个部分主要包括文档的标题、版本号、作者、日期以及版权声明等信息。 目录:目录列出了整个文 ...

阅读全文...