Room数据库快速实战

Room数据库是Google的JitPack组件中的一个,推出已经有一段时间了,现在的使用者也越来越多,Room是一个轻量级的ORM(Object Relational Mapping:对象关系映射)数据库。

添加依赖
    implementation "androidx.room:room-runtime:2.4.0-alpha03"
    annotationProcessor "androidx.room:room-compiler:2.4.0-alpha03"

啥也不说了,先上效果图,这里做了一个添加和删除记事本的功能:

各种注解含义:

  • @Entity(tableName = “tb_name”)
    表示根据该类创建名为tb_note的表
  • @ColumnInfo(name = “title”)
    表示在表中创建名为title的字段
  • @PrimaryKey(autoGenerate = true)
    数据库自增长id

Room通过注解的方式来建立起与数据库的映射关系。
这里创建NoteBean:

@Entity(tableName = "notes")
public class NoteBean {
    @PrimaryKey(autoGenerate = true)
    @NonNull
    public int id;
    @ColumnInfo(name = "title")
    public String title;
    @ColumnInfo(name = "content")
    public String content;

    public NoteBean(String title, String content) {
        this.title = title;
        this.content = content;
    }
}

创建增删查改的Dao类:

@Dao
public interface NoteDao {

    @Insert()
    void insertData(NoteBean noteBean);

    @Query("SELECT * FROM notes")
    List queryAll();

    @Query("DELETE FROM notes")
    void clearAll();
}

创建对应的RoomDatabase:

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

    public abstract NoteDao noteDao();
}

NoteDbManager管理类:

object NoteDbManager {
    var noteDb: NoteDataBase? = null

    fun initDb(context: Context) {
        Thread {
            initNoteDB(context)
        }.start()
    }

    /**
     * 初始化数据库
     */
    private fun initNoteDB(context: Context) {
        //本地持久化数据库
        noteDb = Room.databaseBuilder(
            context,
            NoteDataBase::class.java,
            "note.db"
        ) //是否允许在主线程上操作数据库,默认false。
            .allowMainThreadQueries() //数据库创建和打开的事件会回调到这里,可以再次操作数据库
            .addCallback(object: RoomDatabase.Callback() {
                override fun onCreate(db: SupportSQLiteDatabase) {
                    super.onCreate(db)
                }

                override fun onOpen(db: SupportSQLiteDatabase) {
                    super.onOpen(db)
                }
            })
            .build()
    }

    fun queryAll(): List? {
        return noteDb?.noteDao()?.queryAll()
    }

    fun clearData() {
        noteDb?.noteDao()?.clearAll()
    }
}

MainActivity代码:

class MainActivity : AppCompatActivity() {
    private var ivAdd: ImageView? = null
    private var recyclerView: RecyclerView?= null
    private var adapter: NoteAdapter?= null
    private var tvNoData: TextView?= null
    private var tvClear: TextView?= null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        ivAdd = findViewById(R.id.iv_add)
        recyclerView = findViewById(R.id.recyclerview)
        tvNoData = findViewById(R.id.tv_no_data)
        tvClear = findViewById(R.id.tv_clear)

        ivAdd?.setOnClickListener {
            startActivity(Intent(this, CreateNoteActivity::class.java))
        }

        tvClear?.setOnClickListener {
            NoteDbManager.clearData()
            refreshList()
        }

        NoteDbManager.initDb(applicationContext)
        adapter = NoteAdapter(applicationContext)
        recyclerView?.adapter = adapter
    }

    override fun onResume() {
        super.onResume()

        refreshList()
    }

    /**
     * 刷新列表数据
     */
    private fun refreshList() {
        val datas = NoteDbManager.queryAll()
        if (datas != null) {
            adapter?.setDatas(datas as ArrayList)
            tvNoData?.visibility = if (datas.isNotEmpty()) View.GONE else View.VISIBLE
        } else {
            adapter?.clearDatas()
            tvNoData?.visibility = View.VISIBLE
        }
    }
}

然后,其余就是调用数据库操作的事件以及列表展示。

阅读全文
下载说明:
1、本站所有资源均从互联网上收集整理而来,仅供学习交流之用,因此不包含技术服务请大家谅解!
2、本站不提供任何实质性的付费和支付资源,所有需要积分下载的资源均为网站运营赞助费用或者线下劳务费用!
3、本站所有资源仅用于学习及研究使用,您必须在下载后的24小时内删除所下载资源,切勿用于商业用途,否则由此引发的法律纠纷及连带责任本站和发布者概不承担!
4、本站站内提供的所有可下载资源,本站保证未做任何负面改动(不包含修复bug和完善功能等正面优化或二次开发),但本站不保证资源的准确性、安全性和完整性,用户下载后自行斟酌,我们以交流学习为目的,并不是所有的源码都100%无错或无bug!如有链接无法下载、失效或广告,请联系客服处理!
5、本站资源除标明原创外均来自网络整理,版权归原作者或本站特约原创作者所有,如侵犯到您的合法权益,请立即告知本站,本站将及时予与删除并致以最深的歉意!
6、如果您也有好的资源或教程,您可以投稿发布,成功分享后有站币奖励和额外收入!
7、如果您喜欢该资源,请支持官方正版资源,以得到更好的正版服务!
8、请您认真阅读上述内容,注册本站用户或下载本站资源即您同意上述内容!
原文链接:https://www.dandroid.cn/archives/12559,转载请注明出处。
0

评论0

显示验证码
没有账号?注册  忘记密码?