Android 入门第七讲03- SQLite数据库(SQLite数据库概述,使用方法(SQL语法复习,SQLite的增删改查),案例实战-增加查询学生数据)


Android 入门第七讲02-SharedPreferences(SharedPreferences概述,使用方法,实战案例-qq登录demo)

1.SQLite数据库概述

SQLite一个非常流行的嵌入式数据库,它支持SQL语言,并且只利用很少的内存就有很好的性能。此外它还是开源的,任何人都可以使用它。 特点:
1.轻量级-只适合存小量数据
2.开源免费
3.sql语法通用 使用场景:一般用来做手机的数据缓存

SQLite和Mysql数据库 存储区别

举个例子,比方说一个app,app里面的数据从哪里来呢,之前我们又讲到从网络上获取,网咯获取实际上是通过一个服务器来获取, 服务器的数据从哪里来呢?因为服务器本身只是一个应用,这个应用需要查询数据,这个服务器本身会安装一个数据库,服务器上安装的这个数据库,就可以是我们常用到的MySQL,Oracle这类数据库,服务器一般是一台windows系统或者Linux系统的电脑,app发一个请求到服务器,服务器再到数据库里面查询数据,然后把数据返回到app,像服务器用来查询的数据库,一般存的是所有用户的数据,所以存的数据会非常多,但是只会返回对应用户的数据,不会全部返回给用户,而app接收到数据以后,就会在本地做一个缓存,图片之类的缓存会存在文件,带有标志位的数据会存在sp,而像qq这类的消息记录缓存一般会存在SQLite数据库,
在这里插入图片描述

2.SQLite数据库的使用方法

一般只对单表操作,当然多表也是可以的

类似java连接数据库的过程

  1. 加载驱动
  2. 建立连接
  3. 建立的连接进行增删改查

1.SQL语法复习

1.建表

create table user(id integer primary key autoincrement,
					name varchar(50),
				    sex varchar(20), 
				    date varchar(50),
		            content varchar(100),
				    age integer)

2.查询

	select * from tabname where id =1

3.增加

	insert into tabname values(null,'aa', '男','1988-10-2',' .....')

4.修改

	update tabname set sex='男' where id=4;

5.删除

	delete from tabname where id=5; 

2.SQLite用法

在java中,加载驱动的时候要考虑是MySQL还是Oracle数据库,对不同的数据库要加载不同的jar包,但是SQLite他就这一种,所以在安卓里面,加载驱动很多工作都做好了,安卓里面提供了一个类,这个类的名字叫 SQLiteOpenHelper帮助类

1.创建表格

这个类是一个抽象类,它可以帮我们去加载驱动,但是它由于是个抽象类,我们知道,抽象是不能直接用的,我们要使用的话就要先实现它的抽象方法,实现它的抽象方法的前提是我们先要创建一个类来继承这个类
在这里插入图片描述

第一步,先创建一个类,然后继承 SQLiteOpenHelper这个类,并且实现抽象方法

在这里插入图片描述
在这里插入图片描述

然后再创建一个构造方法

在这里插入图片描述
在这里插入图片描述
然后再在Oncreat方法里面建表
在这里插入图片描述



public class MySQLiteOpenHelper  extends SQLiteOpenHelper{
    public MySQLiteOpenHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //在这个方法里面来建表
        String sql="create table user(id integer primary key autoincrement,name varchar(50), sex varchar(20),age integer)";
        db.execSQL(sql);// 这一步就完成了加载驱动和建立连接

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}



回到activity
在这里插入图片描述
代码


public class MainActivity extends AppCompatActivity {


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

        MySQLiteOpenHelper mySQLiteOpenHelper=new MySQLiteOpenHelper(this,"users.db",null,1);

//        //对数据库进行读操作 查询
//        SQLiteDatabase sqLiteOpenHelper=mySQLiteOpenHelper.getReadableDatabase();
       //对数据库进行写操作 增删改查
        SQLiteDatabase sqLiteDatabase=mySQLiteOpenHelper.getWritableDatabase();

    }
}

2.查看表格

Android中SQLite数据库查看推荐博客《Android Studio查看SQLite数据库方法大全
我们这里 采用SQLite Expert Professional工具来查看
在这里插入图片描述
第一步导出模拟器数据库文件
找到data目录下的—》data目录—》应用程序包名—》databases文件夹下的数据库文件
在这里插入图片描述
在这里插入图片描述
右键保存到本地
在这里插入图片描述
保存到指定位置
在这里插入图片描述

第二步:查看数据库文件
打开第一步保存的db文件
在这里插入图片描述
找到文件路径
在这里插入图片描述
查看
在这里插入图片描述

补充:
再对数据库表格进行修改(例如增删改查)以后,需要右键关闭数据库,然后再重复上面的第一步和第二步操作

在这里插入图片描述

3.增加数据

第一步,我们先在布局文件加一个button
在这里插入图片描述
第二步,给button添加点击事件
在这里插入图片描述

我们首先看到insert这个方法需要传三个值,第一个是数据库表名,第二个传一个null值就ok,第三个这个ContentValues我们可以把它看做是一个HashMap,虽然只是功能类似
在这里插入图片描述
在这里插入图片描述

第二步,通过insert方给数据库表格添加数据
在这里插入图片描述


public class MainActivity extends AppCompatActivity {


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

        MySQLiteOpenHelper mySQLiteOpenHelper=new MySQLiteOpenHelper(this,"users.db",null,1);

//        //对数据库进行读操作 查询
//        SQLiteDatabase sqLiteOpenHelper=mySQLiteOpenHelper.getReadableDatabase();
        //对数据库进行写操作 增删改查
        final SQLiteDatabase sqLiteDatabase=mySQLiteOpenHelper.getWritableDatabase();
        Button button=findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {//点击事件
            @Override
            public void onClick(View v) {
                ContentValues contentValues=new ContentValues();
            //   sqLiteDatabase.execSQL("insert into user values()");//传统的添加语法
                contentValues.put("name","name1");
                contentValues.put("sex","男");
                contentValues.put("age",18);


                sqLiteDatabase.insert("user",null,contentValues);

            }
        });

    }
}

第三步,查看sqlite数据库

—数据库修改后查看方式

第一步关闭数据库,第二步然后再重新导出db文件,第三步再打开所对应的db文件的数据库

第一步,关闭数据库
在这里插入图片描述
第二步,重新导出db文件
在这里插入图片描述
第三步,打开db文件所对应数据库(可以看到我们已经成功添加数据)
在这里插入图片描述

4.删除数据

这里我们需要用到的方法时delete
我们来看delete方法需要传的值
第一个值是表名,第二个值whereClause就是数据满足的条件(比如id=1),第三个值是给第二值传String类型的数据
在这里插入图片描述

在这里插入图片描述


public class MainActivity extends AppCompatActivity {


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

        MySQLiteOpenHelper mySQLiteOpenHelper=new MySQLiteOpenHelper(this,"users.db",null,1);

//        //对数据库进行读操作 查询
//        SQLiteDatabase sqLiteOpenHelper=mySQLiteOpenHelper.getReadableDatabase();
        //对数据库进行写操作 增删改查
        final SQLiteDatabase sqLiteDatabase=mySQLiteOpenHelper.getWritableDatabase();
        Button button=findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {//点击事件
            @Override
            public void onClick(View v) {

                //表示在表名为 user 中删除 id=2 的数据
                sqLiteDatabase.delete("user","id=?",new String[]{"2"});

            }
        });

    }
}

点击文内跳转到—数据库修改后查看方式
操作之后,查看数据库,发现id=2的数据已经删除
在这里插入图片描述
如果我们要在删除时,删除数据需要满足多个条件

可以用and 表示同时满足多个条件的数据
在这里插入图片描述

            //表示在表名为 user 中删除 id=2 并且 name=name1 的数据
           sqLiteDatabase.delete("user","id=? and name=?",new String[]{"2","name1"});

可以用 or 表示满足多个条件中的一个条件的数据
在这里插入图片描述

 //表示在表名为 user 中删除 id=2 或者 name=name1 的数据
           sqLiteDatabase.delete("user","id=? or name=?",new String[]{"2","name1"});

5.修改数据

这里我们需要用到的方法时updata,这个方法需要传四个值,
第一个值是表名。第二个值是之前提到类似HashMap的ContentValues,第三个值whereClause就是数据满足的条件(比如id=1),第四个值是给第三值传String类型的数据
在这里插入图片描述

点击修改数据

通过ContentValues添加修改后的新数据,再根据数据满足的条件对数据进行修改

在这里插入图片描述


public class MainActivity extends AppCompatActivity {


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

        MySQLiteOpenHelper mySQLiteOpenHelper=new MySQLiteOpenHelper(this,"users.db",null,1);

//        //对数据库进行读操作 查询
//        SQLiteDatabase sqLiteOpenHelper=mySQLiteOpenHelper.getReadableDatabase();
        //对数据库进行写操作 增删改查
        final SQLiteDatabase sqLiteDatabase=mySQLiteOpenHelper.getWritableDatabase();
        Button button=findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {//点击事件
            @Override
            public void onClick(View v) {
                ContentValues contentValues=new ContentValues();
                //   sqLiteDatabase.execSQL("insert into user values()");//传统的添加语法
                contentValues.put("name","test");
                contentValues.put("sex","女");
                contentValues.put("age",6);
               sqLiteDatabase.update("user",contentValues,"id=?",new String[]{"1"});

            }
        });

    }
}

点击文内跳转到—数据库修改后查看方式
修改前
在这里插入图片描述
修改后数据
在这里插入图片描述

6.查询数据

这里我们需要用到query方法来查询, 这里我们需要传七个值,第一个是表名,第二个值columns表示我们要查询的列(我们这里有id,name,sex等多个列,我们可以根据需要来返回我们要查询的列),我们也可以传一个null表示返回所有字段,第三个值selection表示我们查询数据所需要满足的条件(类似之前的whereClause),如果这里传一个null值,就相当于返回所有数据,第四个值表示就是给第三值传String类型的数据,后面的groupBy分组,having或者是orderBy可以用指定一些复杂的查询条件,如果不按分组来就都传一个null
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
这里补充一下:我们最后需要关闭cursor,防止造成内存泄漏
在这里插入图片描述

public class MainActivity extends AppCompatActivity {


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

        MySQLiteOpenHelper mySQLiteOpenHelper=new MySQLiteOpenHelper(this,"users.db",null,1);

//        //对数据库进行读操作 查询
//        SQLiteDatabase sqLiteOpenHelper=mySQLiteOpenHelper.getReadableDatabase();
        //对数据库进行写操作 增删改查
        final SQLiteDatabase sqLiteDatabase=mySQLiteOpenHelper.getWritableDatabase();
        Button button=findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {//点击事件
            @Override
            public void onClick(View v) {


              Cursor cursor= sqLiteDatabase.query("user",null,"sex=?",new String[]{"男"},null,null,null);
                while (cursor.moveToNext()) {//cursor游标默认在第一行,可以通过移动游标来获取数据
                    int id =cursor.getInt(0);
                    String name=cursor.getString(1);
                    String sex=cursor.getString(2);
                    int age =cursor.getInt(3);
                    Log.i("Main"," id:"+id+" name:"+name+" sex:"+sex+" age:"+age);


                }
                 cursor.close();//关闭cursor,防止内存泄漏
            }
        });

    }
}

查询前(我又添加了几条数据)
在这里插入图片描述
查询结果
在这里插入图片描述

2.SQLite数据库案例实战

在这里插入图片描述

第一步,建表

activity中
在这里插入图片描述


public class MainActivity extends AppCompatActivity {


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

        MySQLiteOpenHelper mySQLiteOpenHelper=new MySQLiteOpenHelper(this,"students.db",null,1);
        final SQLiteDatabase sqLiteDatabase=mySQLiteOpenHelper.getWritableDatabase();
       
    }
}

MySQLiteOpenHelper实体类中
在这里插入图片描述

   
public class MySQLiteOpenHelper  extends SQLiteOpenHelper{
    public MySQLiteOpenHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //在这个方法里面来建表
        String sql="create table student(id integer primary key autoincrement,stuid varchar(50), stuname varchar(20),stuclass varchar(20))";
        db.execSQL(sql);// 这一步就完成了加载驱动和建立连接

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

    }
}

