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、部分界面展示

相关推荐
千里马学框架3 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台3 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone3 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc3 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo3 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077003 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼3 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone3 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen3 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone3 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui