Android-room的学习

目录

关于ROOM 

 1.Room有3个主要的组件

 2.Room 不同组件之间的关系如图所示

 3.导入ROOM(使用 Room 需要添加依赖)

 4.(实现数据库操作的步骤)以下代码段包含具有一个实体和一个 DAO 的示例数据库配置

实例demo

1.Student.java

2.StudentDao.java

3.StudentDatabase.java

 4.MainActivity.java

 5.activity_main.xml

 参考资料



关于ROOM 

Room 在 SQLite 上提供了一个抽象层,以便在充分利用 SQLite 的强大功能的同时,能够流畅地访问数据库。

处理大量结构化数据的应用可极大地受益于在本地保留这些数据。最常见的用例是缓存相关数据。这样,当设备无法访问网络时,用户仍可在离线状态下浏览相应内容。设备之后重新连接到网络后,用户发起的所有内容更改都会同步到服务器。

 1.Room有3个主要的组件

  • 数据库:包含数据库持有者,并作为应用已保留的持久关系型数据的底层连接的主要接入点。

    使用 @Database 注释的类应满足以下条件:

    • 是扩展 RoomDatabase 的抽象类。
    • 在注释中添加与数据库关联的实体列表。
    • 包含具有 0 个参数且返回使用 @Dao 注释的类的抽象方法。

    在运行时,您可以通过调用 Room.databaseBuilder() 或 Room.inMemoryDatabaseBuilder() 获取 Database 的实例。

  • Entity:表示数据库中的表。

  • DAO:包含用于访问数据库的方法。

 应用使用 Room 数据库来获取与该数据库关联的数据访问对象 (DAO)。然后,应用使用每个 DAO 从数据库中获取实体,然后再将对这些实体的所有更改保存回数据库中。最后,应用使用实体来获取和设置与数据库中的表列相对应的值。

 2.Room 不同组件之间的关系如图所示

 3.导入ROOM(使用 Room 需要添加依赖

dependencies {
    def room_version = "2.2.0-alpha01"

    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version" // use kapt for Kotlin

    // optional - RxJava support for Room
    implementation "androidx.room:room-rxjava2:$room_version"

    // optional - Guava support for Room, including Optional and ListenableFuture
    implementation "androidx.room:room-guava:$room_version"

    // Test helpers
    testImplementation "androidx.room:room-testing:$room_version"
}

 4.(实现数据库操作的步骤)以下代码段包含具有一个实体和一个 DAO 的示例数据库配置

1.User.java (必须先创建一个需要映射的实体类,用@Entity进行注解)

@Entity
public class User {
    @PrimaryKey
    private int uid;

    @ColumnInfo(name = "first_name")
    private String firstName;

    @ColumnInfo(name = "last_name")
    private String lastName;

    // Getters and setters are ignored for brevity,
    // but they're required for Room to work.
}

2.UserDao.java( 创建一个操作实体类的dao接口,用@Dao进行注解)

@Dao
public interface UserDao {
    @Query("SELECT * FROM user")
    List<User> getAll();

    @Query("SELECT * FROM user WHERE uid IN (:userIds)")
    List<User> loadAllByIds(int[] userIds);

    @Query("SELECT * FROM user WHERE first_name LIKE :first AND "
           + "last_name LIKE :last LIMIT 1")
    User findByName(String first, String last);

    @Insert
    void insertAll(User... users);

    @Delete
    void delete(User user);
}

3.AppDatabase.java( 创建一个抽象类,添加@Database注解)

@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract UserDao userDao();
}

4.在创建上面的文件之后,使用以下代码获得创建数据库的实例:

AppDatabase db = Room.databaseBuilder(getApplicationContext(),
        AppDatabase.class, "database-name").build();

 

实例demo

1.Student.java

package com.example.applicationroom;

import androidx.room.ColumnInfo;
import androidx.room.Entity;
import androidx.room.PrimaryKey;

@Entity
public class Student {
    @PrimaryKey(autoGenerate = true) // 设置主键,并且自动生长
    private int id;
    @ColumnInfo(name = "username") // 设置别名,如果不设置就默认为变量名
    private String name;

