进度5_家庭记账本App_数据库的添加和查看
今天继续在昨天的基础上完成了家庭记账单的在数据库中的添加和查看功能
在之前的基础上舍弃了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_家庭记账本App
今天完成了昨天的初步构想,详细介绍见上一篇博客,具体项目结构和案例如下: MainActivity.java: package com.example.familybooks; import andr ...
- 进度4_家庭记账本App
在上一个博客中,我学习了用Fragment进行数据的传值,但是出现了好多问题,我通过百度查阅资料发现fregment在进行数值传输的时候有的语法不能使用,并且不方便的进行数据库的使用,所以我在原来的家 ...
- 进度3_家庭记账本App_Fragment使用SQLite实现简单存储及查询
AddFragment.java: package com.example.familybooks; import android.content.ContentValues; import andr ...
- 进度2_家庭记账本App
今天在昨天的基础上,相继完成了三个页面的布局和显示情况: 新增加的xml文件如下: activity_add.xml: <?xml version="1.0" encodin ...
- 家庭记账本app进度之关于tap的相关操作1
今天还主要学习关于怎样制作微信的先关的tap. 今天的主要成果是已经了解了相关的技术,以及相关的思路.代码经过一个下午的编写,基本接近尾声. 更详细的实验代码,以及相关的知识点将在明天完善后进行发表. ...
- 家庭记账本app进度之android中AlertDialog的相关应用以及对日期时间的相关操作(应用alertdialog使用的谈话框)
对于AlertDialog的相关知识: 1.创建构造器AlertDialog.Builder的对象: 2.通过构造器对象调用setTitle.setMessage.setIcon等方法构造对话框 ...
- 家庭记账本app进度之对于登录和注册两个界面点击按钮的相互跳转
这次主要完成了两个两个android页面之间的跳转.从登录页面点击注册就会跳转到注册页面.在注册页面点击返回登录,这样就可以返回到登录界面.主要是这样的操作.其中遇到了一个困难主要是当点击按钮的时候, ...
- 家庭记账本app进度之ui相关概念控制ui界面与布局管理
ui就是用户界面设计的意思. 首先是view,view相当于窗户上的玻璃. 1.android:id属性.android:id="@+id/user".他的id是user前面的@+ ...
- 家庭记账本app进度之下拉框和数字转轮的相关应用
这次主要是悬系的下拉框Spinner和数字转轮NumberPicker的使用.先分析相关的用到的知识点. 在Android中,用string-array是一种简单的提取XML资源文件数据的方法. 例子 ...
随机推荐
- 使用SpringMVC时,web应用的资源路径问题
web应用常见的资源存方式 在WEB-INF下新建lib,存放要使用的jar包 在WEB-INF下新建jsp文件夹,存放jsp文件.首页除外,首页就放到web下. 在web下,或WEB-INF下,新建 ...
- Java导出Excel(项目实战Demo)
Controller 层 /** * 考勤机刷卡明细导出Excel * * @throws Exception */ // @RequiresPermissions("report:Expo ...
- python2中新式类和经典类的多重继承调用顺序
class A: def foo(self): print('called A.foo()') class B(A): pass class C(A): def foo(self): print('c ...
- 【Unity】鼠标指向某物体,在其上显示物体的名字等等等等信息
之前一直用NGUI HUD Text插件做这个功能,感觉一个小功能就导一个插件进来简直丧心病狂.然后就自己写了一个~ Camera cam;//用于发射射线的相机 Camera UIcam;//UI层 ...
- sklearn的train_test_split()各函数参数含义解释(非常全)
sklearn之train_test_split()函数各参数含义(非常全) 在机器学习中,我们通常将原始数据按照比例分割为“测试集”和“训练集”,从 sklearn.model_selection ...
- i春秋-密码-IceCTF-Alien Message
题目: 对应的解题图片: 解的时候,符号大点的是大写,小点的是小写. IceCTF{gOOd_n3wZ_3vERyoN3_1_L1k3_fU7ur4Ma_4nd_tH3iR_4maZ1nG_3As7e ...
- PostGIS 常用函数中文介绍说明
1.OGC标准函数 管理函数: 添加几何字段 AddGeometryColumn(, , , , , ) 删除几何字段 DropGeometryColumn(, , ) 检查数据库几何字段并在geom ...
- springboot内嵌定时任务使用及cron表达式讲解
第一步:pom引入依赖 <dependencies> <dependency> <groupId>org.springframework.boot</grou ...
- CodeForces - 869A The Artful Expedient
题意:有两个序列X和Y,各含n个数,这2n个数互不相同,若满足xi^yj的结果在序列X内或序列Y内的(xi,yj)对数为偶数,则输出"Karen",否则输出"Koyomi ...
- 新闻网大数据实时分析可视化系统项目——17、Spark2.X分布式弹性数据集
1.三大弹性数据集介绍 1)概念 2)优缺点对比 2.Spark RDD概述与创建方式 1)概述 在集群背后,有一个非常重要的分布式数据架构,即弹性分布式数据集(resilientdistribute ...