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