第二步,编写ui

在这里插入图片描述

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">


    <EditText
        android:id="@+id/editTextTextPersonName"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="10dp"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="10dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:hint="请输入学号"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <EditText
        android:id="@+id/editTextTextPersonName2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:hint="请输入姓名"
        app:layout_constraintStart_toStartOf="@+id/editTextTextPersonName"
        app:layout_constraintTop_toBottomOf="@+id/editTextTextPersonName" />

    <EditText
        android:id="@+id/editTextTextPersonName3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:hint="请输入班级"
        app:layout_constraintStart_toStartOf="@+id/editTextTextPersonName2"
        app:layout_constraintTop_toBottomOf="@+id/editTextTextPersonName2" />

    <EditText
        android:id="@+id/editTextTextPersonName4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="10dp"
        android:ems="10"
        android:inputType="textPersonName"
        android:hint="查询学生信息"
        app:layout_constraintStart_toStartOf="@+id/editTextTextPersonName3"
        app:layout_constraintTop_toBottomOf="@+id/editTextTextPersonName3" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="增加学生"
        app:layout_constraintBottom_toBottomOf="@+id/editTextTextPersonName3"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/editTextTextPersonName3" />

    <Button
        android:id="@+id/button2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="查询学生"
        app:layout_constraintBottom_toBottomOf="@+id/editTextTextPersonName4"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/editTextTextPersonName4" />
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recylerview"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintTop_toBottomOf="@id/button2"
        app:layout_constraintBottom_toBottomOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

运行一下,建表成功(这里我们需要打开的是students.db数据库)
点击文内跳转到—数据库修改后查看方式
在这里插入图片描述

第三步,设置增加数据按钮

在这里插入图片描述


public class MainActivity extends AppCompatActivity {

    EditText mEditText;
    EditText mEditText2;
    EditText mEditText3;

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

        MySQLiteOpenHelper mySQLiteOpenHelper=new MySQLiteOpenHelper(this,"students.db",null,1);
        final SQLiteDatabase sqLiteDatabase=mySQLiteOpenHelper.getWritableDatabase();
        Button button=findViewById(R.id.button);

        mEditText=findViewById(R.id.editTextTextPersonName);
        mEditText2=findViewById(R.id.editTextTextPersonName2);
        mEditText3=findViewById(R.id.editTextTextPersonName3);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //todo mEditText 这里最好有一个判空操作
                ContentValues contentValues=new ContentValues();
                contentValues.put("stuid",mEditText.getText().toString());
                contentValues.put("stuname",mEditText2.getText().toString());
                contentValues.put("stuclass",mEditText3.getText().toString());


                sqLiteDatabase.insert("student",null,contentValues);
                Toast.makeText(MainActivity.this, "增加学生成功", Toast.LENGTH_LONG).show();
            }
        });
    }
}

点击文内跳转到—数据库修改后查看方式
在这里插入图片描述

第四步,添加Recyclerview视图

参照博客
首先,之前在布局文件中添加了Recyclerview控件,还需要建立一个item布局文件
在这里插入图片描述

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="150dp">


    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="42dp"
        android:layout_marginLeft="42dp"
        android:text="TextView"
        app:layout_constraintBottom_toTopOf="@+id/textView2"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/textView3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="@+id/textView2"
        app:layout_constraintTop_toBottomOf="@+id/textView2" />

    <TextView
        android:id="@+id/textView2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="TextView"
        app:layout_constraintBottom_toTopOf="@+id/textView3"
        app:layout_constraintStart_toStartOf="@+id/textView"
        app:layout_constraintTop_toBottomOf="@+id/textView" />



</androidx.constraintlayout.widget.ConstraintLayout>

第二步,创建实体类
在这里插入图片描述

    
    public class Student {
        public int id;
        public String stuid;
        public String stuname;
        public String stuclass;
    }

第三步,activity中的逻辑操作(Holder,adapter,赋值)
在这里插入图片描述


public class MainActivity extends AppCompatActivity {

    EditText mEditText;
    EditText mEditText2;
    EditText mEditText3;
    RecyclerView mRecyclerView;
    List<Student> list=new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MySQLiteOpenHelper mySQLiteOpenHelper=new MySQLiteOpenHelper(this,"students.db",null,1);
        final SQLiteDatabase sqLiteDatabase=mySQLiteOpenHelper.getWritableDatabase();
        Button button=findViewById(R.id.button);

        mEditText=findViewById(R.id.editTextTextPersonName);
        mEditText2=findViewById(R.id.editTextTextPersonName2);
        mEditText3=findViewById(R.id.editTextTextPersonName3);
        mRecyclerView=findViewById(R.id.recylerview);//实例化

        Cursor cursor= sqLiteDatabase.query("student",null,null,null,null,null,null);//表示把所有字段的数据都取出来
        while (cursor.moveToNext()) {//cursor游标默认在第一行,可以通过移动游标来获取数据
            Student student=new Student();
            //有时候要同时修改多处相同的字段名 可以按住alt+shift+r
            //通过游标来取数据
            student.id=cursor.getInt(0);
            student.stuid=cursor.getString(1);
            student.stuname=cursor.getString(2);
            student.stuclass=cursor.getString(3);
            list.add(student);

        }
        cursor.close();//关闭cursor,防止内存泄漏
        mRecyclerView.setAdapter(new MyAdapter());
        //表示RecyclerView采用一种线性方式来排列,一行显示一个
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //todo mEditText 这里最好有一个判空操作
                ContentValues contentValues=new ContentValues();
                contentValues.put("stuid",mEditText.getText().toString());
                contentValues.put("stuname",mEditText2.getText().toString());
                contentValues.put("stuclass",mEditText3.getText().toString());


                sqLiteDatabase.insert("student",null,contentValues);
                Toast.makeText(MainActivity.this, "增加学生成功", Toast.LENGTH_LONG).show();
            }
        });
    }
    public class MyAdapter extends RecyclerView.Adapter<MyHolder>{

        @NonNull
        @Override
        public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view= LayoutInflater.from(MainActivity.this).inflate(R.layout.item,parent,false);//加载view
            MyHolder myHolder=new MyHolder(view);//返回view
            return myHolder;
        }

        @Override
        public void onBindViewHolder(@NonNull MyHolder holder, int position) {
            Student student=list.get(position);

            holder.textView.setText("学号: "+student.stuid);
            holder.textView1.setText("姓名: "+student.stuname);
            holder.textView2.setText("班级: "+student.stuclass);


        }

        @Override
        public int getItemCount() {
            return list.size();
        }
    }

    public  static class MyViewHolder{
        TextView textView;//成员变量
        TextView textView1;
        TextView textView2;
    }

    //RecyclerView  Holder写法
    public class MyHolder extends RecyclerView.ViewHolder{
        TextView textView;//成员变量
        TextView textView1;
        TextView textView2;
        public MyHolder(@NonNull View itemView) {
            super(itemView);
            textView=itemView.findViewById(R.id.textView);
            textView1=itemView.findViewById(R.id.textView2);
            textView2=itemView.findViewById(R.id.textView3);

        }
    }

}


补充:有时候要同时修改多处相同的字段名 可以按住alt+shift+r
可以看到,在activity里修改字段名 id 为mInt,然后实体类中也随着改了在这里插入图片描述

运行
在这里插入图片描述
但是每次添加数据只是添加到了数据库,我们的列表不会刷新数据,因此我们要在每次点击添加数据的时候在列表里也添加数据 ,
在这里插入图片描述

 
public class MainActivity extends AppCompatActivity {

    EditText mEditText;
    EditText mEditText2;
    EditText mEditText3;
    RecyclerView mRecyclerView;
    MyAdapter mMyAdapter;
    List<Student> list=new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MySQLiteOpenHelper mySQLiteOpenHelper=new MySQLiteOpenHelper(this,"students.db",null,1);
        final SQLiteDatabase sqLiteDatabase=mySQLiteOpenHelper.getWritableDatabase();
        Button button=findViewById(R.id.button);

