Android之SQLite数据库操作

设计一个简单的学生信息管理程序,数据库名称创建为”ciec”,学生信息包括学号(表的主键)、姓名、性别、班级等,结合SQLite数据库实现对学生信息的添加、修改、删除与查询操作。

实验步骤

创建一个Activity,界面布局如图1所示,用户通过界面输入或选择学生信息,点击添加按钮后,将信息保存到数据库中,并在界面中提示操作成功或失败的信息。注意:输入的学号为数据库表的主键,学号不能为空也不能重复,需要在程序中对学号的信息进行合法性验证。

点击修改按钮和删除按钮可以对学生信息进行相应操作,但必须预先输入学号信息,否则提示操作无法成功。

点击查询按钮后,先跳转到新的Activity,在新的界面中展示查询结果,要求将所有的学生信息都查询出来,并用列表控件进行展示,界面布局如图2所示。

                       图1                                                            图2

写了一天才写完,一开始写的时候一脸懵

说一下总共写了6个文件,Mainactivity,Secondactivity,DatabaseHelper,还有三个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="match_parent"
  5     android:orientation="vertical">
  6 
  7     <LinearLayout
  8         android:layout_width="match_parent"
  9         android:layout_height="50dp"
 10         android:orientation="horizontal">
 11 
 12         <TextView
 13             android:layout_width="match_parent"
 14             android:layout_height="match_parent"
 15             android:layout_weight="3"
 16             android:text=" 学号 : "/>
 17         <EditText
 18             android:id="@+id/Stdudent_ID"
 19             android:layout_width="match_parent"
 20             android:layout_height="match_parent"
 21             android:layout_weight="1" />
 22     </LinearLayout>
 23 
 24     <LinearLayout
 25         android:layout_width="match_parent"
 26         android:layout_height="50dp"
 27         android:orientation="horizontal">
 28 
 29         <TextView
 30             android:layout_width="match_parent"
 31             android:layout_height="match_parent"
 32             android:layout_weight="3"
 33             android:text=" 姓名 : "/>
 34         <EditText
 35             android:id="@+id/Stdudent_NAME"
 36             android:layout_width="match_parent"
 37             android:layout_height="match_parent"
 38             android:layout_weight="1" />
 39     </LinearLayout>
 40 
 41     <LinearLayout
 42         android:layout_width="match_parent"
 43         android:layout_height="50dp"
 44         android:orientation="horizontal">
 45 
 46         <TextView
 47             android:layout_width="102dp"
 48             android:layout_height="match_parent"
 49             android:text="性别" />
 50 
 51         <RadioGroup
 52             android:id="@+id/Student_SEX"
 53             android:layout_width="wrap_content"
 54             android:layout_height="wrap_content"
 55             android:orientation="horizontal" >
 56 
 57             <RadioButton
 58                 android:id="@+id/Student_BOY"
 59                 android:layout_width="118dp"
 60                 android:layout_height="match_parent"
 61                 android:text="男" />
 62 
 63             <RadioButton
 64                 android:id="@+id/Student_GIRL"
 65                 android:layout_width="110dp"
 66                 android:layout_height="match_parent"
 67                 android:text="女" />
 68         </RadioGroup>
 69     </LinearLayout>
 70 
 71     <LinearLayout
 72         android:layout_width="match_parent"
 73         android:layout_height="50dp"
 74         android:orientation="horizontal">
 75 
 76         <TextView
 77             android:layout_width="match_parent"
 78             android:layout_height="match_parent"
 79             android:layout_weight="3"
 80             android:text=" 班级 : "/>
 81         <EditText
 82             android:id="@+id/Student_CLASS"
 83             android:layout_width="match_parent"
 84             android:layout_height="match_parent"
 85             android:layout_weight="1" />
 86     </LinearLayout>
 87 
 88     <LinearLayout
 89         android:layout_width="match_parent"
 90         android:layout_height="50dp"
 91         android:orientation="horizontal">
 92 
 93         <Button
 94             android:id="@+id/Stdudent_ADD"
 95             android:layout_width="match_parent"
 96             android:layout_height="wrap_content"
 97             android:layout_weight="1"
 98             android:text="添加" />
 99         <Button
