今天继续在昨天的基础上完成了家庭记账单的在数据库中的添加和查看功能

在之前的基础上舍弃了Fragment,重新在百度上找到了学习资料,并且自我完成了实践

首先在之前的基础上创建CostListAdapter.java,并根据提示创建四个方法:

package com.example.familybook;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView; import java.util.List; 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.mTvCostMoney=(TextView)convertView.findViewById(R.id.tv_cost);
viewHolder.mTvCostDate=(TextView)convertView.findViewById(R.id.tv_date);
convertView.setTag(viewHolder);
}
else{
viewHolder=(ViewHolder)convertView.getTag();
} //取出Bean对象
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;
}
}

新建DatabaseHelper继承自SQLiteHelper,创建新的数据库和相关的信息表,这和之前的博客一样

package com.example.familybook;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper; import androidx.annotation.Nullable; public class DatabaseHelper extends SQLiteOpenHelper {
public static final String COST_MONEY = "cost_money";
public static final String COST_DATE = "cost_date";
public static final String COST_TITLE = "cost_title";
public static final String ACCOUNT_COST = "account_cost" ; public DatabaseHelper(@Nullable Context context) {
super(context, "account_daily", null, 1);
} @Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table if not exists account_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(ACCOUNT_COST,null,cv);
} //查询
public Cursor getAllCostData(){
SQLiteDatabase database=getWritableDatabase();
return database.query(ACCOUNT_COST ,null,null,null,null,null,COST_DATE+" ASC");
} //删除
public void deleteAllData(){
SQLiteDatabase database=getWritableDatabase();
database.delete("account_cost",null,null);
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { }
}

最后在主函数中添加点击事件,以及功能,并使用fab

package com.example.familybook;

import android.content.DialogInterface;
import android.database.Cursor;
import android.os.Bundle; import com.google.android.material.floatingactionbutton.FloatingActionButton;
import com.google.android.material.snackbar.Snackbar; import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.appcompat.widget.Toolbar; import android.renderscript.Script;
import android.view.LayoutInflater;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.DatePicker;
import android.widget.EditText;
import android.widget.ListView; import java.util.ArrayList;
import java.util.List; public class MainActivity extends AppCompatActivity { private List<CostBean> mCostBeanList;
private DatabaseHelper mDatabaseHelper;
private CostListAdapter adapter; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = findViewById(R.id.toolbar);
setSupportActionBar(toolbar); mDatabaseHelper=new DatabaseHelper(this);
mCostBeanList=new ArrayList<>(); //给ListView设置写好的适配器
ListView costList=(ListView)findViewById(R.id.lv_main);
initCostData();
adapter=new CostListAdapter(this,mCostBeanList);
costList.setAdapter(adapter); 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("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) { CostBean costBean=new CostBean();
costBean.costTitle=title.getText().toString();
costBean.costMoney=money.getText().toString();
costBean.costDate=date.getYear()+"-"+(date.getMonth()+1)+"-"+
date.getDayOfMonth();
mDatabaseHelper.insertCost(costBean);//调用插入函数
mCostBeanList.add(costBean);
adapter.notifyDataSetChanged();//时时刷新界面
}
});
builder.setNegativeButton("返回",null);
builder.create().show();//没有他触发事件不会显示出来
}
});
} private void initCostData() {
// mDatabaseHelper.deleteAllData();
// for (int i=0;i<6;i++) {
// CostBean costBean = new CostBean();
// costBean.costTitle = i+"mock";
// costBean.costDate = "11-11";
// costBean.costMoney = "20";
//mCostBeanList.add(costBean);
// mDatabaseHelper.insertCost(costBean);
// }
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"));
mCostBeanList.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) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId(); //noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
} return super.onOptionsItemSelected(item);
}
}

在网上学习的资料虽然分块化明显,有制作家庭记账本的简单思路和步骤,但是在我真正实践起来却有很多的麻烦,也遇到了很多问题,这些问题也弄了很长时间,在其中真的意识到了编写代码边测试的重要性

问题一:当运行成功后,弹出添加新账单按钮的时候,点击确定添加,界面不做出任何反应,并且不显示添加的内容,这个问题解决了很长时间

原因:在主函数中没有用builder调用show函数,通过查阅资料发现,如果在主函数中完成添加后,不写语句,会导致触发事件没有反应。

问题二:当触发事件有反应但是没有添加成功,自己所添加的信息无法显示

 原因:和上一个问题出现在相同的位置,当从new_cost_data.xml界面获取到所填信息之后,没有书写添加语句,即

问题三:和问题二有相同之处,但是不同的是,他完成了添加,但是只有在重启页面或者重新运行代码的时候才会显示更新添加的新帐单的内容

查找原因过程和思路:这就说明了数据库的添加和查看没有了问题。百度发现了一个之前从没有见过的问题,为时时更新数据,

原因:主函数中,没有书写时时更新数据的代码

在新建界面的时候会自动生成这样的代码,选中右键——Refactor——Extract——Field新建类为adapter,有的版本为mAdapter,将其装换成一下代码

然后将数据读取添加后在书写时时刷新界面的代码

运行结果:

  

进度5_家庭记账本App_数据库的添加和查看的更多相关文章

  1. 进度1_家庭记账本App

    今天完成了昨天的初步构想,详细介绍见上一篇博客,具体项目结构和案例如下: MainActivity.java: package com.example.familybooks; import andr ...

  2. 进度4_家庭记账本App

    在上一个博客中,我学习了用Fragment进行数据的传值,但是出现了好多问题,我通过百度查阅资料发现fregment在进行数值传输的时候有的语法不能使用,并且不方便的进行数据库的使用,所以我在原来的家 ...

  3. 进度3_家庭记账本App_Fragment使用SQLite实现简单存储及查询

    AddFragment.java: package com.example.familybooks; import android.content.ContentValues; import andr ...

  4. 进度2_家庭记账本App

    今天在昨天的基础上,相继完成了三个页面的布局和显示情况: 新增加的xml文件如下: activity_add.xml: <?xml version="1.0" encodin ...

  5. 家庭记账本app进度之关于tap的相关操作1

    今天还主要学习关于怎样制作微信的先关的tap. 今天的主要成果是已经了解了相关的技术,以及相关的思路.代码经过一个下午的编写,基本接近尾声. 更详细的实验代码,以及相关的知识点将在明天完善后进行发表. ...

  6. 家庭记账本app进度之android中AlertDialog的相关应用以及对日期时间的相关操作(应用alertdialog使用的谈话框)

    对于AlertDialog的相关知识: 1.创建构造器AlertDialog.Builder的对象:    2.通过构造器对象调用setTitle.setMessage.setIcon等方法构造对话框 ...

  7. 家庭记账本app进度之对于登录和注册两个界面点击按钮的相互跳转

    这次主要完成了两个两个android页面之间的跳转.从登录页面点击注册就会跳转到注册页面.在注册页面点击返回登录,这样就可以返回到登录界面.主要是这样的操作.其中遇到了一个困难主要是当点击按钮的时候, ...

  8. 家庭记账本app进度之ui相关概念控制ui界面与布局管理

    ui就是用户界面设计的意思. 首先是view,view相当于窗户上的玻璃. 1.android:id属性.android:id="@+id/user".他的id是user前面的@+ ...

  9. 家庭记账本app进度之下拉框和数字转轮的相关应用

    这次主要是悬系的下拉框Spinner和数字转轮NumberPicker的使用.先分析相关的用到的知识点. 在Android中,用string-array是一种简单的提取XML资源文件数据的方法. 例子 ...

随机推荐

  1. 「JSOI2007」建筑抢修

    传送门 Luogu 解题思路 显然先把所有楼按照报废时间递增排序. 然后考虑 \(1\cdots i-1\) 都能修完, \(i\) 修不完的情况. 显然我们在这 \(i\) 个里面至多只能修 \(i ...

  2. 统计学习方法——KD树最近邻搜索

    李航老师书上的的算法说明没怎么看懂,看了网上的博客,悟出一套循环(建立好KD树以后的最近邻搜索),我想应该是这样的(例子是李航<统计学习算法>第三章56页:例3.3): 步骤 结点查询标记 ...

  3. jQuery新的事件绑定机制on()示例应用

    投稿:whsnow 字体:[增加 减小] 类型:转载   从jQuery1.7开始,jQuery引入了全新的事件绑定机制,on()和off()两个函数统一处理事件绑定,下面通过示例为大家介绍下     ...

  4. 使用Hibernate+MySql+native SQL的BUG,以及解决办法

      本来是mssql+hibernate+native SQL 应用的很和谐 但是到了把mssql换成mysql,就出了错(同样的数据结构和数据). 查询方法是: String sql = " ...

  5. sklearn的train_test_split()各函数参数含义解释(非常全)

    sklearn之train_test_split()函数各参数含义(非常全) 在机器学习中,我们通常将原始数据按照比例分割为“测试集”和“训练集”,从 sklearn.model_selection ...

  6. 常用keycode列表

    KEYCODE列表 电话键   KEYCODE_CALL 拨号键 5 KEYCODE_ENDCALL 挂机键 6 KEYCODE_HOME 按键Home 3 KEYCODE_MENU 菜单键 82 K ...

  7. 编写第一个JavaScript程序

    编写第一个程序 在 HTML 页面中嵌入 JavaScript 脚本需要使用 <script> 标签,用户可以在 <script> 标签中直接编写 JavaScript 代码, ...

  8. MySQL学习之SQL基础(一)DDL

    Sql基础 DDL (data defination language) 创建表 CREATE TABLE emp( ename varchar(10), hiredate date, sal dec ...

  9. Elasticsearch学习入门

    一.关于Elasticsearch 1.特点 Elasticsearch基于全文搜索引擎 Apache Lucene ,由Java开发而来,面向API进行搜索, Restful 风格,分布式文件存储. ...

  10. java 接口 2.19

    接口中所有的方法都是抽象的和public的,所有的属性都是public,static,final的.