        mEditText=findViewById(R.id.editTextTextPersonName);
        mEditText2=findViewById(R.id.editTextTextPersonName2);
        mEditText3=findViewById(R.id.editTextTextPersonName3);
        mRecyclerView=findViewById(R.id.recylerview);//实例化

        Cursor cursor= sqLiteDatabase.query("student",null,null,null,null,null,null);//表示把所有字段的数据都取出来
        while (cursor.moveToNext()) {//cursor游标默认在第一行,可以通过移动游标来获取数据
            Student student=new Student();
            //通过游标来取数据
            student.id=cursor.getInt(0);
            student.stuid=cursor.getString(1);
            student.stuname=cursor.getString(2);
            student.stuclass=cursor.getString(3);
            list.add(student);

        }
        cursor.close();//关闭cursor,防止内存泄漏
        mMyAdapter = new MyAdapter();
        mRecyclerView.setAdapter(mMyAdapter);
        //表示RecyclerView采用一种线性方式来排列,一行显示一个
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //todo mEditText 这里最好有一个判空操作
                ContentValues contentValues=new ContentValues();
                contentValues.put("stuid",mEditText.getText().toString());
                contentValues.put("stuname",mEditText2.getText().toString());
                contentValues.put("stuclass",mEditText3.getText().toString());
                long id = sqLiteDatabase.insert("student", null, contentValues);

                Student student=new Student();
                student.stuid=mEditText.getText().toString();
                student.stuname=mEditText2.getText().toString();
                student.stuclass=mEditText3.getText().toString();
                student.id= (int) id;
                list.add(student);
                mMyAdapter.notifyDataSetChanged();



                Toast.makeText(MainActivity.this, "增加学生成功", Toast.LENGTH_LONG).show();
            }
        });
    }
    public class MyAdapter extends RecyclerView.Adapter<MyHolder>{

        @NonNull
        @Override
        public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view= LayoutInflater.from(MainActivity.this).inflate(R.layout.item,parent,false);//加载view
            MyHolder myHolder=new MyHolder(view);//返回view
            return myHolder;
        }

        @Override
        public void onBindViewHolder(@NonNull MyHolder holder, int position) {
            Student student=list.get(position);

            holder.textView.setText("学号: "+student.stuid);
            holder.textView1.setText("姓名: "+student.stuname);
            holder.textView2.setText("班级: "+student.stuclass);


        }

        @Override
        public int getItemCount() {
            return list.size();
        }
    }

    public  static class MyViewHolder{
        TextView textView;//成员变量
        TextView textView1;
        TextView textView2;
    }

    //RecyclerView  Holder写法
    public class MyHolder extends RecyclerView.ViewHolder{
        TextView textView;//成员变量
        TextView textView1;
        TextView textView2;
        public MyHolder(@NonNull View itemView) {
            super(itemView);
            textView=itemView.findViewById(R.id.textView);
            textView1=itemView.findViewById(R.id.textView2);
            textView2=itemView.findViewById(R.id.textView3);

        }
    }

}


运行,可以看到我们一开始下拉刷新是没有加载数据的,点击按钮以后新增了一条新数据
在这里插入图片描述

第五步,设置查询数据按钮

在这里插入图片描述
注意:问号是需要英文的问号,中文的会报错


public class MainActivity extends AppCompatActivity {

    EditText mEditText;
    EditText mEditText2;
    EditText mEditText3;
    RecyclerView mRecyclerView;
    MyAdapter mMyAdapter;
    List<Student> list=new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        MySQLiteOpenHelper mySQLiteOpenHelper=new MySQLiteOpenHelper(this,"students.db",null,1);
        final SQLiteDatabase sqLiteDatabase=mySQLiteOpenHelper.getWritableDatabase();
        Button button=findViewById(R.id.button);

        mEditText=findViewById(R.id.editTextTextPersonName);
        mEditText2=findViewById(R.id.editTextTextPersonName2);
        mEditText3=findViewById(R.id.editTextTextPersonName3);
        mRecyclerView=findViewById(R.id.recylerview);//实例化

