SQLite一个非常流行的嵌入式数据库,它支持SQL语言,并且只利用很少的内存就有很好的性能。此外它还是开源的,任何人都可以使用它。 特点:
1.轻量级-只适合存小量数据
2.开源免费
3.sql语法通用 使用场景:一般用来做手机的数据缓存
SQLite和Mysql数据库 存储区别
举个例子,比方说一个app,app里面的数据从哪里来呢,之前我们又讲到从网络上获取,网咯获取实际上是通过一个服务器来获取, 服务器的数据从哪里来呢?因为服务器本身只是一个应用,这个应用需要查询数据,这个服务器本身会安装一个数据库,服务器上安装的这个数据库,就可以是我们常用到的
MySQL,Oracle
这类数据库,服务器一般是一台windows系统或者Linux系统的电脑,app发一个请求到服务器,服务器再到数据库里面查询数据,然后把数据返回到app,像服务器用来查询的数据库,一般存的是所有用户的数据,所以存的数据会非常多,但是只会返回对应用户的数据,不会全部返回给用户,而app接收到数据以后,就会在本地做一个缓存,图片之类的缓存会存在文件,带有标志位的数据会存在sp,而像qq这类的消息记录缓存一般会存在SQLite
数据库,
一般只对单表操作,当然多表也是可以的
类似java连接数据库的过程
- 加载驱动
- 建立连接
- 建立的连接进行增删改查
create table user(id integer primary key autoincrement,
name varchar(50),
sex varchar(20),
date varchar(50),
content varchar(100),
age integer)
select * from tabname where id =1
insert into tabname values(null,'aa', '男','1988-10-2',' .....')
update tabname set sex='男' where id=4;
delete from tabname where id=5;
在java中,加载驱动的时候要考虑是MySQL还是Oracle数据库,对不同的数据库要加载不同的jar包,但是SQLite他就这一种,所以在安卓里面,加载驱动很多工作都做好了,安卓里面提供了一个类,这个类的名字叫 SQLiteOpenHelper帮助类
这个类是一个抽象类,它可以帮我们去加载驱动,但是它由于是个抽象类,我们知道,抽象是不能直接用的,我们要使用的话就要先实现它的抽象方法,实现它的抽象方法的前提是我们先要创建一个类来继承这个类
第一步,先创建一个类,然后继承 SQLiteOpenHelper这个类,并且实现抽象方法
然后再创建一个构造方法
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) {
}
}
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();
}
}
Android中SQLite数据库查看推荐博客《Android Studio查看SQLite数据库方法大全》
我们这里 采用SQLite Expert Professional工具来查看
第一步:导出模拟器数据库文件
找到data目录下的—》data目录—》应用程序包名—》databases文件夹下的数据库文件
右键保存到本地
保存到指定位置
第二步:查看数据库文件(
打开第一步保存的db文件
找到文件路径
查看
补充:
再对数据库表格进行修改(例如增删改查)以后,需要右键关闭数据库,然后再重复上面的第一步和第二步操作
第一步,我们先在布局文件加一个button
第二步,给button添加点击事件
我们首先看到insert这个方法需要传三个值,第一个是数据库表名,第二个传一个null值就ok,第三个这个ContentValues我们可以把它看做是一个HashMap,虽然只是功能类似
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文件所对应数据库(可以看到我们已经成功添加数据)
这里我们需要用到的方法时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的数据已经删除
如果我们要在删除时,删除数据需要满足多个条件
//表示在表名为 user 中删除 id=2 并且 name=name1 的数据
sqLiteDatabase.delete("user","id=? and name=?",new String[]{"2","name1"});
//表示在表名为 user 中删除 id=2 或者 name=name1 的数据
sqLiteDatabase.delete("user","id=? or name=?",new String[]{"2","name1"});
这里我们需要用到的方法时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"});
}
});
}
}
这里我们需要用到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,防止内存泄漏
}
});
}
}
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();
}
}
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) {
}
}
<?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控件,还需要建立一个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数据库就先讲到这啦,谢谢您的阅读,下一讲我会讲到更方便的方法哦
Android入门第七讲04-数据库框架-xUtils(数据库映射(增删改查))