100             android:id="@+id/Stdudent_MV"
101             android:layout_width="match_parent"
102             android:layout_height="wrap_content"
103             android:layout_weight="1"
104             android:text="修改" />
105         <Button
106             android:id="@+id/Stdudent_RM"
107             android:layout_width="match_parent"
108             android:layout_height="wrap_content"
109             android:layout_weight="1"
110             android:text="删除" />
111         <Button
112             android:id="@+id/Stdudent_FIND"
113             android:layout_width="match_parent"
114             android:layout_height="wrap_content"
115             android:layout_weight="1"
116             android:text="查询" />
117     </LinearLayout>
118 
119 </LinearLayout>
 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="match_parent">
 5 
 6     <ListView
 7         android:id="@+id/Student_ALL"
 8         android:layout_height="fill_parent"
 9         android:layout_width="fill_parent"/>
10 
11 </LinearLayout>
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3     xmlns:app="http://schemas.android.com/apk/res-auto"
 4     android:layout_width="match_parent"
 5     android:layout_height="match_parent">
 6 
 7     <TextView
 8         android:id="@+id/tv"
 9         android:layout_width="match_parent"
10         android:layout_height="match_parent"/>
11 
12 </LinearLayout>

这三个xml,第一个对应Mainactivity,后两个对应Secondactivity。

第一次使用SQLlite,就先使用一下

 

 

 熟悉用法了,就可以开始写了

sqllite数据库是AndroidSDK自带的,所以我们写一个类继承SQLiteOpenHelper类(这是个抽象类),而且需要在这个类中实现三个方法:构造函数,onCreate,onUpgrade

 1 package com.example.app;
 2 
 3 import android.annotation.SuppressLint;
 4 import android.content.Context;
 5 import android.database.Cursor;
 6 import android.database.sqlite.*;
 7 
 8 public class DatabaseHelper extends SQLiteOpenHelper { //带全部参数的构造函数,name为数据库名称
 9     public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory,int version){
10         super(context,name,factory,version);
11     }
12 
13     @Override
14     public void onCreate(SQLiteDatabase db) {  //建表
15         db.execSQL("CREATE TABLE information(\n" +
16                 "             id INTEGER PRIMARY KEY NOT NULL,\n" +
17                 "             name TEXT NOT NULL,\n" +
18                 "             sex TEXT NOT NULL,\n" +
19                 "             class TEXT NOT NULL\n" +
20                 "             )");
21         db.execSQL("INSERT into information(id,name,sex,class) VALUES (202001,\"张三\",\"男\",\"嵌入式1班\");");
22         db.execSQL("INSERT into information(id,name,sex,class) VALUES (202002,\"王乐\",\"男\",\"嵌入式1班\");");
23         db.execSQL("INSERT into information(id,name,sex,class) VALUES (202003,\"刘小慧\",\"女\",\"网编1班\");");
24     }
25 
26     @Override
27     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {//简单demo,就不写这个了
28 
29     }
30     //只有conCreate()和onUpgrade是抽象方法,所以重写,
31 
32 }

然后写Mainactivity,思路就是点击相对应的按钮做出相对应的操作

package com.example.app;

import androidx.appcompat.app.AppCompatActivity;

import android.annotation.SuppressLint;
import android.content.ContentValues;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.*;

public class MainActivity extends AppCompatActivity {

    private EditText Student_ID;
    private EditText Student_NAME;
    private EditText Student_CLASS;
    private RadioGroup Student_SEX;
    private RadioButton Student_BOY;
    private RadioButton Student_GIRL;
    private Button Stdudent_ADD;
    private Button Stdudent_MV;
    private Button Stdudent_RM;
    private Button Stdudent_FIND;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.homework_9_1);

        //5.
        //4.因为我们都在mainactivity上操作,所以就不提前在sqllit上建库了,直接在这个建库,开始运行时就把库先建好
        final DatabaseHelper databaseHelper = new DatabaseHelper(this,"ciec.db",null,2);
        SQLiteDatabase db = databaseHelper.getWritableDatabase(); // 这里先用.getreadableDatebase查一下
        //databaseHelper.exitDataBase(db);

        //1.对学号姓名班级进行实例化
        Student_ID = (EditText) findViewById(R.id.Stdudent_ID);
        Student_NAME = (EditText) findViewById(R.id.Stdudent_NAME);
        Student_CLASS = (EditText) findViewById(R.id.Student_CLASS);
        //2.实例化和监听性别选项
        Student_SEX = (RadioGroup) findViewById(R.id.Student_SEX);
        Student_BOY = (RadioButton) findViewById(R.id.Student_BOY);
        Student_GIRL = (RadioButton) findViewById(R.id.Student_GIRL);

        //Student_SEX.setOnCheckedChangeListener(new MyRadioButtonListener());
        //10.应该在点击按钮的时候获取这个单选的值

        //6.获取输入框的内容
//        final String id = Student_ID.getText().toString().trim();
//        final String name = Student_NAME.getText().toString().trim();
//        final String classes = Student_CLASS.getText().toString().trim();

        //3.然后写增删改查功能
        Stdudent_ADD = (Button) findViewById(R.id.Stdudent_ADD);//增
        Stdudent_ADD.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final String id = Student_ID.getText().toString().trim();
                final String name = Student_NAME.getText().toString().trim();
                final String classes = Student_CLASS.getText().toString().trim();
                String sex = "0";
                if (Student_GIRL.isChecked()){
                    sex = "女";
                }
                if(Student_BOY.isChecked()){
                    sex = "男";
                }
                //8.我们设置的是学号姓名班级和性别都不能为空,所以进行判断
                if (id.isEmpty() | name.isEmpty() | classes.isEmpty() | sex.equals("0")){//为null,则弹出提示框   使用isempty方法代替equals
                    Toast.makeText(MainActivity.this,"请将信息全部填完!!!",Toast.LENGTH_SHORT).show();
                }else{
                    //7.将输入的内容插入数据库
                    //9.因为学号唯一,所以我们还得判断数据库中是否已经存在,如果存在则肯定不能插入了,否则和修改没啥区别了
                    SQLiteDatabase db = databaseHelper.getWritableDatabase();  //获得写入模式的数据库
                    ContentValues values = new ContentValues();
                    //db.execSQL("select _id from information where _id = "+ id +";");
                    Cursor cursor = db.query("information", new String[]{"id"},"id = ?", new String[] {id}, null, null, null);
                    if(cursor.getCount()>0){
                        Toast.makeText(MainActivity.this,"学生信息已经存在!!!",Toast.LENGTH_SHORT).show();
                    }else {
                        values.put("id",id);
                        values.put("name",name);
                        values.put("sex", sex);
                        values.put("class",classes);
                        db.insert("information",null,values);
                        Toast.makeText(MainActivity.this,"增加成功!!!",Toast.LENGTH_SHORT).show();
                    }
                }
            }
        });

        Stdudent_MV = (Button) findViewById(R.id.Stdudent_MV);//改
        Stdudent_MV.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final String id = Student_ID.getText().toString().trim();
                final String name = Student_NAME.getText().toString().trim();
                final String classes = Student_CLASS.getText().toString().trim();
                String sex = "0";
                if (Student_GIRL.isChecked()){
                    sex = "女";
                }
                if(Student_BOY.isChecked()){
                    sex = "男";
                }
                //修改必须有学号,所以点击修改按钮时就会覆盖相对应的学号的其他的值,
                //就是说学号必须有,如果学号对应的账号信息被删除,则应该提示无此学生信息
                if (id.isEmpty()){
                    Toast.makeText(MainActivity.this,"学号不能为空!!!",Toast.LENGTH_SHORT).show();
                }else {
                    SQLiteDatabase db = databaseHelper.getWritableDatabase();
                    ContentValues values2 = new ContentValues();
                    ContentValues values3 = new ContentValues();
                    ContentValues values4 = new ContentValues();
                    Cursor cursor = db.query("information", new String[]{"id"},"id = ?", new String[] {id}, null, null, null);
                    if (cursor.getCount()>0){
                        values2.put("name",name);
                        values3.put("sex", sex);
                        values4.put("class",classes);
                        db.update("information",values2,"id = ?",new String[]{id});
                        db.update("information",values3,"id = ?",new String[]{id});
                        db.update("information",values4,"id = ?",new String[]{id});
                        Toast.makeText(MainActivity.this,"修改成功!!!",Toast.LENGTH_SHORT).show();
                    }else {
                        Toast.makeText(MainActivity.this,"无此学生!!!",Toast.LENGTH_SHORT).show();
                    }
                }
            }
        });

        Stdudent_RM = (Button) findViewById(R.id.Stdudent_RM);//删
        Stdudent_RM.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                final String id = Student_ID.getText().toString().trim();
                final String name = Student_NAME.getText().toString().trim();
                final String classes = Student_CLASS.getText().toString().trim();
                //删除只需要有学号就可以
                if(id.equals("")){
                    Toast.makeText(MainActivity.this,"学号不能为空!!!",Toast.LENGTH_SHORT).show();
                }else {
                    SQLiteDatabase db = databaseHelper.getWritableDatabase();
                    db.delete("information","id=?",new String[]{id});
                    Toast.makeText(MainActivity.this,"删除成功!!!",Toast.LENGTH_SHORT).show();
                }
            }
        });

        Stdudent_FIND = (Button) findViewById(R.id.Stdudent_FIND);//查
        Stdudent_FIND.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //这里跳转到另一个activity
                startActivity(new Intent(MainActivity.this,SecondActivity.class));
            }
        });
    }
