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

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

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

需要注意的是:

   /**
     * 你只有配置好之后, 点击 Make Model '你的model名字', 才会创建 MyObjectBox对象
     * 对于MyObjectBox的包名, 目前我发现的是找到第一个Entity的包名
     * 如果项目使用了Kotlin, 必须添加插件apply plugin: 'kotlin-kapt'
     * 实体Entity是不能继承的哦.继承的字段不会被解析
     */

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 = boxStore.boxFor(NoteEntity::class.java)
                val list: MutableList = 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? {
        try {
            if (boxStore != null && !boxStore.isClosed) {
                val box: Box = boxStore.boxFor(NoteEntity::class.java)
                return box.all
            }
        } catch (e: java.lang.Exception) {
        }
        return ArrayList()
    }

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

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


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

    
}


2、主页面数据展示代码

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

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(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、数据添加和更新页面

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

Android 备忘录,记事本程序设计_第1张图片Android 备忘录,记事本程序设计_第2张图片

你可能感兴趣的:(1024程序员节,android,记事本,备忘录)