简易记账app

本文介绍了一个用于Android平台的账单管理应用的数据库设计实现。该应用包括多个功能模块,如账目分类管理、账单记录、用户管理等,并提供了创建、查询、更新和删除等操作。
public class BilldbHelper {

    private static final String TAG = "Cola_BilldbHelper";

    private static final String DATABASE_NAME = "cola.db";
    
    SQLiteDatabase db;
    Context context;
    
    BilldbHelper(Context _context) {
    	context=_context;
    	db=context.openOrCreateDatabase(DATABASE_NAME, 0, null); 
    	Log.v(TAG,"db path="+db.getPath());
    }
    
    public void CreateTable_acctitem() {
    	try{
	        db.execSQL("CREATE TABLE acctitem ("
	                + "_ID INTEGER PRIMARY KEY,"
	                + "PID integer,"
	                + "NAME TEXT"               
	                + ");");
	        Log.v("cola","Create Table acctitem ok");
        }catch(Exception e){
        	Log.v("cola","Create Table acctitem err,table exists.");
        }
    }
    
    public void CreateTable_bills() {
    	try{
	        db.execSQL("CREATE TABLE bills ("
	                + "_id INTEGER primary key autoincrement,"
	                +" acctitemid integer,"   
	                + "fee integer,"
	                + "userid integer,"
	                + "sdate TEXT,"
	                + "stime TEXT,"
	                + "desc TEXT"                
	                + ");");
	        
	        Log.v("cola","Create Table acctitem ok");
        }catch(Exception e){
        	Log.v("cola","Create Table acctitem err,table exists.");
        }
    }
    
    public boolean Bills_save(int acctid,int fee,int userid,String date,String time,String text){
    	String sql="";
    	try{
    		sql="insert into bills values(null,"+acctid+","+fee+","+userid+",'"+date+"','"+time+"','"+text+"')";
	        db.execSQL(sql);
	        
	        Log.v("cola","insert Table bills ok");
	        return true;
	        
        }catch(Exception e){
        	Log.v("cola","insert Table bills err="+sql);
        	return false;
        }
    }
    
    public void CreateTable_colaconfig() {
    	try{
	        db.execSQL("CREATE TABLE colaconfig ("
	                + "_ID INTEGER PRIMARY KEY,"
	                + "NAME TEXT"            
	                + ");");
	        Log.v("cola","Create Table colaconfig ok");
	    }catch(Exception e){
	    	Log.v("cola","Create Table acctitem err,table exists.");
	    }
    }
    
    public void CreateTable_users() {
    	try{
	        db.execSQL("Create table tusers (_id integer primary key autoincrement," +
					"caption text not null)");
	        Log.v("cola","Create Table users ok");
	        db.execSQL("insert into tusers values (null,'个人')");
	        db.execSQL("insert into tusers values (null,'公司')");
	    }catch(Exception e){
	    	Log.v("cola","Create Table tusers err,table exists.");
	    }
    }
    
    public void InitAcctitem() {
    	try{
    	  //s.getBytes(encoding);
    	  db.execSQL("insert into acctitem values (1,null,'收入')");
          db.execSQL("insert into acctitem values (2,1,'工资')");
          db.execSQL("insert into acctitem values (9998,1,'其他')");
          db.execSQL("insert into acctitem values (0,null,'支出')");
          db.execSQL("insert into acctitem values (3,0,'生活用品')");
          db.execSQL("insert into acctitem values (4,0,'水电煤气费')");
          db.execSQL("insert into acctitem values (5,0,'汽油费')");
          db.execSQL("insert into acctitem values (9999,0,'其他')");
          
          //db.execSQL("insert into bills values(100,135,10000,'','','备注')");
          Log.v("cola","insert into ok"); 
    	}catch(Exception e)
    	{
    		Log.v("cola","init acctitem e="+e.getMessage());
    	}
        
    }
    public void Acctitem_newitem(String text,int type){
    	
    	Cursor c =db.query("acctitem", new String[]{"max(_id)+1"}, "_id is not null and _id<9998", null, null, null, null);
    	c.moveToFirst();
    	int maxid=c.getInt(0);    	
    	String sql="insert into acctitem values ("+maxid+","+type+",'"+text+"')";
    	db.execSQL(sql);
    	Log.v("cola","newitem ok text="+text+" id="+type+" sql="+sql);
    	
    }
    
    public void Acctitem_edititem(String text,int id){    	
    	db.execSQL("update acctitem set name='"+text+"' where _id="+id);
    	Log.v("cola","edititem ok text="+text+" id="+id);
    }
    
    public void Acctitem_delitem(int id){
    	
    	db.execSQL("delete from acctitem where _id="+id);
    	Log.v("cola","delitem ok id="+id);
    }
    
    public void QueryTable_acctitem(){
    	
    }
    
    public void FirstStart(){
    	try{
	    	String col[] = {"type", "name" };
	    	Cursor c =db.query("sqlite_master", col, "name='colaconfig'", null, null, null, null);
	    	int n=c.getCount();
	    	if (c.getCount()==0){
	    		CreateTable_acctitem();
	    		CreateTable_colaconfig();
	    		CreateTable_bills();
	    		CreateTable_users();
	    		InitAcctitem();    		
	    	}	    	
	    	//test();	    	
	    	Log.v("cola","c.getCount="+n+"");
	    	    	
	    	
    	}catch(Exception e){
    		Log.v("cola","e="+e.getMessage());
    	}
    	
    	
    }
    
    
    public void close(){
    	db.close();
    }
    
    public Cursor getParentNode(){
    	return db.query("acctitem", new String[]{"_id", "name","pid" }, "pid is null", null, null, null, "pid,_id");    	
  
    }
    
    public Cursor getChildenNode(String pid){
    	Log.v("cola","run getchildenNode");
   		return db.query("acctitem", new String[]{"_id", "name" }, "pid="+pid, null, null, null, "_id");    	

    }
   
    public Cursor getUserid(){
    	Log.v("cola","run get users cursor");
   		return db.query("tusers", new String[]{"_id", "caption" }, null, null, null, null, null);    	

    }
    
    public Cursor getBills(String date){
    	Log.v("cola","run get bills cursor date="+date);
   		return db.query("bills a,acctitem b", new String[]{"a._id _id","a.rowid rowid", "acctitemid","b.name name","b._id bid","( case when pid=0 then '-' else '' end)||fee/100||'' fee","sdate||' '||stime sdate","desc" }, "a.acctitemid=b._id and a.sdate like '"+date+"%'", null, null, null, null);    	

    }
    
    public void delBills(int id)
    {
    	db.execSQL("delete from bills where _id="+id);
    }
    
    public String getBillsTotal(String date){
    	Log.v("cola","run get bills total cursor");
   		Cursor cur=db.query("bills a,acctitem b", new String[]{"sum(case when b.pid=0 then -fee end)/100||'' out","sum(case when b.pid=1 then fee end)/100||'' infee","sum(case when b.pid=0 then -fee else fee end)/100||'' total"}, "a.acctitemid=b._id and a.sdate like '"+date+"%'",null, null, null, null);    	
   		cur.moveToFirst(); 
   		String s="";
	    while(!cur.isAfterLast()){
	    	
	    	s="当月收入:"+cur.getFloat(1)+" 支出:"+cur.getFloat(0)+" 小计:"+cur.getFloat(2);
	    	cur.moveToNext(); 
	    }
	    return s;
    }
    
    public String test(){
    	try{    		    	   
    		Cursor c2 =getUserid();
    		String ss="";  
    		c2.moveToFirst(); 
    	    while(!c2.isAfterLast()){
    	    	
    	    	ss = c2.getString(0) +", "+ c2.getString(1);
    	    	//byte b[]=c2.getString(1).getBytes();
    	    	
    	    	c2.moveToNext(); 
    	    	
    	    	Log.v("cola","ss="+ss+"");
    		}
    	    	
    	    return ss;
    	}catch(Exception e){
    		Log.v("cola","e="+e.getMessage());
    		return "err";
    	}
    }

package com.cola.ui;

import java.util.Calendar;
import java.util.TimeZone;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.DatePickerDialog;
import android.app.Dialog;
import android.app.TimePickerDialog;
import android.content.ComponentName;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences.Editor;
import android.content.pm.ActivityInfo;
import android.database.Cursor;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.SimpleCursorAdapter;
import android.widget.Spinner;
import android.widget.TextView;
import android.widget.TimePicker;
import android.widget.Toast;

public class Frm_Addbills extends Activity implements OnClickListener {

	EditText edittext_acctitem,EditTextDESC,Fee;
	TextView mDate;
	TextView mTime;
	static final int RG_REQUEST = 0;
	
	private int mYear;
    private int mMonth;
    private int mDay;
    private int mHour;
    private int mMinute;

    Spinner s1;
    Button BtnDate,BtnTime;
    Button BtnCancel,BtnSave;
    
    BilldbHelper billdb;
    
    int acctitemid=-1;

	public void onCreate(Bundle icicle) {
		super.onCreate(icicle);
		setTitle("ColaBox-添加账单");		
		setContentView(R.layout.frm_addbills);
		
		edittext_acctitem = (EditText)findViewById(R.id.edittext_acctitem);		
		edittext_acctitem.setOnClickListener(this);
		
		EditTextDESC=(EditText)findViewById(R.id.EditTextDESC);	
		Fee=(EditText)findViewById(R.id.Fee);	
		
		BtnDate=(Button)findViewById(R.id.BtnDate);
		BtnDate.setOnClickListener(this);
		BtnTime=(Button)findViewById(R.id.BtnTime);
		BtnTime.setOnClickListener(this);
		
		BtnCancel=(Button)findViewById(R.id.BtnCancel);
		BtnCancel.setOnClickListener(this);
		BtnSave=(Button)findViewById(R.id.BtnSave);
		BtnSave.setOnClickListener(this);
		
		mDate = (TextView) findViewById(R.id.vdate);
        mTime = (TextView) findViewById(R.id.vtime);
		
		//Calendar c=Calendar.getInstance(Locale.CHINA);
		initTime();
        
        
        
        setDatetime();
        billdb = new BilldbHelper(this);
        s1=(Spinner) findViewById(R.id.Spinner01);        
        String[] from= new String[]{"caption"};
        int[] to=new int[]{android.R.id.text1};
        Cursor cur=billdb.getUserid();     
        SimpleCursorAdapter mAdapter=new SimpleCursorAdapter(this,android.R.layout.simple_spinner_item, cur,from, to);      
        mAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);           
        s1.setAdapter(mAdapter);
     
        //getBillsTotal
	}

	public boolean onCreateOptionsMenu(Menu menu) {
		super.onCreateOptionsMenu(menu);
		menu.add(0, 1, 0, "账目明细").setIcon(R.drawable.editbills);
		//menu.add(0, 2, 0, "账目统计").setIcon(R.drawable.editbills2);
		//menu.add(0, 3, 0, "账目报表").setIcon(R.drawable.billsum1);
		menu.add(0, 4, 0, "退 出").setIcon(R.drawable.quit);
		menu.add(0, 5, 0, "关于ColaBox");	
		return true;
	}

	public void onClick(View v) {
		if (v.equals(edittext_acctitem)) {
			Log.v("ColaBox", "cmd=edittext_acctitem");
			//test
			Editor sharedata = getSharedPreferences("data", 0).edit();
			sharedata.putString("item","hello getSharedPreferences");
			sharedata.commit();
			
			Intent intent = new Intent();
			intent.setClass(Frm_Addbills.this, Frm_Editacctitem.class);			
			startActivityForResult(intent, RG_REQUEST);
		} else if (v.equals(BtnTime)){
			showDialog(1);
		} else if (v.equals(BtnDate)){
			showDialog(2);
		} else if (v.equals(BtnCancel)){
			cancel();
		} else if (v.equals(BtnSave)){
			save();
		}
		
	}

