安卓 Android之开发简单小应用(二)
16lz
2021-01-26
安卓 Android之开发简单小应用(二)
一、简述
学生籍贯管理小应用练习,简单的一个小应用,用SQLite数据库进行数据存储。
源文件打包:(附带txt文件存储版本)
链接:https://pan.baidu.com/s/1iyev4ix7Jp5EXywKbB9QAg 密码:2zy5
二、效果
三、工程结构
四、源码文件
AddActivity.java文件
package com.example.stunpmng;import android.os.Bundle;import android.annotation.SuppressLint;import android.app.Activity;import android.content.Intent;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.Spinner;import android.widget.Toast;@SuppressLint("NewApi") public class AddActivity extends Activity implements OnClickListener{private EditText _edtid,_edtname;//学号、姓名文本框private Spinner _spNP;//籍贯下拉选择框@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_add);//设置布局//获取控件对象Button btncel = (Button)findViewById(R.id.btn_cel);Button btnsur = (Button)findViewById(R.id.btn_sur);Button btnback = (Button)findViewById(R.id.btn_back);//监听单击事件btncel.setOnClickListener(this);btnsur.setOnClickListener(this);btnback.setOnClickListener(this);//成员变量初始化_edtid = (EditText)findViewById(R.id.edt_id);_edtname = (EditText)findViewById(R.id.edt_name);_spNP = (Spinner)findViewById(R.id.spn_np);}@Overridepublic boolean onCreateOptionsMenu(Menu menu) {// Inflate the menu; this adds items to the action bar if it is present.getMenuInflater().inflate(R.menu.add, menu);return true;}@Overridepublic void onClick(View arg) {//处理单击事件switch (arg.getId()) { case R.id.btn_cel://取消按钮 case R.id.btn_back://返回按钮 //返回、并设置结果码为1 setResult(1,(new Intent()).setAction("MainActivity.class")); finish();//关闭当前页面 break; case R.id.btn_sur://确定按钮 String stu_num = _edtid.getText().toString().trim();//获取学号输入框的内容,并去掉前后空格 String stu_name = _edtname.getText().toString().trim();//获取姓名输入框的内容,并去掉前后空格 String NP = (String) _spNP.getSelectedItem();//获取籍贯下拉框选中的文本 Student st = new Student(null,stu_num,stu_name,NP);//根据输入信息创建新的对象 if(stu_num.isEmpty() || stu_name.isEmpty())//学号、姓名不能为空 { //弹出小黑框提示,一会儿自动消失 Toast.makeText(this,"学号、姓名不能为空",Toast.LENGTH_SHORT).show(); } else { StuInfoDao dao = new StuInfoDao(this);//获取数据库操作类 //System.out.println(stu_num+"--"+stu_name+"--"+NP); boolean b = dao.insert(st);//添加到数据库 if(b) { //添加成功,提示信息 Toast.makeText(this,"添加成功!",Toast.LENGTH_SHORT).show(); } } break;}}}
MainActivity.java文件
package com.example.stunpmng;import java.util.ArrayList;import java.util.List;import android.annotation.SuppressLint;import android.app.Activity;import android.app.AlertDialog;import android.content.DialogInterface;import android.content.Intent;import android.graphics.Color;import android.os.Bundle;import android.text.InputFilter;import android.text.InputType;import android.view.Gravity;import android.view.Menu;import android.view.View;import android.view.View.OnClickListener;import android.view.View.OnLongClickListener;import android.widget.Button;import android.widget.EditText;import android.widget.GridLayout;import android.widget.TableLayout;import android.widget.TableRow;import android.widget.TextView;import android.widget.Toast;@SuppressLint("NewApi") public class MainActivity extends Activity implements OnClickListener{public List list = new ArrayList();//用来存放所有的学生对象private TableLayout table;//用来展示数据private int index;//index是分页查询的起始索引 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);//设置布局 //根据ID获取控件的对象,ID在对应的布局文件可以查看,或者是在属性页面也有 Button btnadd = (Button)findViewById(R.id.btn_add); Button btnsch = (Button)findViewById(R.id.btn_sch); Button btnnext = (Button)findViewById(R.id.btn_next); Button btnup = (Button)findViewById(R.id.btn_up); Button btnclr = (Button)findViewById(R.id.btn_clr); Button btnrfl = (Button)findViewById(R.id.btn_rfl); Button btnexit = (Button)findViewById(R.id.btn_exit); Button btnout = (Button)findViewById(R.id.btn_out); table = (TableLayout)findViewById(R.id.tab_show); table.setBackgroundColor(Color.GREEN);//设置背景色 //监听按钮的点击事件,(意思就是当单击控件时本页面能够监听到并且响应 ) btnadd.setOnClickListener(this); btnsch.setOnClickListener(this); btnnext.setOnClickListener(this); btnup.setOnClickListener(this); btnclr.setOnClickListener(this); btnrfl.setOnClickListener(this); btnexit.setOnClickListener(this); btnout.setOnClickListener(this); index = 0;//刚开始时从第一条数据开始展示 Read();//读取数据库数据,存放到list集合中 Show(index);//根据索引展示数据 } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main, menu); return true; }@Overridepublic void onClick(View arg) {//处理点击事件switch (arg.getId()) { case R.id.btn_add://添加按钮 Intent intent = new Intent(MainActivity.this,AddActivity.class);//跳转到添加信息页面 startActivityForResult(intent, 1);//设置请求码为1 break; case R.id.btn_rfl://刷新按钮 table.removeAllViews();//清空table数据 Read();//重新读取数据库数据,放到list集合中 Show(index);//根据当前索引展示数据 break; case R.id.btn_sch://查询按钮 EditText edtsch = (EditText)findViewById(R.id.edt_sch);//根据ID获取到文本输入对象 String target = edtsch.getText().toString().trim();//获取到文本输入框的内容并且去掉前后的空格 //Toast.makeText(this,"search:"+target,Toast.LENGTH_SHORT).show(); Read();//重新读取数据库数据,放到list集合中 if(target.isEmpty())//如果搜索文本为空,那么显示全部 { Show(index); } else//搜索文本不为空 { for(int i=0;i=list.size()){start = list.size()-list.size()%5;}if(start<0){start = 0;}int end = start+5;if(end >list.size()){end = list.size();}table.removeAllViews();//清空table数据for(int i=start;i=list.size()){return true;}//弹出编辑框AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);builder.setTitle("操作"); //设置标题//创建一个网格布局,用来放置两个标签、两个输入框 GridLayout grid = new GridLayout(MainActivity.this); grid.setColumnCount(2);//设置网格的列数 TextView viewNP = new TextView(MainActivity.this);//创建籍贯标签 viewNP.setText("籍贯:"+list.get(n).getNP());//设置文本 grid.addView(viewNP, 0);//将籍贯标签添加到网格布局的第1列 TextView viewname = new TextView(MainActivity.this);//创建姓名标签 viewname.setText("姓名:");//设置标签文本 edtname = new EditText(MainActivity.this);//创建一个输入框 edtname.setSingleLine();//设置单行输入 edtname.setFilters(new InputFilter[]{ new InputFilter.LengthFilter(4)//设置输入长度 }); //viewname.setLeft(0); edtname.setText(list.get(n).getName());//设置文本框内容 grid.addView(viewname, 0);//将姓名标签添加到网格布局中 grid.addView(edtname, 1);//将文本框添加到网格布局中 TextView viewid = new TextView(MainActivity.this);//创建学号标签 viewid.setText("学号:"); edtid = new EditText(MainActivity.this);//创建学号输入框 edtid.setSingleLine();//设置为单行输入 edtid.setFilters(new InputFilter[]{ new InputFilter.LengthFilter(4)//设置输入长度 }); edtid.setInputType(InputType.TYPE_CLASS_NUMBER);//设置为只能输入数字 edtid.setText(list.get(n).getNum());//设置文本 grid.addView(viewid, 0);//将学号标签添加到网格布局 grid.addView(edtid, 1);//将学号输入框添加到网格布局 builder.setView(grid);//将网格布局添加到对话框中 builder.setNegativeButton("取消",null); //添加取消按钮 //添加一个删除按钮,并添加点击事件处理 builder.setNeutralButton("删除", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String sid = list.get(n).getId();//获取长按项对应的学生ID StuInfoDao dao = new StuInfoDao(MainActivity.this);//创建数据库操作类 //list.clear();//清空集合 //list = dao.search();//读取数据库,并将数据填充到list dao.delete(sid);//删除ID对应的学生信息 table.removeAllViews();//清除table数据 Read();//读取数据库,并将数据填充到list Show(index);//刷新,根据索引值显示数据 //弹出小黑框提示删除成功,一会儿自动隐去 Toast.makeText(MainActivity.this,"删除成功!",Toast.LENGTH_SHORT).show(); } }); //添加修改按钮,并添加点击事件处理 builder.setPositiveButton("修改", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { String sid = list.get(n).getId();//获取长按项对应的学生ID String stu_num = edtid.getText().toString().trim();//获取修改后的学号,并去掉前后空格 String stu_name = edtname.getText().toString().trim();//获取修改后的姓名,并去掉前后空格 if(stu_num.isEmpty() || stu_name.isEmpty())//如果修改后的学号或姓名为空 { //提示不能为空 Toast.makeText(MainActivity.this,"学号、姓名不能为空!",Toast.LENGTH_SHORT).show(); } else//修改后的数据合法 { //根据修改后的信息,新建一个student对象 Student st = new Student(sid,stu_num,stu_name,list.get(n).getNP()); StuInfoDao dao = new StuInfoDao(MainActivity.this);//创建数据库操作类 dao.update(st);//更新数据 table.removeAllViews();//清空table数据 Read();//读取数据库,并将数据填充到list Show(index);//刷新,根据索引值显示数据 //提示修改成功 Toast.makeText(MainActivity.this,"修改成功!",Toast.LENGTH_SHORT).show(); } } }); builder.show(); //弹出编辑框return true;}}}
MySQLHelper.java文件
package com.example.stunpmng;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class MySQLHelper extends SQLiteOpenHelper {public MySQLHelper(Context context) {super(context, "mydatabase.db", null, 1);//创建mydatabase.db数据库,版本号为1}@Overridepublic void onCreate(SQLiteDatabase db) {//创建studentNP表 _id字段为主键,自增 ,num字段存储学号、varchar类型,长度为8,name字段存储姓名,类型为varchar,长度为8,np字段存储籍贯,类型为varchar,长度为64db.execSQL("create table studentNP (_id integer primary key autoincrement, num varchar(8),name varchar(8),np varchar(64))");}@Overridepublic void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {// TODO Auto-generated method stub}}
Student.java文件
package com.example.stunpmng;public class Student {private String id;//IDprivate String num;//学号private String name;//姓名private String np;//籍贯名//下面的是属性 (对字段的保护)public String getId() {return id;}public void setId(String id) {this.id = id;}public String getNum() {return num;}public void setNum(String num) {this.num = num;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getNP() {return np;}public void setNP(String np) {this.np = np;}//有参构造函数 (方便构造对象)public Student(String id,String num,String name, String np) {super();this.id = id;this.num = num;this.name = name;this.np = np;}//无参构造对象 (如果有有参构造函数,最好加上无参构造函数)public Student() {super();}@Override //重写toString()方法,将一个对象的数据信息变为字符串格式,方便存储到txt文件中public String toString() {return num + "-" + name + "-" + np;}}
StuInfoDao.java文件
package com.example.stunpmng;import java.util.ArrayList;import java.util.List;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;public class StuInfoDao {MySQLHelper helper;//成员变量public StuInfoDao(Context context){helper = new MySQLHelper(context);//创建一个SQLHelper}public boolean insert(Student st){//添加操作//拿到 工具类的实例 , 然后去操作 数据库 SQLiteDatabase db = helper.getWritableDatabase();//执行 sql 语句 主键自增,不用设置db.execSQL("insert into studentNP values(null,?,?,?)",new Object[]{st.getNum(),st.getName(),st.getNP()});return true;}public void delete(String id){//根据ID删除信息SQLiteDatabase db = helper.getWritableDatabase();db.execSQL("delete from studentNP where _id=?",new Object[]{id});}public void deleteTab(boolean isDrop){//清空表数据,或删除表,此处是为了方便程序测试,因为可能编写过程中不合法的数据也添加进去了,需要进行清空操作SQLiteDatabase db = helper.getWritableDatabase();if(isDrop){db.execSQL("drop table studentNP ");//删除表}else{db.execSQL("delete from studentNP ");//清空表的数据}}public void update(Student st){//根据对象进行更新操作SQLiteDatabase db = helper.getWritableDatabase();db.execSQL("update studentNP set num=?,name=?,np=? where _id=?", new Object[]{st.getNum(),st.getName(),st.getNP(),st.getId()});}public Student find(String id){//根据ID进行查找对应的student信息,例子中没有用到SQLiteDatabase db = helper.getReadableDatabase();Cursor cursor = db.rawQuery("select * from studentNP where _id=?", new String[]{id});boolean result = cursor.moveToNext();//是否有下一条数据Student st = null;if(result){int _id = cursor.getInt(cursor.getColumnIndex("_id"));//获取IDString snum = cursor.getString(cursor.getColumnIndex("num"));//获取学号String name = cursor.getString(cursor.getColumnIndex("name"));//获取姓名String sex = cursor.getString(cursor.getColumnIndex("np"));//获取籍贯st = new Student(String.valueOf(_id),snum,name,sex);//将数据放入新的对象}// 最后会释放 资源 cursor.close();return st;}public List search(){//查询所有的信息SQLiteDatabase db = helper.getReadableDatabase();List list = new ArrayList();list.clear();//清空数据//查询全部数据 Cursor cursor = db.rawQuery("select * from studentNP" ,null); while(cursor.moveToNext()){ int _id = cursor.getInt(cursor.getColumnIndex("_id"));String snum = cursor.getString(cursor.getColumnIndex("num"));String name = cursor.getString(cursor.getColumnIndex("name"));String sex = cursor.getString(cursor.getColumnIndex("np"));Student st = new Student(String.valueOf(_id),snum,name,sex);list.add(st);//将新对象添加到list集合} //System.out.println("数目:"+list.size());// 最后会释放 资源 cursor.close();return list;//将所有信息返回}}
TextFile.java文件
package com.example.stunpmng;import java.io.BufferedWriter;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import android.os.Environment;public class TxtFile {//保存文件工具类 //fileName:文件名称 content:文件内容 isAppend:是否追加(否则覆盖)public static boolean Save(String fileName,String content,boolean isAppend) { //在文本文本中追加内容 String sdCardDir =Environment.getExternalStorageDirectory().getAbsolutePath();File file = new File(sdCardDir,fileName);//System.out.println(sdCardDir);BufferedWriter out = null; try { if(!file.exists())//如果文件不存在 { file.createNewFile();//创建文件 } FileOutputStream outStream = new FileOutputStream(file,isAppend); outStream.write(content.getBytes()); outStream.close();//记得关闭流 System.out.println("save success!"); return true; } catch (Exception e) { e.printStackTrace(); } finally { try { if(out != null){ out.close(); } } catch (IOException e) { e.printStackTrace(); } }return false; } }
五、总结
1、添加SDcard读写权限
2、打开File Explorer窗口 (虚拟设备的文件列表)
3、下拉框的选项内容在activity_add.xml布局文件中
更多相关文章
- 一句话锁定MySQL数据占用元凶
- Android之 Viewpager
- 第八次课——数据存储方式
- android mtk6592 添加led三色灯,红色蓝色绿色
- android Activity关闭动画 附左右动画anim
- lobiner 关于android中的sqlite数据库操作
- Android中SharePreferences的简单实现
- Android布局管理器-使用TableLayout表格布局管理器实现简单的用
- 在Android中afinal框架下实现sqlite数据库版本升级的办法