Android实现记账本(麻雀虽小,五脏俱全)

Java Swing与SQLite实战:从零构建可视化记账本桌面应用 桌面应用开发是软件工程中的重要领域,其核心在于将业务逻辑与用户界面有效结合,实现数据的持久化与可视化。通过MVC架构,开发者可以清晰地分离数据模型、业务逻辑与视图层,提升代码的可维护性。在Java生态中,Swing作为经典的GUI工具包,结合轻量级数据库SQLite,能够快速构建独立、跨平台的本地应用程序。这种技术组合特别适用于需要数据本地存储、界面交互及基础数据分析的场景,例如个人财务管理工具。本文以【Java Swing】和【SQLite】为核心,详细演示如何利用JFreeChart库实现数据可视化,完 阅读详情

没想到我的小DEMO可以帮到好多刚入门的同学,为了方便大家获取源码,我把项目源码上传到了优快云上面,有需要的同学去下载吧,链接如下:https://download.youkuaiyun.com/download/magicmhd/11663166
希望大家在源码的基础上再进行自己的开发!做一个属于自己的记账本!加油

1、在androidstudio上新建一个basic项目

2、在系统自动创建的content_main.xml文件中添加listview,代码如下:

  <ListView
        android:id="@+id/lv_main"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

3、编写listview适配器,这里把代码贴出,不再一一介绍,代码如下:

public class CostListAdapter extends BaseAdapter {
    private List<CostBean> mList;
    private Context mContext;
    private LayoutInflater mLayoutInflater;

    public CostListAdapter(Context context, List<CostBean> list){
        mContext=context;
        mList=list;
        mLayoutInflater=LayoutInflater.from(context);

    }

    @Override
    public int getCount() {
        return mList.size();
    }

    @Override
    public Object getItem(int position) {
        return mList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView==null){
            viewHolder=new ViewHolder();
            convertView=mLayoutInflater.inflate(R.layout.list_item,null);
            viewHolder.mTvCostTitle= (TextView) convertView.findViewById(R.id.tv_title);
            viewHolder.mTvCostDate= (TextView) convertView.findViewById(R.id.tv_date);
            viewHolder.mTvCostMoney= (TextView) convertView.findViewById(R.id.tv_cost);
            convertView.setTag(viewHolder);
        }else {
            viewHolder= (ViewHolder) convertView.getTag();
        }

        CostBean bean=mList.get(position);
        viewHolder.mTvCostTitle.setText(bean.costTitle);
        viewHolder.mTvCostDate.setText(bean.costDate);
        viewHolder.mTvCostMoney.setText(bean.costMoney);

        return convertView;
    }

    private static class ViewHolder{
        public TextView mTvCostTitle;
        public TextView mTvCostDate;
        public TextView mTvCostMoney;
    }
}

这里再给出list_item的布局代码如下:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="80dp">

    <TextView
        android:id="@+id/tv_title"
        android:layout_width="150dp"
        android:layout_height="80dp"
        android:layout_marginLeft="10dp"
        android:layout_alignParentLeft="true"
        android:singleLine="true"
        android:ellipsize="marquee"
        android:textSize="35sp"
        android:gravity="center"
        android:text="costTitle"/>

    <TextView
        android:id="@+id/tv_date"
        android:layout_width="wrap_content"
        android:layout_height="80dp"
        android:gravity="center"
        android:textSize="20sp"
        android:layout_marginLeft="15dp"
        android:layout_toRightOf="@+id/tv_title"
        android:text="costDate"/>

    <TextView
        android:id="@+id/tv_cost"
        android:layout_width="wrap_content"
        android:layout_height="80dp"
        android:gravity="center"
        android:layout_alignParentRight="true"
        android:textSize="30sp"
        android:layout_marginRight="20dp"
        android:text="30"/>


</RelativeLayout>

4、测试适配器是否正常(经过运行调试,正常)。

5、新建实体Bean对象,代码如下:

public class CostBean implements Serializable {
    public String costTitle;
    public String costDate;
    public String costMoney;
}

这里implements的意义是为了一会的intent传递。

6、新建数据库,并完成简单的增删改查业务,代码如下:

public class DatabaseHelper extends SQLiteOpenHelper {

    public static final String COST_DATE = "cost_date";
    public static final String COST_TITLE = "cost_title";
    public static final String COST_MONEY = "cost_money";
    public static final String COST = "cost";

    public DatabaseHelper(Context context) {
        super(context, "daily", null, 1);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table if not exists cost("+
                "id integer primary key, "+
                "cost_title varchar, "+
                "cost_date varchar, "+
                "cost_money varchar)");
    }

    public void insertCost(CostBean costBean){
        SQLiteDatabase database=getWritableDatabase();
        ContentValues cv=new ContentValues();
        cv.put(COST_TITLE,costBean.costTitle);
        cv.put(COST_DATE,costBean.costDate);
        cv.put(COST_MONEY,costBean.costMoney);
        database.insert(COST,null,cv);
    }

    public  void deleteAllData(){
        SQLiteDatabase database=getWritableDatabase();
        database.delete(COST,null,null);
    }


    public Cursor getAllCostData(){
        SQLiteDatabase database=getWritableDatabase();
        return database.query(COST,null,null,null,null,null,COST_DATE + " ASC");

    }



    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

这里新建了一个“daily”的数据库和“cost”表,并写了简单的增加、删除和查询数据的功能。

7、在这里给大家推荐一个查看SQLite数据库比较好用的工具---SQLiteStudio,具体使用方法给大家放一个连接,里面讲的非常清楚:https://blog.youkuaiyun.com/Monly_jiajia/article/details/58621469

8、我先把MainActivity的代码放在这儿,然后再跟大家解释。代码如下:

public class MainActivity extends AppCompatActivity {
    private List<CostBean> mCostBeenList;
    private DatabaseHelper mDatabaseHelper;
    private CostListAdapter mAdapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        mDatabaseHelper=new DatabaseHelper(this);

        mCostBeenList=new ArrayList<>();
        initCostData();
        ListView costList= (ListView) findViewById(R.id.lv_main);

        mAdapter=new CostListAdapter(this,mCostBeenList);
        costList.setAdapter(mAdapter);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);
                LayoutInflater inflater=LayoutInflater.from(MainActivity.this);
                View viewDialog=inflater.inflate(R.layout.new_cost_data,null);
                final EditText title= (EditText) viewDialog.findViewById(R.id.et_cost_title);
                final EditText money= (EditText) viewDialog.findViewById(R.id.et_cost_money);
                final DatePicker date= (DatePicker) viewDialog.findViewById(R.id.dp_cost_date);

                builder.setView(viewDialog);
                builder.setTitle("新的花费");
                builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        CostBean coseBean=new CostBean();
                        coseBean.costTitle=title.getText().toString();
                        coseBean.costMoney=money.getText().toString();
                        coseBean.costDate=date.getYear()+"-"+(date.getMonth()+1)+"-"+date.getDayOfMonth();
                        mDatabaseHelper.insertCost(coseBean);
                        mCostBeenList.add(coseBean);

                        mAdapter.notifyDataSetChanged();
                    }
                });

                builder.setNegativeButton("Cancel",null);

                //勿忘!!!
                builder.create().show();
            }
        });

        //打开SQLiteStudio
        SQLiteStudioService.instance().start(this);

    }

    private void initCostData() {
        Cursor cursor= mDatabaseHelper.getAllCostData();
        if (cursor!=null){
            while (cursor.moveToNext()){
                CostBean costBean=new CostBean();
                costBean.costTitle=cursor.getString(cursor.getColumnIndex("cost_title"));
                costBean.costDate=cursor.getString(cursor.getColumnIndex("cost_date"));
                costBean.costMoney=cursor.getString(cursor.getColumnIndex("cost_money"));
                mCostBeenList.add(costBean);
            }
            cursor.close();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();

        if (id == R.id.action_chart) {
//            Intent intent=new Intent(MainActivity.this,ChartActivity.class);
//            intent.putExtra("cost_list", (Serializable) mCostBeenList);
//            startActivity(intent);
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @Override
    protected void onDestroy() {
        SQLiteStudioService.instance().stop();
        super.onDestroy();
    }
}

代码大家仔细一读也就会懂,最主要的内容是我们点击一个FloatingActionButton时可以新记一笔账单,这里使用AlertDialog实现,下面再贴出AlertDialog的view  new_cost_data的xml布局代码:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:gravity="center"
    android:layout_height="match_parent">
    <EditText
        android:id="@+id/et_cost_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="4dp"
        android:hint="Cost Title"/>
    <EditText
        android:id="@+id/et_cost_money"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="4dp"
        android:hint="Cost Money"/>

    <DatePicker
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="4dp"
        android:id="@+id/dp_cost_date"
        android:datePickerMode="spinner"
        android:calendarViewShown="false"/>


</LinearLayout>

需要注意的是,在执行插入(或其他方式)数据到数据库时,我们也一块把数据加入到了CostBean里面(使用一开始定义好的mCostBeanList),另外也要注意,在对数据的操作完成后,记得使用adapter更新数据!即:

mAdapter.notifyDataSetChanged();

关于Android记账本暂时跟大家分享到这儿,其实还可以在这个项目的基础上再加许多东西。

零基础两天用AI做出安卓App?我的Flutter实操全记录 在软件开发领域,自然语言编程正将IDE的门槛降到前所未有的低度。其核心原理是借助大语言模型将人类需求翻译为可执行代码,开发者角色从“编写者”转变为“需求的精确定义者”。这一技术最具价值的场景,是让零基础用户绕开传统编程学习路径,直接完成移动应用的原型验证与私有部署。基于Flutter跨平台框架与AI对话工具,普通人也能通过清晰需求描述、报错信息回传与多模型交叉验证,构建出可安装的安卓APK。本文记录了一位未学过编程的创作者在两天内从零产出安卓安装包的完整流程,涵盖需求拆解、工具选型、界面调优与避坑指南,为希 阅读详情

相关推荐

从零构建安卓记账本:基于Room与RecyclerView的完整开发实践

在移动应用开发中,数据持久化与高效UI渲染是两大核心基础。SQLite作为Android平台内置的轻量级关系型数据库,为结构化数据存储提供了可靠支持;而RecyclerView则是现代Android应用中实现高性能滚动列表的标准组件。通过Room Persistence Library,开发者能以声明式方式安全、便捷地操作SQLite,极大简化了数据库访问层的编码工作。结合RecyclerView的视图复用机制与Adapter模式,可以构建出流畅、可维护的数据展示界面。这种技术组合的工程价值在于,它实现了数

weixin_30984001的博客 262

Android Studio--家庭记账本(一)

  今天通过观看视频,根据老师所讲内容,编译代码。实现了Android Studio记账本里面的增加功能 源代码如下: CostBean.java: package com.example.family; import java.io.Serializable; public class CostBean implements Serializable{ public Stri...

weixin_45040144的博客 2394

安卓记账本开发全解析:MVVM架构、Room数据库与MPAndroidChart实战

移动应用开发中,本地数据持久化与高效UI渲染是核心基础。通过SQLite等关系型数据库,开发者可以实现数据的结构化存储与复杂查询;而合理的架构模式如MVVM,则能有效分离业务逻辑与界面,提升代码可维护性。这些技术的工程价值在于构建稳定、可扩展的应用程序。在个人工具类应用场景中,记账本是一个典型实践,它综合运用了数据库设计、响应式数据流和图表可视化。本文将结合MVVM架构与Room数据库,详解如何实现账单的增删改查与分类统计,并集成MPAndroidChart库生成消费趋势图表,为开发同类功能提供完整解决方案

weixin_33483304的博客 214

Android Studio实现记账本App

本次实现了一个记账本项目,核心功能是可以记录收支情况,可以给收支选择各种分类选项,比如“餐饮”、“零食”、“购物”等等,还可以添加备注和修改日期。然后会在首页展示你的本月支持和收入信息,还可以选择隐藏信息保护隐私。通过【账单记录】可以查看自己的所有账单记录,通过【账单详情】可以看到用柱状图显示的账单情况,在设置里面可以清空所有数据,长按可以删除单条数据,功能非常全面丰富。

振华OPPO的博客世界 3万+

Android记账本开发实战:从Room数据库到MPAndroidChart图表集成

在移动应用开发中,数据持久化与可视化是核心基础技术。通过本地数据库存储用户数据,并结合图表库进行数据展示,能够显著提升应用的功能完整性与用户体验。SQLite作为Android内置的轻量级关系型数据库,为应用提供了可靠的结构化数据存储方案;而Room作为Jetpack组件库中的持久化库,通过对象映射简化了SQLite操作,并支持协程与Flow实现响应式数据流。在UI层面,RecyclerView高效管理列表数据展示,结合数据绑定技术实现界面与数据的动态同步。这些技术的工程价值在于构建稳定、可维护且用户体验良

weixin_29587015的博客 348

基于Android理财记账本设计与实现:数据库、功能模块与开发实践全解析

在Android移动应用开发中,SQLite作为内置的关系型数据库,以轻量级文件和标准SQL支持成为本地数据持久化的首选方案,其ACID事务特性为应用数据一致性提供了可靠保障。在注册登录、收支记录、分类统计等典型业务场景中,数据库表结构设计直接决定功能扩展性与查询性能。借助Android Studio开发环境与RecyclerView组件,开发者能够构建结构清晰、交互流畅的移动端应用。面向毕业设计或课程设计的常用选题——记账类应用,需统筹用户模块、账单管理、可视化统计与筛选功能,并处理版本升级、真机适配等工

weixin_31412781的博客 217

Android Studio 实现小熊记账本 (功能多,简单)

本次实现的Android Studio 小熊记账本 (功能多,简单)项目,核心功能是可以记录收支情况,可以给收支选择各种分类选项,比如“餐饮”、“零食”、“购物”等等,还可以添加备注和修改日期。然后会在首页展示你的本月支持和收入信息,还可以选择隐藏信息保护隐私。通过【账单记录】可以查看自己的所有账单记录,通过【账单详情】可以看到用柱状图显示的账单情况,在设置里面可以清空所有数据,长按可以删除单条数据,功能非常全面丰富。

编程乐学的博客 6410

Material Design第三方客户端实践:NHentai-android架构拆解与关键技术

Material Design作为Google推出的设计语言,为Android应用提供了统一且富有层次感的交互范式。在构建内容密集型客户端时,开发者常需借助Retrofit完成接口封装、用RecyclerView承载复杂列表流,并通过Glide实现大图的高效加载与缓存,这些都是中大型App绕不开的核心课题。从图片浏览器的内存优化到深色模式适配,每个环节都直接影响用户体验。NHentai-android作为一个典型的第三方漫画客户端,系统展示了从需求拆解、架构分层到图片缓存与分页加载的完整技术路径。通过对其设

weixin_33423874的博客 226

Android Studio开发项目——记账簿应用

同时,在该界面下点击收支数据即可跳转至相应的数据修改界面,在数据修改界面用户可自行修改收支数据的各项属性,点击“修改”按钮,系统会将新的数据覆盖旧的数据,点击“删除”按钮,系统会将当前数据从数据库中删除,以此达到修改数据的目的。在首页点击“系统设置”以跳转至用户密码修改界面,该界面的左上角会标记出当前用户的名称,用户可以在该界面下修改自己的登录密码,系统核对新的密码与旧密码不同且不为空,并且与第二次输入的新密码相同后,会将新的密码数据录入数据库的用户表中,并覆盖旧的密码数据,以此达到修改密码的目的。

qq_64338246的博客 3832

基于Kotlin+Room的Android学生成绩管理系统开发复盘

在移动应用开发中,数据持久化与列表性能优化是构建高质量应用的基础。Room作为官方ORM框架,基于SQLite提供编译期校验、协程与Flow无缝集成,能够显著提升数据层的开发效率;DiffUtil通过精确计算列表差异实现局部刷新,有效解决RecyclerView在数据更新时出现的闪烁与性能损耗。这些技术广泛适用于学生管理、订单记录等数据密集型业务场景。本文以学生成绩管理系统为例,完整梳理从数据库三表设计、DAO关联查询、统计SQL编写到列表交互优化的工程实践,并深入解析Room升级迁移、主线程限制、列表复用

weixin_29008805的博客 311

记账本安卓studio开发的

基于安卓studio开发的记账本,有收入支出,统计功能,

Android————一个简单记账本(Bookkeeping)

实现功能: 1:先将数据添加到数据库中(SQLite) 2: 使用RecyclerView将数据库中的数据展示出来 //备注:带加号的ImageButton用于添加数据,带勾的ImageButton用于获取数据并展示 //先按带加号的在按带勾的 第一步建立一个实体类Event 代码如下: public class Event { private String Title; private String Time; private double Money; public Event(){ } public

FranzLiszt的博客 9906

Android应用开发---记账本源码.zip

源码参考,欢迎下载

Android Studio记账本开发实战:从环境搭建到功能扩展的完整指南

移动应用开发的核心在于数据管理与界面交互,其基础架构通常围绕本地数据存储与用户界面组件构建。在Android开发领域,SQLite数据库作为轻量级关系型数据库,是实现本地数据持久化的关键技术,而Activity、Fragment等组件则是构建用户界面的基础单元。这些技术共同支撑了如记账本这类工具型应用的核心功能——数据的增删改查(CRUD)与可视化展示。通过结合RecyclerView实现高效列表展示,并集成MPAndroidChart等图表库进行数据可视化,开发者能够构建出功能完整、体验流畅的应用。本指南

weixin_34241036的博客 340

android 记账app源码.rar

"之前帮同学做的课程设计,主要功能有 一、记账 分收入与支出 支出分为默认的几大类,也可以自定义 收入默认一类 就是收入 不可自定义 二、制定预算 主页显示预算剩余 三、统计分析 饼状图 折线图 条形图 四、语音记账 调用百度语音输入 识别为内容作为备注 五、用户登录 账户信息保存在网络数据库中 六、云同步 不过没有做优化 七、调用系统分享"

android原生代码记事本

1、android简单记事本demo 2、可增加一条记事文本 3、可以编辑点击的当前记事项 4、可以关键字搜索文本

一个简单的小小记账本程序(java)

感觉基础知识学了不少,但是一直搞不清一个项目的实际开发流程,所以就借着这个小记账本的程序梳理一下。因为楼主也是出于学习阶段的菜鸟,所以程序可能会有各种玄学的bug,希望一起提升吧。 跟着站长学到了很多,这个程序虽小,但是有许多开发的思想。麻雀虽小五脏俱全。从需求,到表设计,原型设计,各种工具类的设计,entity层,DAO层,service层,功能层,一步步了解了开发的思想。 主要功能 消费一...

weixin_30745641的博客 1334

安捷伦示波器实战指南:从基础操作到精准触发

本文详细介绍了安捷伦示波器的基础操作与高级功能,包括精准触发配置、波形分析和常见问题排查。通过实战技巧和优化建议,帮助工程师快速掌握示波器的核心功能,提升调试效率。特别适合电子工程师和测试技术人员参考使用。

weixin_30839881的博客 135

从记账本App入手,系统掌握Android开发全流程与数据持久化

移动应用开发入门的关键在于通过一个复杂度适中、技术覆盖完整的实战项目,快速建立底层心智模型。数据持久化是几乎所有业务型App的基石,SQLite作为轻量级关系型数据库,凭借其标准SQL支持与零配置特性,成为理解存储层原理的最佳起点。在掌握建表、增删改查与DAO封装后,可进一步结合RecyclerView实现高效列表展示与刷新,借助MPAndroidChart完成分类占比与月度趋势的可视化分析,让数据从存储到呈现形成完整闭环。这类记账工具类应用不依赖网络与第三方服务,却涉及数据库设计、界面交互、统计图表、架构

weixin_33428613的博客 139

【 Git学习记录(三)】推荐四款主流的Git代码托管平台 —— GitHub、GitLab、Gitee、Coding

了解过Git之后,作为一个程序猿最基本的,你还需要了解目前主流的在线代码托管平台,并至少选择其中一款在平时开发中使用。这里特别介绍以下四款: 国外平台 GitHub —— 全球最流行的代码托管平台 GitLab —— 基于git的仓库管理程序 国内平台 Gitee —— 开源中国旗下的代码托管平台 Coding —— 支持社交元素的代码托管平台 一. GitHub 链接地址:https://github.com/ GitHub目前是全球最流行的代码托管平台(别称:全球最大的同性交友.

JZevin的博客 6091

美团mtgsig 3.1.0算法还原:从加密入口到d1生成的完整链路拆解

本文详细拆解了美团mtgsig 3.1.0签名算法的完整逆向过程。通过定位加密入口函数eH,理清a6、a5、a8到d1的生成依赖链,并运用插桩技术,在JSVMP混淆环境下逐步还原了核心参数的生成逻辑,为逆向工程实践提供了清晰的纯算还原方法论。

oo7890的博客 776
上一篇: Arcgis for android100.3 加载影像地图并且缓存地图
下一篇: Java开发后台接口+Android开发客户端的一个实例(学生成绩管理)(一)
MagicMHD
博客等级 码龄9年 503粉丝 78原创
评论 182
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值