        Cursor cursor= sqLiteDatabase.query("student",null,null,null,null,null,null);//表示把所有字段的数据都取出来
        while (cursor.moveToNext()) {//cursor游标默认在第一行,可以通过移动游标来获取数据
            Student student=new Student();
            //通过游标来取数据
            student.id=cursor.getInt(0);
            student.stuid=cursor.getString(1);
            student.stuname=cursor.getString(2);
            student.stuclass=cursor.getString(3);
            list.add(student);

        }
        cursor.close();//关闭cursor,防止内存泄漏



        mMyAdapter = new MyAdapter();
        mRecyclerView.setAdapter(mMyAdapter);
        //表示RecyclerView采用一种线性方式来排列,一行显示一个
        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));

        final EditText editText4=findViewById(R.id.editTextTextPersonName4);
       Button button1=findViewById(R.id.button2);
       button1.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               list.clear();//清空数据
               String content="%"+editText4.getText().toString()+"%";
               //like 表示模糊匹配   where stuname like %name%
               Cursor cursor= sqLiteDatabase.query("student",null,"stuname like ?",new  String[]{content},null,null,null);//表示把所有字段的数据都取出来
               while (cursor.moveToNext()) {//cursor游标默认在第一行,可以通过移动游标来获取数据
                   Student student=new Student();
                   //通过游标来取数据
                   student.id=cursor.getInt(0);
                   student.stuid=cursor.getString(1);
                   student.stuname=cursor.getString(2);
                   student.stuclass=cursor.getString(3);
                   list.add(student);

               }
               cursor.close();//关闭cursor,防止内存泄漏
               mMyAdapter.notifyDataSetChanged();//界面更新

           }
       });
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //todo mEditText 这里最好有一个判空操作
                ContentValues contentValues=new ContentValues();
                contentValues.put("stuid",mEditText.getText().toString());
                contentValues.put("stuname",mEditText2.getText().toString());
                contentValues.put("stuclass",mEditText3.getText().toString());
                long id = sqLiteDatabase.insert("student", null, contentValues);

                Student student=new Student();
                student.stuid=mEditText.getText().toString();
                student.stuname=mEditText2.getText().toString();
                student.stuclass=mEditText3.getText().toString();
                student.id= (int) id;
                list.add(student);
                mMyAdapter.notifyDataSetChanged();



                Toast.makeText(MainActivity.this, "增加学生成功", Toast.LENGTH_LONG).show();
            }
        });
    }
    public class MyAdapter extends RecyclerView.Adapter<MyHolder>{

        @NonNull
        @Override
        public MyHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view= LayoutInflater.from(MainActivity.this).inflate(R.layout.item,parent,false);//加载view
            MyHolder myHolder=new MyHolder(view);//返回view
            return myHolder;
        }

        @Override
        public void onBindViewHolder(@NonNull MyHolder holder, int position) {
            Student student=list.get(position);

            holder.textView.setText("学号: "+student.stuid);
            holder.textView1.setText("姓名: "+student.stuname);
            holder.textView2.setText("班级: "+student.stuclass);


        }

        @Override
        public int getItemCount() {
            return list.size();
        }
    }

    public  static class MyViewHolder{
        TextView textView;//成员变量
        TextView textView1;
        TextView textView2;
    }

    //RecyclerView  Holder写法
    public class MyHolder extends RecyclerView.ViewHolder{
        TextView textView;//成员变量
        TextView textView1;
        TextView textView2;
        public MyHolder(@NonNull View itemView) {
            super(itemView);
            textView=itemView.findViewById(R.id.textView);
            textView1=itemView.findViewById(R.id.textView2);
            textView2=itemView.findViewById(R.id.textView3);

        }
    }

}


运行
在这里插入图片描述
模糊匹配多个字段
在这里插入图片描述

                           Cursor cursor= sqLiteDatabase.query("student",null,"stuname like ? or stuclass like ?",new  String[]{content,content},null,null,null);//表示把所有字段的数据都取出来


关于SQLite数据库就先讲到这啦,谢谢您的阅读,下一讲我会讲到更方便的方法哦
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_46526828/article/details/107661893
今日推荐