1. 程式人生 > 實用技巧 >Android中使用Room(ORM關係對映框架)對sqllite資料庫進行增刪改查

Android中使用Room(ORM關係對映框架)對sqllite資料庫進行增刪改查

場景

Room

Room是Google官方提供的資料庫ORM框架,使用起來非常方便。Room在SQLite上提供了一個抽象層,以便在利用SQLite的全部功能的同時能更加流暢的訪問資料庫。

Room中三個主要元件:

Database:該元件用來建立一個database holder。註解定義實體的列表,類的內容定義從資料庫中獲取資料的物件(DAO)。它也是底層連線的主要入口。這個被註解的類是一個繼承RoomDatabase的抽象類。在執行時,可以通過呼叫Room.databaseBuilder() 或者 Room.inMemoryDatabaseBuilder()來得到它的例項。

Entity:該元件的一個示例表示資料庫的一行資料,對於每個Entity類來說,都會有對應的table被建立。想要這些Entity被建立,就需要解除安裝上面的Database的註解參屬entities列表中,預設Entity中的所有欄位都會來建立表,除非該欄位上加上@Ignore註解。

Dao:該元件用來表述具有Data Access Object(DAO)功能的類或者介面,DAO類時Room的重要元件,負責定義查詢(新增或者刪除等)資料庫的方法。使用@Database註解的類中必須定義一個不帶引數的抽象方法,這個方法返回使用@Dao註解的類,返回型別為@Dao註解過的類的抽象方法Room會在編譯時生成這個類的實現。

Room 不同元件之間的關係

官方Room教程

https://developer.android.google.cn/training/data-storage/room

注:

部落格:
https://blog.csdn.net/badao_liumang_qizhi


關注公眾號
霸道的程式猿
獲取程式設計相關電子書、教程推送與免費下載。

實現

開啟Android Studio 新建一個專案,勾選上下面的User legacy android support libraries

然後點選Finish,然後開啟build.grdle,新增專案依賴

    def room_version = "2.2.5"

    implementation "androidx.room:room-runtime:$room_version"
    annotationProcessor "androidx.room:room-compiler:$room_version
"

新增位置

下面開始按照官方文件構建三個元件。

首先是資料庫元件,按照其文件說明

以及官方推薦的使用單例設計模式

在包下新建繼承自RoomDatabase的類,這裡叫AppDatebase

package com.badao.roomstudy.room;

import androidx.room.Database;
import androidx.room.Room;
import androidx.room.RoomDatabase;

import com.badao.roomstudy.MyApplication;


@Database(entities = {User.class}, version = 1, exportSchema = false)
public abstract class AppDatabase extends RoomDatabase {

    private static AppDatabase INSTANCE;


    public static AppDatabase getInstance() {
        if (INSTANCE == null) {
            synchronized (AppDatabase.class) {
                if (INSTANCE == null) {
                    INSTANCE = Room.databaseBuilder(MyApplication.context, AppDatabase.class, "badao.db")
                            .allowMainThreadQueries()
                            .build();
                }
            }
        }
        return INSTANCE;
    }

    public abstract  UserDao userDao();

 

}

因為此類作為工具類的方式存在,在進行構建資料庫時需要獲取Context物件。

所以另外再新建一個繼承自Application的類MyApplication

package com.badao.roomstudy;

import android.app.Application;
import android.content.Context;

public class MyApplication extends Application {
    public static Context context;

    @Override
    public void onCreate() {
        super.onCreate();
        context = this;
    }
}

然後在AndroidMainifest.xml中新增

    <application
        android:name=".MyApplication"

在上面的AppDarabase中用到了User這個類,就是Entity元件

新建User.java

package com.badao.roomstudy.room;

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

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

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

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

    public int getUid() {
        return uid;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

有三個屬性:uid使用PrimaryKey註解作為主鍵,後面是姓和名兩個屬性,使用@ColumnInfo(name = "first_name")對映資料庫中的列。

然後再新建Dao層元件UserDao介面

package com.badao.roomstudy.room;

import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.OnConflictStrategy;
import androidx.room.Query;

import java.util.List;

@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);

    @Query("SELECT * FROM user WHERE last_name LIKE :last LIMIT 1")
    User findByLastName(String last);

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void insertAll(User... users);

    @Delete
    void delete(User user);
}

並且建立了幾個方法。

然後在佈局檔案中新增幾個按鈕

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".MainActivity">


    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="新增資料"
        android:onClick="insertData"
        />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="查詢所有資料"
        android:onClick="getAll"
        />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="根據名字模糊查詢"
        android:onClick="findByLastName"
        />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="刪除"
        android:onClick="delete"
        />

</LinearLayout>

然後在對應的Activity中

package com.badao.roomstudy;


import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.badao.roomstudy.room.AppDatabase;
import com.badao.roomstudy.room.User;

import java.util.List;

public class MainActivity extends AppCompatActivity {

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


    /**
     * 新增資料
     * @param view
     */
    public void insertData(View view)
    {

        User user = new User();
        user.setUid((int) System.currentTimeMillis());
        user.setFirstName("公眾號"+Math.random());
        user.setLastName("霸道的程式猿");

        AppDatabase.getInstance().userDao().insertAll(user);
        Toast.makeText(this,"插入成功",Toast.LENGTH_SHORT).show();
    }

    /**
     * 查詢所有資料
     * @param view
     */
    public void getAll(View view)
    {
        StringBuilder stringBuilder = new StringBuilder();

        List<User> userList = AppDatabase.getInstance().userDao().getAll();
        for (User user:userList) {
            stringBuilder.append(","+user.getLastName());
        }
        Toast.makeText(this,"查詢到所有的名字為:"+stringBuilder,Toast.LENGTH_SHORT).show();
    }

    /**
     * 條件查詢
     * @param view
     */
    public void findByLastName(View view) {
        User user = AppDatabase.getInstance().userDao().findByLastName("霸道%");
        if (user == null) {
            Toast.makeText(this, "沒有查到" , Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "查詢到的名字為:" + user.getFirstName() + user.getLastName(), Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 刪除
     * @param view
     */
    public void delete(View view) {
        User user = new User();
        user.setUid(0);
        AppDatabase.getInstance().userDao().delete(user);
        Toast.makeText(this, "刪除成功" , Toast.LENGTH_SHORT).show();

    }


}

即可實現對資料庫的增刪改查。

對應的資料庫檔案的位置在data/data/你的包名/database下

Android中怎樣使用Navicat視覺化檢視sqllite的資料庫(檢視db檔案):

https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/110818121

示例程式碼下載

https://download.csdn.net/download/BADAO_LIUMANG_QIZHI/13487201