zoukankan      html  css  js  c++  java
  • Android(java)学习笔记188:学生信息管理系统案例(SQLite + ListView)

    1.首先说明一个知识点,通常我们显示布局文件xml都是如下:

    setContentView(R.layout.activity_main);

    其实每一个xml布局文件就好像一个气球,我们可以使用View.inflate(Context  context,int  resource , ViewGroup  root),inflate单词的意思就是:打气筒,也就是使用打气筒方法inflate(静态方法,返回View)把xml这个气球打成View,交给系统去显示;也就是说如下:

    setContentView(R.layout.activity_main);

    等价于:

    View view = View.inflate(MainActivity.this,R.layout.activity_main, null);

    setContentView(view);

    2. 学生信息管理系统案例实现过程:

    (1)新建一个Android工程,如下:

    (2)首先我们设置学生信息系统的UI,来到activity_main.xml,如下:

     1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools"
     3     android:layout_width="match_parent"
     4     android:layout_height="match_parent"
     5     android:gravity="center_horizontal"
     6     android:orientation="vertical"
     7     tools:context="com.himi.studentsys.MainActivity" >
     8 
     9     <TextView
    10         android:layout_width="fill_parent"
    11         android:layout_height="wrap_content"
    12         android:gravity="center_horizontal"
    13         android:text="学生管理系统"
    14         android:textColor="#66ffff"
    15         android:textSize="25dp" />
    16 
    17     <LinearLayout
    18         android:layout_width="match_parent"
    19         android:layout_height="wrap_content"
    20         android:orientation="horizontal" >
    21 
    22         <EditText
    23             android:inputType="text"
    24             android:hint="姓名"
    25             android:id="@+id/et_name"
    26             android:layout_width="0dp"
    27             android:layout_height="wrap_content"
    28             android:layout_weight="3" />
    29 
    30         <EditText
    31             android:inputType="phone"
    32             android:hint="电话"
    33             android:id="@+id/et_phone"
    34             android:layout_width="0dp"
    35             android:layout_height="wrap_content"
    36             android:layout_weight="3" />
    37 
    38         <Button
    39             android:onClick="add"
    40             android:id="@+id/button1"
    41             style="?android:attr/buttonStyleSmall"
    42             android:layout_width="0dp"
    43             android:layout_height="wrap_content"
    44             android:layout_weight="2"
    45             android:text="添加" />
    46 
    47     </LinearLayout>
    48     
    49     <ListView 
    50         android:layout_width="fill_parent"
    51         android:layout_height="fill_parent"
    52         android:id="@+id/lv">
    53         
    54     </ListView>
    55 
    56 </LinearLayout>

    布局效果如下:

    (3)上面学生信息要存储到数据库,自然这里需要创建数据库(实现数据增删改查),如下:

    新建一个包,包名为"com.himi.studentsys.db",在这个包下新建一个类StudentDBOpenHelper(数据库帮助类),让它继承自SQLiteOpenHelper,这里StudentDBOpenHelper实现 数据库 的创建

     1 package com.himi.studentsys.db;
     2 
     3 import android.content.Context;
     4 import android.database.sqlite.SQLiteDatabase;
     5 import android.database.sqlite.SQLiteDatabase.CursorFactory;
     6 import android.database.sqlite.SQLiteOpenHelper;
     7 
     8 public class StudentDBOpenHelper extends SQLiteOpenHelper {
     9 
    10     public StudentDBOpenHelper(Context context) {
    11         super(context, "student.db", null, 1);
    12     }
    13 
    14     @Override
    15     public void onCreate(SQLiteDatabase db) {
    16         db.execSQL("create table info (_id integer primary key autoincrement,name varchar(20),phone varchar(20))");
    17     }
    18 
    19     @Override
    20     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    21 
    22     }
    23 
    24 }

    下面接着实现数据库增删改查的工具类StudentDao,新建一个包"com.himi.studentsys.db.dao",如下:

     1 package com.himi.studentsys.db.dao;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 
     6 import android.content.ContentValues;
     7 import android.content.Context;
     8 import android.database.Cursor;
     9 import android.database.sqlite.SQLiteDatabase;
    10 
    11 import com.himi.studentsys.db.StudentDBOpenHelper;
    12 
    13 /**
    14  * 学生信息的dao代码:data access object
    15  * 提供增删改查
    16  */
    17 public class StudentDao {
    18     
    19     private StudentDBOpenHelper helper;
    20     /**
    21      * 没有无参的构造方法,只能用下面的构造方法去初始化dao
    22      * @param context
    23      */
    24     public StudentDao(Context context) {
    25         helper = new StudentDBOpenHelper(context);
    26     }
    27     /**
    28      * 添加一个学生信息
    29      * @param name 姓名
    30      * @param phone 电话
    31      * @return 添加在数据库的第几行
    32      */
    33     public long add(String name,String phone){
    34         // 获取可写的数据库
    35         SQLiteDatabase db = helper.getWritableDatabase();
    36         // 获取插入值对象
    37         ContentValues values = new ContentValues();
    38         // 设置插入值
    39         values.put("name", name);
    40         values.put("phone", phone);
    41         // 调用数据库插入方法
    42         long rowid = db.insert("info", null, values);
    43         // 关闭数据库连接
    44         db.close();
    45         return rowid;
    46     }
    47     /**
    48      * 删除一条学生信息
    49      * @param id 学生id
    50      * @return 影响了几行,0代表删除失败 
    51      */
    52     public int delete(String id){
    53         SQLiteDatabase db = helper.getWritableDatabase();
    54         int result = db.delete("info", "_id=?", new String[]{id});
    55         db.close();
    56         return result;
    57     }
    58     
    59     /**
    60      * 获取所有的学生信息
    61      * @return
    62      */
    63     public List<StudentInfo> findAll(){
    64         SQLiteDatabase db = helper.getReadableDatabase();
    65         List<StudentInfo> infos = new ArrayList<StudentInfo>();
    66         Cursor cursor = db.query("info", new String[]{"_id","name","phone"}, null, null, null, null, null);
    67         while(cursor.moveToNext()){
    68             StudentInfo info = new StudentInfo();
    69             String id = cursor.getString(0);
    70             String name = cursor.getString(1);
    71             String phone = cursor.getString(2);
    72             info.setId(id);
    73             info.setName(name);
    74             info.setPhone(phone);
    75             infos.add(info);
    76         }
    77         cursor.close();
    78         db.close();
    79         return infos;
    80     }
    81 }



    上面查询数据的时候需要一个业务bean类,新建一个包"com.himi.studentsys.db.bean",创建一个学生信息的bean类StudentInfo,如下:

     1 package com.himi.studentsys.db.bean;
     2 
     3 /**
     4  * 学生信息的业务bean
     5  */
     6 public class StudentInfo {
     7     private String id;
     8     private String name;
     9     private String phone;
    10     public String getId() {
    11         return id;
    12     }
    13     public void setId(String id) {
    14         this.id = id;
    15     }
    16     public String getName() {
    17         return name;
    18     }
    19     public void setName(String name) {
    20         this.name = name;
    21     }
    22     public String getPhone() {
    23         return phone;
    24     }
    25     public void setPhone(String phone) {
    26         this.phone = phone;
    27     }
    28     @Override
    29     public String toString() {
    30         return "StudentInfo [id=" + id + ", name=" + name + ", phone=" + phone
    31                 + "]";
    32     }
    33 }
    34     

    (4)实现Button的点击事件,实现添加数据到数据库:

    来到MainActivity,如下:

      1 package com.himi.studentsys;
      2 
      3 import java.util.List;
      4 
      5 import android.app.Activity;
      6 import android.graphics.Color;
      7 import android.os.Bundle;
      8 import android.text.TextUtils;
      9 import android.view.View;
     10 import android.view.ViewGroup;
     11 import android.view.Window;
     12 import android.widget.BaseAdapter;
     13 import android.widget.EditText;
     14 import android.widget.ListView;
     15 import android.widget.TextView;
     16 import android.widget.Toast;
     17 
     18 import com.himi.studentsys.db.bean.StudentInfo;
     19 import com.himi.studentsys.db.dao.StudentDao;
     20 
     21 public class MainActivity extends Activity {
     22     private EditText et_name;
     23     private EditText et_phone;
     24     private ListView lv;
     25     /**
     26      * 学生信息的dao
     27      */
     28     private StudentDao dao;
     29     /**
     30      * 所有的学生信息
     31      */
     32     private List<StudentInfo> infos;
     33     /**
     34      * 全局的数据适配器
     35      */
     36     private StudentAdapter adapter;
     37     
     38     @Override
     39     protected void onCreate(Bundle savedInstanceState) {
     40         super.onCreate(savedInstanceState);
     41         requestWindowFeature(Window.FEATURE_NO_TITLE);
     42         setContentView(R.layout.activity_main);
     43         
     44         et_name = (EditText) findViewById(R.id.et_name);
     45         et_phone = (EditText) findViewById(R.id.et_phone);
     46         lv = (ListView) findViewById(R.id.lv);
     47         
     48         dao = new StudentDao(this);
     49         
     50         infos = dao.findAll();
     51         adapter = new StudentAdapter();
     52         lv.setAdapter(adapter);
     53     }
     54     
     55     /**
     56      * 添加一个信息到数据库
     57      * @param view
     58      */
     59     public void add(View view){
     60         String name = et_name.getText().toString().trim();
     61         String phone = et_phone.getText().toString().trim();
     62         
     63         if(TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){
     64             Toast.makeText(this, "数据不能为空", 0).show();
     65             return ;
     66         }
     67         long result = dao.add(name, phone);
     68         if(result>0){
     69             Toast.makeText(this, "添加成功", 0).show();
     70             
     71             infos = dao.findAll();
     72             adapter.notifyDataSetChanged();//-->从新调用getcount 调用getview
     73         }else{
     74             Toast.makeText(this, "添加失败", 0).show();
     75         }
     76     }
     77     
     78     
     79     private class StudentAdapter extends BaseAdapter{
     80         @Override
     81         public int getCount() {
     82             return infos.size();
     83         }
     84 
     85         @Override
     86         public View getView(final int position, View convertView,
     87                 ViewGroup parent) {
     88             System.out.println("position" + position);
     89             TextView tv;
     90             if (convertView == null) {
     91                 tv = new TextView(MainActivity.this);
     92             } else {
     93                 tv = (TextView) convertView;
     94             }
     95             tv.setTextSize(20);
     96             tv.setTextColor(Color.RED);
     97             tv.setText(infos.get(position).toString());
     98             
     99             return tv;
    100 
    101         }
    102         @Override
    103         public Object getItem(int position) {
    104             return null;
    105         }
    106         @Override
    107         public long getItemId(int position) {
    108             return 0;
    109         }
    110     }
    111 }

    这时候布署程序到模拟器上,如下:

    明显这个UI效果不好,要完善一下。

    (5)完善优化显示的UI效果:

    优化UI显示,主要是修改Adapter 中的getView()方法,来到MainActivity,如下:

      1 package com.himi.studentsys;
      2 
      3 import java.util.List;
      4 
      5 import android.app.Activity;
      6 import android.graphics.Color;
      7 import android.os.Bundle;
      8 import android.text.TextUtils;
      9 import android.view.View;
     10 import android.view.ViewGroup;
     11 import android.widget.BaseAdapter;
     12 import android.widget.EditText;
     13 import android.widget.ListView;
     14 import android.widget.TextView;
     15 import android.widget.Toast;
     16 
     17 import com.himi.studentsys.db.bean.StudentInfo;
     18 import com.himi.studentsys.db.dao.StudentDao;
     19 
     20 public class MainActivity extends Activity {
     21     
     22     private EditText et_name;
     23     private EditText et_phone;
     24     private ListView lv;
     25 
     26     /**
     27      * 学生信息的dao
     28      */
     29     private StudentDao dao;
     30     /**
     31      * 所有的学生信息
     32      */
     33     private List<StudentInfo> infos;
     34     @Override
     35     protected void onCreate(Bundle savedInstanceState) {
     36         super.onCreate(savedInstanceState);
     37         setContentView(R.layout.activity_main);
     38         initViews();
     39     }
     40 
     41     private void initViews() {
     42         // TODO 自动生成的方法存根
     43         et_name = (EditText) findViewById(R.id.et_name);
     44         et_phone = (EditText) findViewById(R.id.et_phone);
     45         lv = (ListView) findViewById(R.id.lv);
     46         
     47         dao = new StudentDao(this);
     48         refreshUI();
     49     }
     50 
     51     /**
     52      * 刷新显示
     53      */
     54     public void refreshUI() {
     55         //获取数据库数据
     56         infos = dao.findAll();
     57         //设置数据
     58         lv.setAdapter(new StudentAdapter());
     59     }
     60     
     61     
     62     private class StudentAdapter extends BaseAdapter {
     63 
     64         public int getCount() {
     65             // TODO 自动生成的方法存根
     66             return infos.size();
     67         }
     68 
     69         public View getView(int position, View convertView, ViewGroup parent) {
     70             /*TextView tv;
     71             if(convertView == null) {
     72                 tv=  new TextView(MainActivity.this);            
     73             }else {
     74                 tv = (TextView) convertView;        
     75             }
     76             tv.setTextSize(20);
     77             tv.setTextColor(Color.RED);
     78             tv.setText(infos.get(position).toString());*/
     79             
     80             View view = View.inflate(MainActivity.this, R.layout.item, null);
     81             TextView tv_id = (TextView) view.findViewById(R.id.tv_id);
     82             TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
     83             TextView tv_phone = (TextView) view.findViewById(R.id.tv_phone);
     84             
     85             //设置数据
     86             tv_id.setText(infos.get(position).getId());
     87             tv_name.setText(infos.get(position).getName());
     88             tv_phone.setText(infos.get(position).getPhone());
     89             
     90             return view;
     91         }
     92         public Object getItem(int position) {
     93             // TODO 自动生成的方法存根
     94             return null;
     95         }
     96 
     97         public long getItemId(int position) {
     98             // TODO 自动生成的方法存根
     99             return 0;
    100         }
    101 
    102         
    103         
    104     }
    105     
    106     
    107     /**
    108      * 添加数据到数据库
    109      * @param v
    110      */
    111     public void add(View v) {
    112         String name = et_name.getText().toString().trim();
    113         String phone = et_phone.getText().toString().trim();
    114         
    115         if(TextUtils.isEmpty(name) || TextUtils.isEmpty(phone)) {
    116             Toast.makeText(this, "数据不能为空", 0).show();
    117             return;
    118         }
    119         long result = dao.add(name, phone);
    120         if(result>0) {
    121             Toast.makeText(this, "添加成功", 0).show();
    122             refreshUI();
    123         }else {
    124             Toast.makeText(this, "添加失败", 0).show();
    125             refreshUI();
    126         }
    127     }
    128 
    129 
    130     
    131 }

    自定义的条目布局item.xml,如下:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="match_parent"
     4     android:layout_height="wrap_content"
     5     android:orientation="horizontal" >
     6     <TextView 
     7         android:id="@+id/tv_id"
     8         android:drawableLeft="@drawable/ic_menu_cc"
     9         android:textColor="#bbff0000"
    10         android:gravity="center_vertical"
    11         android:layout_width="0dip"
    12         android:layout_height="wrap_content"
    13         android:layout_weight="1"
    14         android:text="id"/>
    15     
    16      <TextView 
    17         android:id="@+id/tv_name"
    18         android:textColor="#bbffff00"
    19         android:gravity="center_vertical"
    20         android:layout_width="0dip"
    21         android:layout_height="wrap_content"
    22         android:layout_weight="1"
    23         android:text="name"/>
    24      
    25       <TextView 
    26         android:id="@+id/tv_phone"
    27         android:textColor="#bb0000ff"
    28         android:gravity="center_vertical"
    29         android:layout_width="0dip"
    30         android:layout_height="wrap_content"
    31         android:layout_weight="1"
    32         android:text="phone"/>
    33     
    34 
    35 </LinearLayout>

    它的布局效果是:

    (6)上面只有添加数据到数据库并显示的效果,这里添加删除数据库中数据的效果

    修改item.xml如下:

     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="match_parent"
     4     android:layout_height="wrap_content"
     5     android:orientation="horizontal" >
     6     <TextView 
     7         android:id="@+id/tv_id"
     8         android:drawableLeft="@drawable/ic_menu_cc"
     9         android:textColor="#bbff0000"
    10         android:gravity="center_vertical"
    11         android:layout_width="0dip"
    12         android:layout_height="wrap_content"
    13         android:layout_weight="3"
    14         android:text="id"/>
    15     
    16      <TextView 
    17         android:id="@+id/tv_name"
    18         android:textColor="#bbffff00"
    19         android:gravity="center_vertical"
    20         android:layout_width="0dip"
    21         android:layout_height="wrap_content"
    22         android:layout_weight="3"
    23         android:text="name"/>
    24      
    25       <TextView 
    26         android:id="@+id/tv_phone"
    27         android:textColor="#bb0000ff"
    28         android:gravity="center_vertical"
    29         android:layout_width="0dip"
    30         android:layout_height="wrap_content"
    31         android:layout_weight="3"
    32         android:text="phone"/>
    33       
    34       <ImageView 
    35         android:id="@+id/iv_delete"
    36         android:layout_width="0dip"
    37         android:layout_height="wrap_content"
    38         android:layout_weight="1"
    39         android:src="@drawable/ic_menu_delete"/>
    40     
    41 
    42 </LinearLayout>

    布局效果如下:

    再来到MainActivity之中,如下:

      1 package com.himi.studentsys;
      2 
      3 import java.util.List;
      4 
      5 import android.app.Activity;
      6 import android.app.AlertDialog;
      7 import android.app.AlertDialog.Builder;
      8 import android.content.DialogInterface;
      9 import android.os.Bundle;
     10 import android.text.TextUtils;
     11 import android.view.View;
     12 import android.view.View.OnClickListener;
     13 import android.view.ViewGroup;
     14 import android.view.Window;
     15 import android.widget.BaseAdapter;
     16 import android.widget.EditText;
     17 import android.widget.ImageView;
     18 import android.widget.ListView;
     19 import android.widget.TextView;
     20 import android.widget.Toast;
     21 
     22 import com.himi.studentsys.db.bean.StudentInfo;
     23 import com.himi.studentsys.db.dao.StudentDao;
     24 
     25 public class MainActivity extends Activity {
     26     private EditText et_name;
     27     private EditText et_phone;
     28     private ListView lv;
     29     /**
     30      * 学生信息的dao
     31      */
     32     private StudentDao dao;
     33     /**
     34      * 所有的学生信息
     35      */
     36     private List<StudentInfo> infos;
     37     /**
     38      * 全局的数据适配器
     39      */
     40     private StudentAdapter adapter;
     41     
     42     @Override
     43     protected void onCreate(Bundle savedInstanceState) {
     44         super.onCreate(savedInstanceState);
     45         requestWindowFeature(Window.FEATURE_NO_TITLE);
     46         setContentView(R.layout.activity_main);
     47         
     48         et_name = (EditText) findViewById(R.id.et_name);
     49         et_phone = (EditText) findViewById(R.id.et_phone);
     50         lv = (ListView) findViewById(R.id.lv);
     51         
     52         dao = new StudentDao(this);
     53         
     54         infos = dao.findAll();
     55         adapter = new StudentAdapter();
     56         lv.setAdapter(adapter);
     57     }
     58     
     59     /**
     60      * 添加一个信息到数据库
     61      * @param view
     62      */
     63     public void add(View view){
     64         String name = et_name.getText().toString().trim();
     65         String phone = et_phone.getText().toString().trim();
     66         
     67         if(TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){
     68             Toast.makeText(this, "数据不能为空", 0).show();
     69             return ;
     70         }
     71         long result = dao.add(name, phone);
     72         if(result>0){
     73             Toast.makeText(this, "添加成功", 0).show();
     74             
     75             infos = dao.findAll();
     76             adapter.notifyDataSetChanged();//-->从新调用getcount 调用getview
     77         }else{
     78             Toast.makeText(this, "添加失败", 0).show();
     79         }
     80     }
     81     
     82     
     83     private class StudentAdapter extends BaseAdapter{
     84         @Override
     85         public int getCount() {
     86             return infos.size();
     87         }
     88 
     89         @Override
     90         public View getView(final int position, View convertView, ViewGroup parent) {
     91             System.out.println("position"+position);
     92             View view = View.inflate(MainActivity.this, R.layout.item, null);
     93             
     94             TextView tv_id = (TextView) view.findViewById(R.id.tv_id);
     95             TextView tv_name = (TextView) view.findViewById(R.id.tv_name);
     96             TextView tv_phone = (TextView) view.findViewById(R.id.tv_phone);
     97             ImageView iv_delete = (ImageView) view.findViewById(R.id.iv_delete);
     98  99             iv_delete.setOnClickListener(new OnClickListener() {
    100                 @Override
    101                 public void onClick(View v) {
    102                     AlertDialog.Builder builder = new Builder(MainActivity.this);
    103                     builder.setTitle("提醒");
    104                     builder.setMessage("是否确定删除?");
    105                     builder.setPositiveButton("确定删除", new DialogInterface.OnClickListener() {
    106                         @Override
    107                         public void onClick(DialogInterface dialog, int which) {
    108                             // 获取该位置组件id,并删除
    109                             int result = dao.delete(infos.get(position).getId());
    110                             Toast.makeText(MainActivity.this, "删除了"+result+"个记录", 0).show();
    111                             // 重新查询
    112                             infos = dao.findAll();
    113                             adapter.notifyDataSetChanged();
    114                         }
    115                     });
    116                     builder.setNegativeButton("取消", null);
    117                     builder.create().show();
    118                 }
    119             });
    120             // 修改对应值
    121             tv_id.setText(infos.get(position).getId());
    122             tv_name.setText(infos.get(position).getName());
    123             tv_phone.setText(infos.get(position).getPhone());
    124             return view;
    125         }
    126         @Override
    127         public Object getItem(int position) {
    128             return null;
    129         }
    130         @Override
    131         public long getItemId(int position) {
    132             return 0;
    133         }
    134     }
    135 }

    (7)最终代码已经完成,布署程序到模拟器上:

    工程项目一览图:

  • 相关阅读:
    lnmp 优化
    linux-lnmp 搭建报错
    nfs 配置
    全网备份脚本rsync
    .Net面试题二
    软件设计模式
    .Net面试题一
    asp.net运行机制
    NHiberante的优缺点
    什么是架构、框架、模式和平台
  • 原文地址:https://www.cnblogs.com/hebao0514/p/4755992.html
Copyright © 2011-2022 走看看