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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM