Android记账本开发(三):数据库开发

今天做了一些关于数据库的内容。

根据app功能,需要进行数据存储的无非三个方面:用户的个人信息、该用户的收入情况和支出情况,下面进行具体论述。

首先是用户的个人信息,初步设计账号密码功能,后续可能添加头像等。

然后是收入情况,可以先设计一个收入类型的列表,记录所有的收入类别,例如工资,奖金等,目的是为之后用户选择添加收入时提供添加选项。

然后是个人的收入记录,列表项有种类Category,金额Money,备注remark,日期date等。

支出状况类似。

首先定义DatabaseHelper.java类建立数据库。

package com.example.thorineaccount.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import com.example.thorineaccount.R;

import java.text.SimpleDateFormat;
import java.util.Date;

public class DatabaseHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "account.db";
    private static final int DATABASE_VERSION = 1;
    public DatabaseHelper(Context context) {//修改构造方法
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {//启动程序时第一次创建,若程序已安装,需要先卸载
        // 建表
        //收入类别
        String sql = "CREATE table accountincometype (id integer primary key autoincrement,category text,icon integer)";
        db.execSQL(sql);
        //收入明细表(id,类别,金额,备注,日期时间)
        sql = "CREATE table accountincome (id integer primary key autoincrement,category text,"+
                "money double,remark text,date text)";
        db.execSQL(sql);

        //支出类别
        sql = "CREATE table accountoutlaytype (id integer primary key autoincrement,category text,icon integer)";
        db.execSQL(sql);
        //支出明细表(id,类别,金额,备注,日期时间)
        sql = "CREATE table accountoutlay (id integer primary key autoincrement,category text,"+
                "money double,remark text,date text)";
        db.execSQL(sql);

        //初始化的数据
        initData(db);
    }

    //自动增长的列表,不需要给值;某个字段不想给值,不出现在表名后的列表中
    private void initData(SQLiteDatabase db) {
        //收入类别
        String sql = String.format("insert into accountincometype(category,icon) values(‘工资‘,%d)", R.drawable.fund_icon);
        db.execSQL(sql);
        sql = String.format("insert into accountincometype(category,icon) values(‘奖金‘,%d)", R.drawable.insurance_icon);
        db.execSQL(sql);
        sql = String.format("insert into accountincometype(category,icon) values(‘兼职收入‘,%d)", R.drawable.baby_icon);
        db.execSQL(sql);

        //支出类别
        sql = String.format("insert into accountoutlaytype(category,icon) values(‘交通‘,%d)", R.drawable.traffic_icon);
        db.execSQL(sql);
        sql = String.format("insert into accountoutlaytype(category,icon) values(‘食物‘,%d)", R.drawable.breakfast_icon);
        db.execSQL(sql);
        sql = String.format("insert into accountoutlaytype(category,icon) values(‘图书‘,%d)", R.drawable.book_icon);
        db.execSQL(sql);
        sql = String.format("insert into accountoutlaytype(category,icon) values(‘电影‘,%d)", R.drawable.film_icon);
        db.execSQL(sql);
        sql = String.format("insert into accountoutlaytype(category,icon) values(‘房租‘,%d)", R.drawable.housing_loan_icon);
        db.execSQL(sql);
        sql = String.format("insert into accountoutlaytype(category,icon) values(‘运动‘,%d)", R.drawable.sport_icon);
        db.execSQL(sql);

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String currentDate = sdf.format(new Date());
        //收入明细
        sql = "insert into accountincome(category,money,date) values(‘工资‘,10000,‘"+currentDate+"‘)";
        db.execSQL(sql);
        sql = "insert into accountincome(category,money,date) values(‘奖金‘,1000,‘"+currentDate+"‘)";
        db.execSQL(sql);

        //支出明细
        sql = "insert into accountoutlay(category,money,date) values(‘交通‘,100,‘"+currentDate+"‘)";
        db.execSQL(sql);
        sql = "insert into accountoutlay(category,money,date) values(‘食物‘,200,‘"+currentDate+"‘)";
        db.execSQL(sql);
        sql = "insert into accountoutlay(category,money,date) values(‘图书‘,150,‘"+currentDate+"‘)";
        db.execSQL(sql);
        sql = "insert into accountoutlay(category,money,date) values(‘电影‘,100,‘"+currentDate+"‘)";
        db.execSQL(sql);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

收入数据表:accountincome

收入种类表:accountincometype

支出数据表:accountoutlay

支出种类表:accountoutlaytype

即完成数据表的基本创建。

编写AccountDao.java 文件

package com.example.thorineaccount.db;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.example.thorineaccount.entity.AccountCategory;
import com.example.thorineaccount.entity.AccountItem;

import java.util.ArrayList;
import java.util.List;

public class AccountDao {
    private DatabaseHelper helper;
    private SQLiteDatabase db;
    public AccountDao(Context context){
        //创建数据库
        helper = new DatabaseHelper(context);
        db = helper.getWritableDatabase();
    }

    //收入类型
    public List<AccountCategory> getIncomeType(){
        List<AccountCategory> result = new ArrayList<AccountCategory>();
        String sql = "select id,category,icon from AccountIncomeType";
        Cursor cursor = db.rawQuery(sql, null);
        while (cursor.moveToNext()){
            int id = cursor.getInt(cursor.getColumnIndex("id"));
            String category = cursor.getString(cursor.getColumnIndex("category"));
            int icon = cursor.getInt(cursor.getColumnIndex("icon"));
            AccountCategory c = new AccountCategory(id,category,icon);
            result.add(c);
        }
        cursor.close();
        return result;
    }

    //支出类型
    public List<AccountCategory> getOutlayType(){
        ArrayList<AccountCategory> result = new ArrayList<AccountCategory>();
        String sql = "select id,category,icon from AccountOutlayType";
        Cursor cursor = db.rawQuery(sql, null);
        while (cursor.moveToNext()){
            int id = cursor.getInt(cursor.getColumnIndex("id"));
            String category = cursor.getString(cursor.getColumnIndex("category"));
            int icon = cursor.getInt(cursor.getColumnIndex("icon"));
            AccountCategory c = new AccountCategory(id,category,icon);
            result.add(c);
        }
        cursor.close();
        return result;
    }

    public List<AccountItem> getIncomeList(){
        ArrayList<AccountItem> result = new ArrayList<>();
        Cursor cursor = db.query("AccountIncome",null,null,null,null,null,null);
        while (cursor.moveToNext()){//依次读取,将每次读取的对象加入集合中
            AccountItem item = new AccountItem();
            item.setId(cursor.getInt(cursor.getColumnIndex("id")));
            item.setCategory(cursor.getString(cursor.getColumnIndex("category")));
            item.setMoney(cursor.getDouble(cursor.getColumnIndex("money")));
            item.setDate(cursor.getString(cursor.getColumnIndex("date")));
            item.setRemark(cursor.getString(cursor.getColumnIndex("remark")));
            result.add(item);
        }
        cursor.close();
        return result;
    }

    //支出类型
    public List<AccountItem> getOutlayList(){
        ArrayList<AccountItem> result = new ArrayList<AccountItem>();
        String sql = "select id,category,money,remark,date from AccountOutlay";
        Cursor cursor = db.rawQuery(sql, null);
        while (cursor.moveToNext()){
            AccountItem item = new AccountItem();
            item.setId(cursor.getInt(cursor.getColumnIndex("id")));
            item.setCategory(cursor.getString(cursor.getColumnIndex("category")));
            item.setMoney(cursor.getDouble(cursor.getColumnIndex("money")));
            item.setDate(cursor.getString(cursor.getColumnIndex("date")));
            item.setRemark(cursor.getString(cursor.getColumnIndex("remark")));
            result.add(item);
        }
        cursor.close();
        return result;
    }

    public void addIncome(AccountItem item){
        db.beginTransaction();//开启事务
        try{
            db.execSQL("INSERT INTO AccountIncome(id,category,money,date,remark) VALUES(null,?,?,?,?)",new Object[]{item.getCategory(),item.getMoney(),item.getDate(), item.getRemark()});
            db.setTransactionSuccessful();
        }finally {
            db.endTransaction();//结束
        }
    }

    //添加支出
    public void addOutlay(AccountItem item) {
        db.beginTransaction();
        try {
            db.execSQL("INSERT INTO AccountOutlay(id,category,money,date,remark) VALUES(null,?,?,?,?)",
                    new Object[]{item.getCategory(), item.getMoney(),item.getDate(),item.getRemark()});

            db.setTransactionSuccessful();
        } finally {
            db.endTransaction();
        }
    }
    //删除收入
    public void deleteIncome(long id) {
        String sql = "delete from AccountIncome where id="+id;

        db.beginTransaction();
        try {
            db.execSQL(sql);
            db.setTransactionSuccessful();
        } finally {
            db.endTransaction();
        }

    }

    //添加收入类型
    public void addIncomeCategory(String category,int icon) {
        db.beginTransaction();
        try {
            db.execSQL("INSERT INTO AccountIncomeType(id,category,icon) VALUES(null,?,?)",
                    new Object[]{category,icon});

            db.setTransactionSuccessful();
        } finally {
            db.endTransaction();
        }
    }

    //添加支出3类型
    public void addOutlayCategory(String category,int icon) {
        db.beginTransaction();  //开始事务
        try {
            db.execSQL("INSERT INTO AccountOutlayType(id,category,icon) VALUES(null,?,?)",
                    new Object[]{category,icon});

            db.setTransactionSuccessful();  //设置事务成功完成
        } finally {
            db.endTransaction();    //结束事务
        }
    }
}

完成增删改查等基本操作。

原文地址:https://www.cnblogs.com/dongao/p/12300896.html

时间: 2024-10-08 15:22:00

Android记账本开发(三):数据库开发的相关文章

解决android studio 导快三网站开发入module作为lib使用时不显示的问题

1.快三网站开发 haozbbs.com Q1446595067 将 android module导入 android project 中 这里写图片描述 这里写图片描述2.在要作为lib导入的module 的build.gradle文件中添加一行 "apply plugin: 'android-library"' 这里写图片描述3.在要使用的module中将导入的module作为依赖库 这里写图片描述这里写图片描述若是找不到先前导入的想要作为lib的module,如 这里写图片描述

数据库开发规范

数据库开发规范 数据库开发规范定义:开发规范是针对内部开发的一系列建议或规则. 开发规范本身也包含几部分:基本命名和约束规范,字段设计规范,索引规范,使用规范. 规范存在意义 保证线上数据库schema规范 减少出问题概率 方便自动化管理 规范需要长期坚持,对开发和DBA是一个双赢的事情 想想没有开发规范,有的开发写出各种全表扫描的SQL语句或者各种奇葩SQL语句,我们之前就看过开发写的SQL 可以打印出好几页纸.这种造成业务本身不稳定,也会让DBA天天忙于各种救火. 基本命名和约束规范 表字符

Android深度探索HAL与驱动开发 第三章

Android深度探索HAL与驱动开发 第三章 Git使用入门 读书笔记 Git是对源代码进行管理的软件. 一.安装Git # apt-get install git # apt-get install git-doc git-emall git-gui gitk 用以下命令控制Git: # apt-get install git-core # apt-get install git-doc git-svn git-email git-gui gitk 二.查看Git文档 查看git-check

SQL学习笔记之数据库专题(二):Android下SQL数据库开发

在Android开发 中,数据库是不可缺少的.在Android开发中,用的是一种小型的嵌入式数据库,sqllite.今天会写两篇关于Android开发环境下数据库开发的文章,第一篇先介绍使用android自带的API来实现数据库的使用和管理以及增删改查.数据库升级的相关操作. 一.数据库第一次生成 1.javabean文件的准备 这里以一个Person类为例子来描述 package com.example.freedomsql.bean; import java.io.Serializable;

MVC学习之数据库开发模式:三种开发模式总结:

先介绍下三种开发模式的使用方法: 1.数据库优先: 数据库开发之:数据库优先主要步骤: 1.在数据库中建立好数据库和所需要得到表 2.选中Models文件夹,添加新项目--数据--ADO.NET实体数据模型……在生成数据库页面选着从数据库中生成 在完成2之后,会在web.config里面自动生成数据库连接字符串 3.创建控制器和对应的视图页面 4.在控制器中创建数据上下文实例对象,该对象是通过连接数据库字符串的名字来创建的. 2.代码优先: 数据库开发之代码优先步骤: 1.在Models文件夹中

Android开发——三种活动跳转方式

Android开发——三种活动跳转方式 1. 点击控件跳转 这里用 Button 举例,在布局文件中创建 Button 按钮,在再源码文件中写入活动跳转代码: Button button1 = (Button)findViewById(R.id.button1); button1.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Toast.makeText(MainAc

Android的三种开发类型

请支持原创,尊重原创,转载请注明出处:http://blog.csdn.net/kangweijian(来自kangweijian的csdn博客) Android移植开发 Android移植开发的最终目的是为了开发Android嵌入式产品,从开发者的角度来看,这种类型的开发以具有硬件系统为前提,在硬件系统的基础上构建Android软件系统.这种类型的开发工作在Android系统的底层.在软件系统方面,主要的工作集中在以下两个方面: Linux中的相关设备驱动程序 驱动程序是硬件和上层软件的接口,

Android开发之通过Android的API对sqlite数据库的操作以及数据库事务的练习

一.通过Android的API对sqlite数据库的操作 通过已有的ContentValues类,实例一个对象value来调用其中内部的方法来操作sqlite数据库 代码: package com.example.databasedemo; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sql

Unity3D游戏开发之SQLite让数据库开发更简单

各位朋友大家好.欢迎大家关注我的博客,我是秦元培,我是博客地址是http://blog.csdn.net/qinyuanpei.在经历了一段时间的忙碌后,博主最终有时间来研究新的东西啦,今天博客向和大家一起交流的内容是在Unity3D游戏开发中使用SQLite进行数据库开发.坦白来讲,在我的技术体系中Web和数据库是相对薄弱的两个部分.因此正好这段时间项目须要和server.数据库进行交互,因此在接下来的文章中博主可能会更加倾向于解说这方面的内容,希望大家能够喜欢啊! 一.什么是SQLite?

【Android】Eclipse下搭建安卓开发环境

本文撰写于2015/3/13. 主页:http://www.cnblogs.com/game-testing/ Eclipse下搭建安卓开发环境 写在前边的话: 安卓开发环境多种多样,没有什么优劣可言,习惯的就是最好的. 本文采用Eclipse+ADT+SDK的方式搭建安卓开发环境,同时也方便用于robotium自动化测试. 一.    安装JDK Eclipse启动时需要 JRE.虽然Eclipse自带JDK,但为了避免以后开发和测试过程中出现不必要的麻烦,这里讲述JDK的安装. JDK下载: