Android开发过程中可以用SQLite储存结构化数据,如联系人信息之类的。

由于SQLite的操作API是相当底层的,因此开发者需要花费很多时间去手动处理SQL查询语句,一旦数据结构改变就得相应的更新SQL语句,这个过程非常耗时,也容易出现错误。
同时,开发者不得不写很多样板代码来转换SQL语句与数据对象。

现在Google比较推荐的做法就是用Room作为一个访问你数据中信息的抽象层,当然也可以使用一些ORM框架来帮组你处理数据库。

用数据库存储的步骤一般如下:

定义一个Schema和Contract

Schema是一个数据库如何组织的一个正式声明,在你创建数据库的SQL语句中可以反映出来。

一个Contract类是一个定义了URIs,tables和columns等常量的容器。

Contract类允许在同一个包中的所有其他类中使用相同的常量,也就是说你在任何一个位置修改column(列名),它都会在整个代码中传播。

在组织Contract类的时候,可以将那些对整个数据库可见的定义放在类的root 层,然后为每一个table创建一个内部类,每一个内部类列举了table中相应的列名column。

object UserInfoContract {//实现BaseColumns接口可以继承一个_ID的主键,有利于Android Framework进行处理object UserInfoEntity : BaseColumns {const val TABLE_NAME = "user_info"const val TABLE_NAME_USERNAME = "username"const val TABLE_NAME_PASSWORD = "password"const val TABLE_NAME_LOGIN_TIME_LATEST = "login_time_latest"}}

写创建数据库和删除数据库的SQL语句

const val SQL_CREATE_TABLE_USERINFO ="""CREATE TABLE ${UserInfoEntity.TABLE_NAME} (${BaseColumns._ID} INTEGER PRIMARY KEY,${UserInfoEntity.TABLE_NAME_USERNAME} TEXT,${UserInfoEntity.TABLE_NAME_PASSWORD} TEXT,${UserInfoEntity.TABLE_NAME_LOGIN_TIME_LATEST} TEXT)"""const val SQL_DELETE_TABLE_USERINFO ="""DROP TABLE IF EXISTS ${UserInfoEntity.TABLE_NAME}"""

继承SQLiteOpenHelper,自定义数据库创建,更新逻辑

这里会用到上一个步骤写好的SQL语句来创建,删除数据库

class UserInfoDbHelper(context: Context) : SQLiteOpenHelper(context, DB_NAME,null, DB_VERSION){companion object {val DB_NAME = "user-info"val DB_VERSION = 1}override fun onCreate(db: SQLiteDatabase) {db.execSQL(UserInfoContract.SQL_CREATE_TABLE_USERINFO)}override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {db.execSQL(UserInfoContract.SQL_DELETE_TABLE_USERINFO)onCreate(db)}}

根据实际业务进行增删查检的操作

这里就一个登陆,注册的场景来写一下数据库的操作,主要就是注册和登陆的时候查询是否存在相关账户,如果注册的时候不存在则插入数据库,如果登陆的时候不存在则提示注册,如果登陆的时候查询到用户名与密码不能匹配上,则提示错误。

class LoginDbActivity : AppCompatActivity() {private lateinit var dbHelper: UserInfoDbHelperprivate val projection = arrayOf(BaseColumns._ID,UserInfoContract.UserInfoEntity.TABLE_NAME_USERNAME,UserInfoContract.UserInfoEntity.TABLE_NAME_PASSWORD,UserInfoContract.UserInfoEntity.TABLE_NAME_LOGIN_TIME_LATEST)private val sortOder = "${UserInfoContract.UserInfoEntity.TABLE_NAME_USERNAME} DESC"override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_login_db)title = "SQLite Demo"dbHelper = UserInfoDbHelper(this)handleClick()}private fun handleLogic(present: ((cursor: Cursor) -> Unit), absent: (() -> Unit)) {if (TextUtils.isEmpty(et_username.text) || TextUtils.isEmpty(et_password.text)) {toast("用户名或密码不能为空").show()return}val db = dbHelper.writableDatabaseval selection = "${UserInfoContract.UserInfoEntity.TABLE_NAME_USERNAME} = ?"val selectionArgs = arrayOf(et_username.text.toString())doAsync {val cursor = db.query(UserInfoContract.UserInfoEntity.TABLE_NAME,projection,selection,selectionArgs,null,null,sortOder)if (cursor == null || cursor.count == 0) {absent()} else {present(cursor)}}}private fun handleClick() {btn_login_db.onClick {handleLogic(present = {with(it) {while (moveToNext()) {val pwd = getString(getColumnIndexOrThrow(UserInfoContract.UserInfoEntity.TABLE_NAME_PASSWORD))runOnUiThread {if (et_password.text.toString() == pwd) {toast("登录成功").show()finish()} else {toast("密码错误").show()}}}}},absent = {runOnUiThread {toast("您的账号还没有注册,请先进行注册").show()}})}btn_register_db.onClick {handleLogic(present = {runOnUiThread {toast("您的账户已经存在,请直接登录").show()}},absent = {insertDb(dbHelper.readableDatabase)})}}private fun insertDb(db: SQLiteDatabase) {val values = ContentValues().apply {put(UserInfoContract.UserInfoEntity.TABLE_NAME_USERNAME, et_username.text.toString())put(UserInfoContract.UserInfoEntity.TABLE_NAME_PASSWORD, et_password.text.toString())put(UserInfoContract.UserInfoEntity.TABLE_NAME_LOGIN_TIME_LATEST, System.currentTimeMillis().toString())}db.insert(UserInfoContract.UserInfoEntity.TABLE_NAME,null,values)runOnUiThread {toast("注册成功").show()}}
}

