場景
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