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();    //結束事務
        }
    }
}

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM