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 只有数据库为空时才初始化数据
  1. 在DAO中添加一个方法来获取一个单词

    @Query("SELECT * from word_table LIMIT 1")
        Word[] getAnyWord();
    
  2. 更新初始化方法检查数据是否存在

    @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 删除所有单词
  1. 在WordDao接口中添加deleteAll( )并注解

    @Query("DELETE FROM word_table")
    void deleteAll();
    
  2. 将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;
       
    
    
  3. 将deleteAll( ) 添加到 WordViewModel 类

94.3 添加选项菜单项以删除所有数据
  1. 添加清除所有数据菜单选项

    @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 删除一个单词
  1. 将deleteWord( ) 添加到 DAO 并对其进行注释

    @Delete
    void deleteWord(Word word);
    
  2. 将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;
       
    
    
  3. 将deleteWord( ) 添加到 WordViewModel 类

    public void deleteWord(Word word) mRepository.deleteWord(word);
    
94.5 使用户能够刷掉单词
  1. 启用适配器检测刷过的单词

项目地址:

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()or onSwipe()

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类UserUser的属性与数据库中的字段需要一一对应
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开发笔记(二十一)Room 创建和使用

Android Jetpack 从使用到源码深耕数据库注解Room 从实践到原理

Android开发笔记(一百七十五)利用Room简化数据库操作

Android开发笔记(一百七十五)利用Room简化数据库操作

Android开发笔记(一百七十五)利用Room简化数据库操作