Android学习笔记 94. 从 Room 数据库中删除数据
Posted Ding Jiaxiong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android学习笔记 94. 从 Room 数据库中删除数据相关的知识,希望对你有一定的参考价值。
android学习笔记
Android 开发者基础知识 (Java) —— Google Developers 培训团队
文章目录
第3单元 在后台运行
第10课 使用Room存储数据
94. 从 Room 数据库中删除数据
你会做什么
- 更新 RoomWordsSample 应用程序以在应用程序关闭时保留数据。
- 允许用户通过选择选项菜单项来删除所有单词。
- 允许用户通过滑动列表中的项目来删除特定单词。
- 或者,在编码挑战中,扩展应用程序以允许用户更新现有单词。
94.1 只有数据库为空时才初始化数据
-
在DAO中添加一个方法来获取一个单词
@Query("SELECT * from word_table LIMIT 1") Word[] getAnyWord();
-
更新初始化方法检查数据是否存在
@Override protected Void doInBackground(final Void... params) // If we have no words, then create the initial list of words if (mDao.getAnyWord().length < 1) for (int i = 0; i <= words.length - 1; i++) Word word = new Word(words[i]); mDao.insert(word); return null;
94.2 删除所有单词
-
在WordDao接口中添加deleteAll( )并注解
@Query("DELETE FROM word_table") void deleteAll();
-
将deleteAll( ) 添加到 WordRepository 类
private static class deleteAllWordsAsyncTask extends AsyncTask<Void, Void, Void> private WordDao mAsyncTaskDao; deleteAllWordsAsyncTask(WordDao dao) mAsyncTaskDao = dao; @Override protected Void doInBackground(Void... voids) mAsyncTaskDao.deleteAll(); return null;
-
将deleteAll( ) 添加到 WordViewModel 类
94.3 添加选项菜单项以删除所有数据
-
添加清除所有数据菜单选项
@Override public boolean onOptionsItemSelected(MenuItem item) int id = item.getItemId(); if (id == R.id.clear_data) // Add a toast just for confirmation Toast.makeText(this, "Clearing the data...", Toast.LENGTH_SHORT).show(); // Delete the existing data mWordViewModel.deleteAll(); return true; return super.onOptionsItemSelected(item);
94.4 删除一个单词
-
将deleteWord( ) 添加到 DAO 并对其进行注释
@Delete void deleteWord(Word word);
-
将deleteWord( ) 添加到 WordRepository 类
private static class deleteWordAsyncTask extends AsyncTask<Word, Void, Void> private WordDao mAsyncTaskDao; deleteWordAsyncTask(WordDao dao) mAsyncTaskDao = dao; @Override protected Void doInBackground(final Word... params) mAsyncTaskDao.deleteWord(params[0]); return null;
-
将deleteWord( ) 添加到 WordViewModel 类
public void deleteWord(Word word) mRepository.deleteWord(word);
94.5 使用户能够刷掉单词
- 启用适配器检测刷过的单词
项目地址:
https://github.com/google-developer-training/android-fundamentals-apps-v2/tree/master/RoomWordsWithDelete
94.6 总结
编写数据库代码
- Room 负责在每次执行数据库操作时打开和关闭数据库连接。
- 将数据访问对象 (DAO) 中的方法注释为
@insert
、@delete
、@update
、@query
。 - 对于简单的插入、更新和删除,在DAO中的方法中添加相关的注解就足够了。
例如:
@Delete
void deleteWord(Word word);
@Update
void update(Word... word);
- 对于查询或更复杂的数据库交互,例如删除所有单词,请使用
@query
注释并提供操作的 SQL。
例如:
@Query("SELECT * from word_table ORDER BY word ASC")
LiveData<List<Word>> getAllWords();
@Query("DELETE FROM word_table")
void deleteAll();
ItemTouchHelper
- 要使用户能够在 中滑动或移动项目
RecyclerView
,您可以使用ItemTouchHelper
该类。 - 实施
onMove()
和onSwipe().
- 要识别用户移动或滑动的项目,您可以为
RecylerView
. 该方法获取一个位置并返回相关项目。调用里面的方法onMove()
oronSwipe()
。
Android第十一讲笔记(SqLite数据库,Room框架)
目录
SQLite数据库
- MySQL Oracle
- SQLite
SQLite一个非常流行的嵌入式数据库,它支持SQL语言,并且只利用很少的内存就有很好的性能。此外它还是开源的,任何人都可以使用它。
但是其不适合处理大规模数据。
SQLite常用来存储每一个用户各自的信息。
1.SQLite数据库实际操作
运行 Database Inspector 需要在API Level 26 或者更高的设备上。Database Inspector是一个动态数据库工具,可以查询和修改表数据,执行查询语句,执行 Dao 文件中定义的 Room 查询语句。
1.OpenSqlHelper工具类(用于它可以帮我们去加载驱动)
在这个工具类中我们同时也建了一个表
后续用这个工具类可以进行增删改查的操作
public class OpenSqlHelper extends SQLiteOpenHelper {
// name -> 数据库名字
public OpenSqlHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
// 建表
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table user(id integer primary key autoincrement,username varchar(20),password varchar(20),age integer) ");
}
// 更新表
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
2.在Activity中进行增删改查操作
首先我们在activity_main.xml布局文件中增加四个按钮来设置点击之后增删改查的操作
activity_main.xml
<?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">
<Button
android:id="@+id/button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="126dp"
android:text="增加数据"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<Button
android:id="@+id/button2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="52dp"
android:layout_marginEnd="1dp"
android:layout_marginRight="1dp"
android:text="删除数据"
app:layout_constraintEnd_toEndOf="@+id/button"
app:layout_constraintTop_toBottomOf="@+id/button" />
<Button
android:id="@+id/button3"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="1dp"
android:layout_marginLeft="1dp"
android:layout_marginTop="49dp"
android:text="查询数据"
app:layout_constraintStart_toStartOf="@+id/button2"
app:layout_constraintTop_toBottomOf="@+id/button2" />
</androidx.constraintlayout.widget.ConstraintLayout>
1.增加数据
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 增加数据
OpenSqlHelper openSqlHelper=new OpenSqlHelper(MainActivity.this,"test123",null,1);
SQLiteDatabase sqLiteDatabase= openSqlHelper.getWritableDatabase();
// ContengValues->HashMap
ContentValues contentValues=new ContentValues();
contentValues.put("username","a碟");
contentValues.put("password","123456");
contentValues.put("age",19);
sqLiteDatabase.insert("user",null,contentValues);
}
});
在多次点击增加之后
2.删除数据
findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
OpenSqlHelper openSqlHelper=new OpenSqlHelper(MainActivity.this,"test123",null,1);
SQLiteDatabase sqLiteDatabase=openSqlHelper.getWritableDatabase();
String id="1";
String username="a碟";
sqLiteDatabase.delete("user","id=? and username = ?",new String[]{id,username});
}
});
3.修改数据
findViewById(R.id.button4).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
OpenSqlHelper openSqlHelper=new OpenSqlHelper(MainActivity.this,"test123",null,1);
SQLiteDatabase sqLiteDatabase = openSqlHelper.getWritableDatabase();
ContentValues contentValues=new ContentValues();
contentValues.put("username","b碟");
String id="5";
sqLiteDatabase.update("user",contentValues,"id= ?",new String[]{id});
}
});
4.查询数据
findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
OpenSqlHelper openSqlHelper=new OpenSqlHelper(MainActivity.this,"test123",null,1);
SQLiteDatabase sqLiteDatabase = openSqlHelper.getWritableDatabase();
String username="a碟";
Cursor cursor=sqLiteDatabase.query("user",null,"username = ?",new String[]{username},null,null,null);
while(cursor.moveToNext()){
String username1=cursor.getString(cursor.getColumnIndex("username"));
int id1=cursor.getInt(cursor.getColumnIndex("id"));
Log.i("MainActivity","username= "+username1+" id = "+id1);
}
}
});
2.Room框架
Room是谷歌官方的数据库ORM(对象关系映射)框架,使用起来非常方便。
Room提供了一个SQLite之上的抽象层,使得在充分利用SQLite功能的前提下顺畅的访问数据库。
1.前期准备
首先新建一个接口UserDao
这个接口中写了需要的增删改查方法,并在对应的位置标记了对应的注解。
在添加注解的时候爆红,光标点击在对应的爆红的位置按住alt+enter即可选择导入依赖
在DAO(data access object)中,可以使用SQL语句进行对数据库的操作并且将这些语句与Java中方法关联调用,编译器会检查SQL语句并且通过注解生成对应的查询语句,例如@Insert。
注意:
1、DAO必现是抽象类或者接口
2、所有的查询语句必须在单独的线程里面执行。
package com.hnucm.android_05_27;
import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;
import androidx.room.Update;
import java.util.List;
@Dao
public interface UserDao {//提供表的增删改查方法
@Insert
void addUser(User user);
@Delete
void deleteUser(User user);
@Update
void update(User user);
@Query("select * from user")
List<User> find();
@Query("select * from user where id = :id")
List<User> findAllUserById(int id);
// 模糊搜索
@Query("select * from user where username like '%' || :name ||'%'")
List<User>findAllUsersByName(String name);
}
抽象类UserDatabase
package com.hnucm.android_05_27;
import androidx.room.Database;
import androidx.room.RoomDatabase;
@Database(entities = {User.class},version = 1,exportSchema = false)
public abstract class UserDatabase extends RoomDatabase {
public abstract UserDao getUserDao();
}
java类User,User的属性与数据库中的字段需要一一对应
Room Database中的Entity表示一张数据表结构,一个Entity实例就是表中的一行,如定义一个User类的Entity。
重点:
1、一个Entity对象代表数据表中的一行,一个Entity类代表一张数据表。
2、Entity中的成员变量都是数据表中的列。
3、一个Java类定义成Entity只要加上Entity注解就可以了。
package com.hnucm.android_05_27;
import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;
//与数据库中的字段一一对应
@Entity
public class User {
@PrimaryKey(autoGenerate = true)
public int id;
@ColumnInfo(name="username")
public String username;
public String password;
public int age;
}
2.增删改查
之后可以通过UserDao的实现类来对数据库进行增删改查
1.增加数据
findViewById(R.id.button).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
User user=new User();
user.username="test123";
user.password="123456";
user.age=20;
userDao.addUser(user);
}
});
2.删除数据
findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
User user=new User();
user.username="test123";
userDao.deleteUser(user);
}
});
3.修改数据
findViewById(R.id.button4).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
User user=new User();
user.username="test222";
user.id=5;
userDao.update(user);
}
});
4.查找数据
1.普通查询
findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
List<User>userList=userDao.find();
for(User user:userList){
Log.i("MainActivity","id = "+user.id+"username = "+user.username);
}
}
});
2.按照id查询
findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
int id=2;
List<User>userList=userDao.findAllUserById(id);
for(User user:userList){
Log.i("MainActivity","id = "+user.id+"username = "+user.username);
}
}
});
3.模糊查询
findViewById(R.id.button3).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
List<User>userList=userDao.findAllUsersByName("test");
for(User user:userList){
Log.i("MainActivity","id = "+user.id+"username = "+user.username);
}
}
});
根据以上几个案例,我们发现使用room框架基于注解开发,非常简单的就完成了增删改查的操作。
以上是关于Android学习笔记 94. 从 Room 数据库中删除数据的主要内容,如果未能解决你的问题,请参考以下文章
Android第十一讲笔记(SqLite数据库,Room框架)
Android Jetpack 从使用到源码深耕数据库注解Room 从实践到原理
Android开发笔记(一百七十五)利用Room简化数据库操作