安卓 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布局文件中

更多相关文章

  1. 一句话锁定MySQL数据占用元凶
  2. Android之 Viewpager
  3. 第八次课——数据存储方式
  4. android mtk6592 添加led三色灯,红色蓝色绿色
  5. android Activity关闭动画 附左右动画anim
  6. lobiner 关于android中的sqlite数据库操作
  7. Android中SharePreferences的简单实现
  8. Android布局管理器-使用TableLayout表格布局管理器实现简单的用
  9. 在Android中afinal框架下实现sqlite数据库版本升级的办法

随机推荐

  1. 大学学的java,想转行学android或php,从长远
  2. Java线程的生命周期和状态控制
  3. java多线程jdk1.7与jdk1.6结果不一致的问
  4. window下erlang(18.3)与rabbitmq(3.6.1)安装
  5. Java+opencv3.2.0之膨胀与腐蚀
  6. java基础练习 01字串
  7. 【JAVA】通过ISBN一键获取书籍信息
  8. 201621123014《Java程序设计》第六周学习
  9. 【Android学习】案例学开发,天气记事本项
  10. java读写中文文件