	public boolean onOptionsItemSelected(MenuItem item) {
		//Log.v("ColaBox", "getmenuitemid=" + item.getItemId());
		switch (item.getItemId()) {
		case 1:
			Intent intent = new Intent();
			//intent.setClass(Frm_Addbills.this, Grid_bills.class);
			intent.setClassName(Frm_Addbills.this,"com.cola.ui.Grid_bills");;
			startActivity(intent);
			return true;
		case 2:
			
			int nOrientation = getRequestedOrientation();  
			if (nOrientation == ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE)  
			  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);  
			else  
			  setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
			    
			return true;
		case 3:
			 Intent i = new Intent(); 
             i.setClass(Frm_Addbills.this, LocalService.class); 
             ComponentName compName = startService(i); 
             if (compName == null) 
             { 
                     Log.e("main_Service", "startService() failed!"); 
             } 
			//startService(new Intent(Frm_Addbills.this,mainService.class));
			return true;
		case 4:
			QuitApp();
			return true;
		case 5:
			  new AlertDialog.Builder(this) 
			    .setTitle("ColaBox") 
			    .setMessage("作者:UntosiL Email:untosil@gmail.com Blog:blog.youkuaiyun.com/untosil") 
			    .show();
			return true;
		}
		return false;
	}

    
    
	public void QuitApp() {
		new AlertDialog.Builder(Frm_Addbills.this).setTitle("提示").setMessage(
				"确定退出?").setIcon(R.drawable.quit).setPositiveButton("确定",
				new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int whichButton) {	
						billdb.close();
						finish();
					}
				}).setNegativeButton("取消",
				new DialogInterface.OnClickListener() {
					public void onClick(DialogInterface dialog, int whichButton) {
					}
				}).show();

	}

	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		if (requestCode == RG_REQUEST) {
			if (resultCode == RESULT_CANCELED) {
				// setTitle("Canceled...");
			} else if (resultCode == RESULT_OK) {
				// setTitle((String)data.getCharSequenceExtra("DataKey"));
				edittext_acctitem.setText((String) data.getCharSequenceExtra("name"));
				acctitemid=Integer.parseInt((String)data.getCharSequenceExtra("id"));
				Log.v("cola","get acctitemid="+acctitemid);
				
			}
		}
	}
	
	private void cancel(){
		Log.v("cola","u put cancel btn");
		edittext_acctitem.setText("");
		Fee.setText("");
		acctitemid=-1;
		initTime();setDatetime();
		EditTextDESC.setText("");
	}
	private void save(){
		Log.v("cola","u put save btn");
		if (acctitemid==-1){
			new AlertDialog.Builder(this)
			    .setMessage("请首先选择账目.")
			    .show();
			return;
		}
		int fee=0;
		String s=Fee.getText().toString();
		int pos=s.indexOf(".");
		//Log.v("cola","i="+(s.length()-pos));
		if (pos>0){	
			if (s.length()-pos<3){
				s=s+"0";
			}
			fee=Integer.parseInt(s.substring(0,pos)+s.substring(pos+1,pos+3));		
		}else{			
		    fee=Integer.parseInt(s)*100;
			
		}
		Log.v("cola","u put save btn");		
		if (billdb.Bills_save(acctitemid,fee,(int)s1.getSelectedItemId(), ((TextView)mDate).getText().toString(), ((TextView)mTime).getText().toString(),EditTextDESC.getText().toString())){
			Toast.makeText(this, "保存成功.", Toast.LENGTH_SHORT).show(); 
			cancel();
		}else{
			Toast.makeText(this, "保存失败,请检查数据.", Toast.LENGTH_SHORT).show(); 
		}
	}

    
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		
		switch (keyCode) {
		case KeyEvent.KEYCODE_BACK:
			QuitApp();
			return true;
			
		}
		return false;
	}
	private void initTime(){
		Calendar c = Calendar. getInstance(TimeZone.getTimeZone("GMT+08:00"));
		mYear = c.get(Calendar.YEAR);
        mMonth = c.get(Calendar.MONTH)+1;
        mDay = c.get(Calendar.DAY_OF_MONTH);
        mHour = c.get(Calendar.HOUR_OF_DAY);
        mMinute = c.get(Calendar.MINUTE);
	}
	
	private void setDatetime(){
		mDate.setText(mYear+"-"+mMonth+"-"+mDay);
        mTime.setText(pad(mHour)+":"+pad(mMinute));
	}
	
	@Override
    protected Dialog onCreateDialog(int id) {
        switch (id) {
            case 1:
                return new TimePickerDialog(this,
                        mTimeSetListener, mHour, mMinute, false);
            case 2:
                return new DatePickerDialog(this,
                            mDateSetListener,
                            mYear, mMonth-1, mDay);
        }
        return null;
    }

    @Override
    protected void onPrepareDialog(int id, Dialog dialog) {
        switch (id) {
            case 1:            	
                ((TimePickerDialog) dialog).updateTime(mHour, mMinute);
                break;
            case 2:
                ((DatePickerDialog) dialog).updateDate(mYear, mMonth-1, mDay);
                break;
        }
    }    
	
    private DatePickerDialog.OnDateSetListener mDateSetListener =
        new DatePickerDialog.OnDateSetListener() {

            public void onDateSet(DatePicker view, int year, int monthOfYear,
                    int dayOfMonth) {
                mYear = year;
                mMonth = monthOfYear+1;
                mDay = dayOfMonth;

                setDatetime();
            }
        };

    private TimePickerDialog.OnTimeSetListener mTimeSetListener =
        new TimePickerDialog.OnTimeSetListener() {

            public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
                mHour = hourOfDay;
                mMinute = minute;
                setDatetime();
            }
        };
    private static String pad(int c) {
            if (c >= 10)
                return String.valueOf(c);
            else
                return "0" + String.valueOf(c);
        }        
}

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值