//    static class MyRadioButtonListener implements RadioGroup.OnCheckedChangeListener { //单选的类
//        @Override
//        public void onCheckedChanged(RadioGroup group, int checkedId) {
//            String sex;
//            // 选中状态改变时被触发
//            switch (checkedId) {
//                case R.id.Student_GIRL:
//                    // 当用户选择女性时
//                    sex = "女";
//                    break;
//                case R.id.Student_BOY:
//                    // 当用户选择男性时
//                    sex = "男";
//                    break;
//            }
//        }
//    }


}

 

然后写Secondactivity

没啥好说的,就是查询,然后将数据展示出来

这里说一个知识点

 

 

 1 package com.example.app;
 2 
 3 import androidx.appcompat.app.AppCompatActivity;
 4 import androidx.appcompat.app.AlertDialog;
 5 
 6 import android.database.Cursor;
 7 import android.database.sqlite.SQLiteDatabase;
 8 import android.text.TextUtils;
 9 
10 import android.os.Bundle;
11 import android.view.LayoutInflater;
12 import android.view.View;
13 import android.view.ViewGroup;
14 import android.widget.ArrayAdapter;
15 import android.widget.BaseAdapter;
16 import android.widget.ListView;
17 import android.widget.TextView;
18 
19 import java.util.ArrayList;
20 
21 public class SecondActivity extends AppCompatActivity {
22 
23     private ListView Student_ALL;
24     String[] data;
25     ArrayList<String> stringArrayList = new ArrayList<String>();
26 
27     @Override
28     protected void onCreate(Bundle savedInstanceState) {
29         super.onCreate(savedInstanceState);
30         setContentView(R.layout.homework_9_2);
31         final DatabaseHelper databaseHelper = new DatabaseHelper(this,"ciec.db",null,2);
32 
33         Student_ALL = (ListView) findViewById(R.id.Student_ALL);
34 
35         SQLiteDatabase db = databaseHelper.getWritableDatabase();
36         Cursor cursor = db.query("information", new String[]{"id","name","sex","class"}, null, null, null, null, null);
37         String textview_data = "";
38         //利用游标遍历所有数据对象
39         //为了显示全部,把所有对象连接起来,放到TextView中
40         while(cursor.moveToNext()){
41             String qwe = cursor.getString(cursor.getColumnIndex("id"));
42             String asd = cursor.getString(cursor.getColumnIndex("name"));
43             String zxc = cursor.getString(cursor.getColumnIndex("sex"));
44             String qaz = cursor.getString(cursor.getColumnIndex("class"));
45             textview_data = qwe + "--" + asd +"--" + zxc +"--" + qaz;
46             stringArrayList.add(textview_data);
47         }
48         //利用arraylist,保存数据,然后在转换成String[]数组
49         String [] stringArray = stringArrayList.toArray(new String[stringArrayList.size()]);
50         data = stringArray;
51         //多余的一行注释掉ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,R.id.LS);//新建并配置ArrayAapeter
52         MyBaseAdapter mAdapter = new MyBaseAdapter();
53         Student_ALL.setAdapter(mAdapter);
54     }
55 
56     class MyBaseAdapter extends BaseAdapter {
57 
58         @Override
59         public int getCount() {
60             return data.length;
61         }
62         @Override
63         public Object getItem(int position) {
64             return null;
65         }
66         @Override
67         public long getItemId(int position) {
68             return 0;
69         }
70         @Override
71         public View getView(int position, View convertView, ViewGroup parent) {
72             ViewHolder holder;
73             if(convertView == null){
74                 convertView = LayoutInflater.from(getApplicationContext()).inflate(R.layout.homework_five_2,parent,false);
75                 holder = new ViewHolder();
76                 holder.mTextView = (TextView) convertView.findViewById(R.id.tv);
77                 convertView.setTag(holder);
78             }else {
79                 holder = (ViewHolder) convertView.getTag();
80             }
81             holder.mTextView.setText(data[position]);
82             return convertView;
83         }
84         class ViewHolder {
85             TextView mTextView;
86         }
87     }
88 }

