Android 备忘录,记事本程序设计

android备忘录实现,使用ObjectBox数据库框架进行数据存储,增删改查等操作。代码使用kotlin编写。

1、下面看看ObjectBox数据库封装

需要注意的是:

/**

* 你只有配置好之后, 点击 Make Model '你的model名字', 才会创建 MyObjectBox对象

* 对于MyObjectBox的包名, 目前我发现的是找到第一个Entity的包名

* 如果项目使用了Kotlin, 必须添加插件apply plugin: 'kotlin-kapt'

* 实体Entity是不能继承的哦.继承的字段不会被解析

*/

java 复制代码
package com.mmsx.note.app

import android.content.Context
import android.util.Log
import com.elvishew.xlog.XLog
import com.mmsx.note.entity.MyObjectBox
import com.mmsx.note.entity.NoteEntity
import com.mmsx.note.entity.NoteEntity_
import io.objectbox.Box
import io.objectbox.BoxStore
import io.objectbox.android.AndroidObjectBrowser
import io.objectbox.android.BuildConfig

object ObjectBox {
    lateinit var boxStore: BoxStore
        private set

    /**
     * 你只有配置好之后, 点击 Make Model '你的model名字', 才会创建 MyObjectBox对象
     * 对于MyObjectBox的包名, 目前我发现的是找到第一个Entity的包名
     * 如果项目使用了Kotlin, 必须添加插件apply plugin: 'kotlin-kapt'
     * 实体Entity是不能继承的哦.继承的字段不会被解析
     */
    fun init() : BoxStore{
        boxStore = MyObjectBox.builder()
            .androidContext(NoteApplication.instance.applicationContext)
            .build()
        if (BuildConfig.DEBUG) {
            val started = AndroidObjectBrowser(boxStore).start(NoteApplication.instance)
            XLog.d("ObjectBrowser", "Started: $started")
        }
        return boxStore
    }


    /**
     * 重启数据库
     * 删除本地数据库后,需要重新创建
     */
    fun  restartBoxStore(){
        boxStore = MyObjectBox.builder().androidContext(NoteApplication.instance).build()
    }

    /**
     * 添加数据
     */
    fun  addData(o: NoteEntity): Long {
        try {
            if (boxStore != null && !boxStore.isClosed) {
                boxStore.boxFor(NoteEntity::class.java).put(o)
            }
        } catch (e: Throwable) {
            Log.d("lyy", "error:${e.printStackTrace()}")
        }
        return 0
    }

    /**
     * 更新数据(如果直接插入更新的对象,有些字段没有值会覆盖掉)
     * 1、先查询到数据
     * 2、对查询到的数据字段进行更新
     * 3、查询不到,直接插入
     */
    fun updateData(o: NoteEntity) {
        try {
            if (boxStore != null && !boxStore.isClosed) {
                //1、先查询到数据
                val box: Box<NoteEntity> = boxStore.boxFor(NoteEntity::class.java)
                val list: MutableList<NoteEntity> = box.query().equal(NoteEntity_.id, o.id).build().find()
                var localBean = list.getOrNull(0)
                //2、对查询到的数据字段进行更新
                localBean?.let {
                    localBean.title = o.title
                    localBean.content = o.content
                    localBean.updatedAt = o.updatedAt
                    boxStore.boxFor(NoteEntity::class.java).put(localBean)
                }?: kotlin.run {
                    //3、查询不到,直接插入
                    ObjectBox.boxStore.boxFor(NoteEntity::class.java).put(o)
                }
            }
        } catch (e: Throwable) {
            Log.d("lyy", "error:${e.printStackTrace()}")
        }

    }


    /**
     * 获取全部对象数据
     */
    fun  getNoteEntityAllData(): MutableList<NoteEntity>? {
        try {
            if (boxStore != null && !boxStore.isClosed) {
                val box: Box<NoteEntity> = boxStore.boxFor(NoteEntity::class.java)
                return box.all
            }
        } catch (e: java.lang.Exception) {
        }
        return ArrayList()
    }

    /**
     * 条件查询
     */
    fun getNoteEntityData(title : String): List<NoteEntity>? {
        try {
            if (boxStore != null && !boxStore.isClosed) {
                val box: Box<NoteEntity> = boxStore.boxFor(NoteEntity::class.java)
                return box.query().equal(NoteEntity_.title, title).build().find()
            }
        } catch (e: java.lang.Exception) {
        }
        return ArrayList<NoteEntity>()
    }

    /**
     * 查询单个数据
     */
    fun getNoteEntity(id: Long): NoteEntity? {
        try {
            if (boxStore != null && !boxStore.isClosed) {
                val box: Box<NoteEntity> = boxStore.boxFor(NoteEntity::class.java)
                return box[id]
            }
        } catch (e: java.lang.Exception) {
        }
        return null
    }

    /**
     * 删除数据单个数据1
     */
    fun deleteNoteEntityData(id: Long): Boolean {
        try {
            if (boxStore != null && !boxStore.isClosed) {
                val box: Box<NoteEntity> = boxStore.boxFor(NoteEntity::class.java)
                return box.remove(id)
            }
        } catch (e: java.lang.Exception) {
        }
        return false
    }


    /**
     * 删除数据单个数据2
     */
    fun <Any> deleteData(o: Any, clazz: Class<Any>?) {
        try {
            if (boxStore != null && !boxStore.isClosed) {
                val box: Box<Any> = boxStore.boxFor<Any>(clazz)
                box.remove(o)
            }
        } catch (e: java.lang.Exception) {
        }
    }

    
}

2、主页面数据展示代码

使用kotlin代码编写,加上其他框架就是简洁啊

java 复制代码
class MainActivity : ScopedAppActivity(){
    private var adapter : NoteAdapter ? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_main)

        initView()
    }

    private fun initView() {
        adapter = NoteAdapter()
        main_note_recycler_view.layoutManager = LinearLayoutManager(this)
        main_note_recycler_view.adapter = adapter

        adapter?.setOnItemChildClickListener { adapter, view, position ->
            var intent = Intent(this, ShowNoteActivity::class.java).apply {
                putExtra("entity", adapter?.data?.get(position) as NoteEntity)
            }
            startActivity(intent)
        }
        main_add_view.setOnClickListener {
            startActivity(Intent(this, NoteActivity::class.java))
        }
        main_menu_view.setOnClickListener {
            startActivity(Intent(this, SettingActivity::class.java))
        }

    }

    override fun onResume() {
        super.onResume()
        val data = getNoteEntityAllData()
        adapter?.setNewData(data)
        if (data?.size == 0) {
            main_empty_view.visibility = View.VISIBLE
        }else{
            main_empty_view.visibility = View.GONE
        }
    }

    class NoteAdapter  : BaseQuickAdapter<NoteEntity, BaseViewHolder>(R.layout.item_main_note) {
        override fun convert(helper: BaseViewHolder, item: NoteEntity?) {
            helper.setText(R.id.item_main_note_title_view, item?.title)
                .setText(R.id.item_main_note_content_view, item?.content)
                .setText(R.id.item_main_time_content_view, TimeUtils.date2String(item?.createdAt?.let {
                    Date(
                        it
                    )
                },"yyyy/MM/dd HH:mm"))
                .addOnClickListener(R.id.item_main_note)

        }

    }
}

2、数据添加和更新页面

java 复制代码
class NoteActivity : ScopedAppActivity(){
    private var entity : NoteEntity ?= null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        setContentView(R.layout.activity_note)

        entity = this.intent.extras?.getSerializable("entity") as NoteEntity?
        initView()
    }

    private fun initView() {
        if (entity != null) {
            note_title_view.text = "编辑"
            note_title_edit_view?.setText(entity?.title)
            note_content_edit_view.setText(entity?.content)
        }

        note_done_view.setOnClickListener {
            if (entity == null) {
                entity = NoteEntity()
                entity?.title = note_title_edit_view.text.toString()
                entity?.content = note_content_edit_view.text.toString()
                entity?.createdAt = System.currentTimeMillis()
                entity?.updatedAt = System.currentTimeMillis()
                ObjectBox.addData(entity!!)
            }else{
                entity?.title = note_title_edit_view.text.toString()
                entity?.content = note_content_edit_view.text.toString()
                entity?.updatedAt = System.currentTimeMillis()
                ObjectBox.updateData(entity!!)
            }
            finish()
        }
        note_back_view.setOnClickListener {
            finish()
        }
    }
}

3、部分界面展示

相关推荐
阿巴斯甜8 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker8 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq95279 小时前
Andorid Google 登录接入文档
android
黄林晴10 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_1 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android