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 }
最后的成品:
到了总结的时候啦!
插入数据:
所谓的内容值,就是一个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
写代码的时候有好多问题要总结的,结果写博客的时候发现都忘光了,不知道该写什么,哭
补一张图:
加油,未来可期!