最后的成品:

 

到了总结的时候啦!

插入数据:

首先需要new一个ContentValues,内容值对象。
所谓的内容值,就是一个K,V 键值对,K指明字段名称即列名称,V指明字段值,即单元格内容。然后将这个键值对放到ContentValues的对象values里面,再把携带着键值对的对象values插入user表中
1 ContentValues values = new ContentValues();
2 values.put("id",id);
3 db.insert("information",null,values);

删除数据:

db.delete("information","id=?",new String[]{id});

第一个参数是表名,第二个参数是删除条件,第三个参数就是你要删除的值,简单理解就是它会赋值给第二个参数的问号。

修改数据:

和插入数据相似,.update中的第一个参数是表名,第二个参数就是我们要修改的列名和值,第三个参数是修改条件,第四个参数是修改条件的值

1 ContentValues values2 = new ContentValues();
2 values2.put("name",name);
3 db.update("information",values2,"id = ?",new String[]{id});

查询数据:

频繁的用到查询语句,然后查询语句也是我花时间最长的

Cursor cursor = db.query("information", new String[]{"id"},"id = ?", new String[] {id}, null, null, null);

这句写在插入功能,使用了Cursor游标进行查询,后面的循环遍历所有数据就不说了,单说一下这条语句

cursor就是游标对象,查询函数是.query,第一个参数是表名,第二个参数就是select * from 表名 where name = “”;中的*号,第三个参数就是查询条件(where后跟的name = ),第四个参数是查询条件的值,再往后的几个参数就是各种查询约束了,在上面的查询知识点说的很清楚。

还有一种查询函数是.rawQuery,这种查询方式是这样的

.rawQuery(sql,selectionArgs)

第一个参数是sql语句,第二个参数要么是null,要么必须是一个字符串数组,还有第三个参数,没用过不知道是啥

比如这样

Cursor cursor = db.rawQuery("select name from * where id=?", new String[]{"1"});

这两个函数的主要区别是rawQuery是直接使用SQL语句进行查询的,也就是第一个参数字符串,在字符串内的“?”会被后面的String[]数组逐一对换掉;而query函数是Android自己封装的查询API

 

写代码的时候有好多问题要总结的,结果写博客的时候发现都忘光了,不知道该写什么,哭

补一张图:

 

 

加油,未来可期!

 

posted @ 2020-05-20 17:16  非凡的静静  阅读(8973)  评论(4编辑  收藏  举报