从上面的操作可以知道,其实直接使用SQLite API操作数据库还是比较麻烦的,特别是当需要要更改数据库的Schema的时候,因此如果项目中右大量操作数据库的需求,建议使用稳定的框架。

源码及UI效果

源码

https://github.com/jiangkang/KTools

Android SQLite 简单的使用步骤相关推荐

  1. Android SQLite简单操作示例

    Android SQLite数据库简单示例 解决 SqLiteActivity.java: package com.cuit.edu.cn;import com.cuit.edu.cn.db.Date ...

  2. 自动排课系统的设计与实现 开题报告 java_高校自动排课APP的设计与实现毕业论文+开题报告+app源码(Hbuilder+Android+sqlite+H5)+操作步骤...

    摘  要 传统的人工排课使用手工操作存在许多弊端,如重复劳动严重.效率低下.且不能达到资源的最优化配置等,将产生大量的文件和数据,这对于查找.更新和维护都带来了不少的困难.因此设计一个高校自动排课AP ...

  3. Android SQLite简单使用

    DataBaseHelper实现: /*** DataBaseHelper* Create by dyj on 2022226 21:44 pm*/ public class DataBaseHelp ...

  4. Android Sqlite 简单SQL语句

    --- 创建表 create table student(_id integer primary key autoincrement, name text);--- 查询全部 select _id,n ...

  5. android用于查询数据的方法,android: SQLite查询数据

    掌握了查询数据的方法之后,你也就将数据库的 CRUD 操 作全部学完了.不过千万不要因此而放松,因为查询数据也是在 CRUD 中最复杂的一种 操作. 我们都知道 SQL 的全称是 Structured ...

  6. Android SQLite数据库的详细使用

    SQLite 简介 SQLite 是一款内置到移动设备上的轻量型的数据库,是遵守ACID(原子性.一致性.隔离性.持久性)的关联式数据库管理系统,多用于嵌入式系统中 SQLite 数据库是无类型的,可 ...

  7. android SQLite数据库的使用

    今天,简单讲讲android如何使用SQLite数据库.  最近,自己在做一个功能时又用到了SQLite数据库,发现自己还是掌握的不很全面.其实之前的app里面也一直用到了数据库,但是自己没有花时 ...

  8. [Android]SQLite的使用

    Android 数据存储提供了四种存储方式: Shared Preferences 使用键值对(Map(key, value))来存储数据 Internal Storage 内部存储,存储在设备内存的 ...

  9. android sqlite alert table,android sqlite数据库操作

    sqlite有一点不同于其他常见数据库,就是sqlite数据库是存成文件的,可以直接把该文件从手机里导出来,以文件的形式存在,然后放到电脑上查看. Android操作数据库有如下步骤: 1.继承SQL ...

最新文章

  1. 【RecyclerView】 十五、使用 ItemTouchHelper 实现 RecyclerView 拖动排序 ( ItemTouchHelper 简介 )
  2. 如果你也想做实时数仓…
  3. Mysql价格降低20%应该怎么写_mysql优化20条原则
  4. [Diary]6.10
  5. 华东理工计算机与金融专业,2019年华东理工大学各专业录取分数线
  6. c语言 字母赋值给变量,C++变量(变量定义和赋值)详解
  7. iview表格嵌套Tooltip
  8. PC服务器实现海量数据存取的方法
  9. Mac电脑上java如何手动释放内存?
  10. 《Android框架揭秘》——2.1节主机环境构成
  11. C语言复习 -- 知识点总结(全)
  12. 极智开发 | UmiJS 快速上手
  13. No handler found for OPTIONS /lca/lcaplan/lcaplanprocess/list
  14. linux中apache无法启动,Apache无法启动
  15. 一年后再读《rework》
  16. Atcoder题解与视频集
  17. 硬件设计——关于电路设计的一些知识
  18. 微型计算机3月2017,2017年3月计算机一级《MS Office》巩固试题及答案
  19. requirejs 简介
  20. c语言60题,C语言复习60题

热门文章

  1. 五子棋项目结束总结_五子棋和画板项目总结
  2. 获取文件名下载并兼容IE(文件流)
  3. PyQt4的学习历程(3)
  4. linux基于此语言的密码,Impost3r:一款针对Linux的密码提取工具
  5. 没有网能使用mysql吗_就用本地数据库;即使在没有联网的电脑上也可以放心使用...
  6. R 回归分析 逐步回归
  7. 数据平台的基本功能是什么_如何搭建数据分析平台
  8. python表单验证wtf_关于python 3.x:无法验证Flask WTF-Form
  9. Axure教程(中级):分类导航菜单高亮条的实现
  10. 如何制作透明的树Shader和一个玻璃Shader