   public Student(int id, String name) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

2.StudentDao.java

package com.example.applicationroom;

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 StudentDao {// 在这里声明数据库的操作,如增删改查

    @Insert
    public void insertStudents(Student...students);// 可以传递三个参数

    @Update
    void updateStudents(Student...students);

    @Delete
    void deleteStudents(Student...students);

    @Query("DELETE FROM STUDENT")
    void deleteAllStudents();

    @Query("SELECT * FROM STUDENT ORDER BY id ASC") // 升序排列

    List<Student> getAllStudents();


}

3.StudentDatabase.java

package com.example.applicationroom;

import androidx.room.Database;
import androidx.room.RoomDatabase;
@Database(entities = {Student.class}, version = 6, exportSchema = false)
public abstract class StudentDatabase extends RoomDatabase {

    public abstract StudentDao getStudentDao(); // 若有多个 Entity,则应该写多个 Dao

   /* private static  StudentDatabase mInstance;

    public StudentDatabase() { }

    public static StudentDatabase getsInstance(Context context) {
        if (mInstance == null) {
            synchronized (StudentDatabase.class) {
                if (mInstance == null) {
                    mInstance = Room.databaseBuilder(context.getApplicationContext(),
                            StudentDatabase.class, "StudentDb").fallbackToDestructiveMigration().addMigrations().allowMainThreadQueries().build();
                }
            }
        }
        return mInstance;
    }*/

}

 4.MainActivity.java

package com.example.applicationroom;

import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;
import androidx.room.Room;

import java.util.List;


public class MainActivity extends AppCompatActivity {
    StudentDatabase studentDatabase;
    StudentDao studentDao;
    TextView textView;
    Button buttonInsert,buttonUpdate,buttonDelete,buttonClear;


    @Override
    protected void onCreate(Bundle savedInstanceState)  {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        textView = findViewById(R.id.textView);
        // allowMainThreadQueries() 强制允许在主线程执行,真实开发中不要这么做
        //studentDatabase = StudentDatabase.getsInstance(this);
        //studentDao = studentDatabase.studentDao();
        // allowMainThreadQueries() 强制允许在主线程执行,真实开发中不要这么做
        studentDatabase = Room.databaseBuilder(this,StudentDatabase.class,"word_database").allowMainThreadQueries().build();
        studentDao = studentDatabase.getStudentDao();

        updateView();

        buttonInsert = findViewById(R.id.buttonInsert);
        buttonUpdate = findViewById(R.id.buttonUpdate);
        buttonDelete = findViewById(R.id.buttonDelete);
        buttonClear = findViewById(R.id.buttonClear);


        buttonInsert.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Student student1 = new Student(1,"吴美丽");
                Student student2 = new Student(2,"张漂亮");
                studentDao.insertStudents(student1,student2);
                updateView();
            }
        });

        buttonClear.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                studentDao.deleteAllStudents();
                updateView();
            }
        });

        buttonUpdate.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Student student3= new Student(3,"马可爱");
                studentDao.updateStudents(student3);
                updateView();
            }
        });

        buttonDelete.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Student student = new Student(0,"");
                studentDao.deleteStudents(student);
                updateView();
            }
        });

    }

    void updateView(){
        List<Student> list = studentDao.getAllStudents();
        String text = "";
        for(int i = 0; i < list.size(); i++){
            Student student= list.get(i);
            text += student.getId() + ":" + student.getName()  + "\n";
        }
        textView.setText(text);
    }
}

 5.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">

    <androidx.constraintlayout.widget.Guideline
        android:id="@+id/guideline"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        app:layout_constraintGuide_begin="188dp" />

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:layout_editor_absoluteX="-16dp"
        tools:layout_editor_absoluteY="51dp">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">

            <Button
                android:id="@+id/buttonUpdate"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="UPDATE" />

            <Button
                android:id="@+id/buttonInsert"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="INSERT" />

            <Button
                android:id="@+id/buttonDelete"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="DELETE" />

            <Button
                android:id="@+id/buttonClear"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="CLEAR" />

            <TextView
                android:id="@+id/textView"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"

                android:text="TextView" />

        </LinearLayout>
    </ScrollView>

</androidx.constraintlayout.widget.ConstraintLayout>

 

       

 图一:插入数据

图二:清空数据

 

保存的数据库文件,可以在存储中找到,如图:

 参考资料:

使用 Room 将数据保存到本地数据库

【Android-Room数据库系列】—— Room 基础

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值