Android开发SQLite基本用法

前言

Android 开发中数据存储本地几乎是避免不了的。在这过程中,打交道比较多的比如数据库,Android中内置了一款轻量级的数据库SQLite,在android.database.sqlite 包下提供了丰富的操作SQLite的API。下面介绍下SQLite的使用方法,以及过程中遇到的问题。

基本用法

  • 数据库创建
class DBOpenHelper(context: Context) : SQLiteOpenHelper(context, DB_NAME, null, DB_VERSION) {

    /静态变量声明处*/
    companion object {
        /*数据库名字*/
        public var DB_NAME = "pl_sqilte.db3"
        /*数据库的版本号*/
        private var DB_VERSION = 1;
        /*表名字*/
        public var TABLE_NAME = "city"
        /*创建表语句*/
        private var CITY_TABLE_CREATE = "create table " + TABLE_NAME + " (_id integer primary key, name String, letter String);"
        /*删除表操作*/
        private var DROP_CITY_TABLE = "DROP TABLE IF EXISTS" + TABLE_NAME

    }

    /**
     *  @funtion:onCreate()创建表
     *  @param:db  执行创建语句
     */
    override fun onCreate(db: SQLiteDatabase?) {
        db!!.execSQL(CITY_TABLE_CREATE)
    }

    /**
     *  @funtion:onUpgrade()更新表
     *  @param:执行更新语句
     */
    override fun onUpgrade(db: SQLiteDatabase?, oldVersion: Int, newVersion: Int) {
        db!!.execSQL(DROP_CITY_TABLE)
    }
}

首先创建一个类继承SQLiteOpenHelper,这个类是个抽象类用来管理数据库的创建以及版本管理。主要是onCreate(创建) onUpgrade(更新)方法。创建此类实例即可创建一个新的数据库pl_sqlite.db3以及一张city表。

Android开发SQLite基本用法_第1张图片

我们还可以通过 adb命令来看新建的数据库是否存在。前提,你的adb已经在环境变量已经做了配置。

> adb shell
> ls                            //会有一个data文件夹
> cd  data                      //进入data文件夹下
> ls                            //查看data目录下文件
> 此时会报错 opendir failed, Permission denied
> run-as com.ypl.meetingshare(你的包名)
> ls                            //查看包下的文件 此时会有一个databases文件夹
> cd databases                  //此时就会看到上图创建好的两个数据库文件
  • 数据库操作类

数据库和表建好以后,接下来就是对表进行数据的增,删,改,查操作。

 /*操作类,静态构造,单例模式*/
class DBOrderDao private constructor() {

    private var dbOpenHelper: DBOpenHelper? = null
    private var result: String = "这是一个空的数据表"
    private var db: SQLiteDatabase? = null

    /*静态变量与方法存放处*/
    companion object {

        private var dbOrderDao: DBOrderDao? = null
        /**
         *  @fuction: 获取操作类实例
         *  @params:null
         */
        fun getDaoInstance(): DBOrderDao {
            if (dbOrderDao == null) {
                dbOrderDao = DBOrderDao()
            }
            return dbOrderDao!!
        }
    }

    /**
     *  @fuction: 向表中插入值
     *  @params:null
     */
    fun insertAllCity() {
        db = dbOpenHelper!!.writableDatabase
        db!!.beginTransaction()
        db!!.execSQL("insert into " + DBOpenHelper.TABLE_NAME + " (_id, name, letter) values (1, '上海', 'S')")
        db!!.execSQL("insert into " + DBOpenHelper.TABLE_NAME + " (_id, name, letter) values (2, '北京', 'B')")
        db!!.execSQL("insert into " + DBOpenHelper.TABLE_NAME + " (_id, name, letter) values (3, '广州', 'G')")
        db!!.execSQL("insert into " + DBOpenHelper.TABLE_NAME + " (_id, name, letter) values (4, '安徽', 'A')")
        db!!.execSQL("insert into " + DBOpenHelper.TABLE_NAME + " (_id, name, letter) values (5, '滁州', 'C')")
        db!!.execSQL("insert into " + DBOpenHelper.TABLE_NAME + " (_id, name, letter) values (6, '明光', 'M')")

        db!!.setTransactionSuccessful()
        db!!.endTransaction()
    }

    /**
     *  @fuction: 查询数据列表
     *  @params:null
     */
    fun queryAllDatas(): String {
        db = dbOpenHelper!!.writableDatabase
        val cursor = db!!.query(DBOpenHelper.TABLE_NAME, null, null, null, null, null, "_id asc") as Cursor
        val nameIndex = cursor.getColumnIndex("name")
        val id= cursor.getColumnIndex("_id")
        cursor.moveToFirst()
        while (!cursor.isAfterLast) {
            result = result + cursor.getString(nameIndex) + "\t\t"
            result = result + cursor.getInt(id) + " \n"
            cursor.moveToNext()
        }
        /*游标记得关闭,防止内存泄漏*/
        cursor.close()
        return result
    }

    /*类似java静态代码块*/
    init {
        dbOpenHelper = DBOpenHelper(PenglaiApplication.getSingleInstance())
    }

}

数据库操作类,单例实现,在使用时直接调用方法即可

DBOrderDao.getDaoInstance().insertAllCity()

(findViewById(R.id.textView) as TextView).text = DBOrderDao.getDaoInstance().queryAllDatas()

Android开发SQLite基本用法_第2张图片
在调用操作类的过程中,遇到了一个问题,android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5)。原因是我创建了两个操作类的实例去操作同一个数据库,并发访问数据库,数据库为了保持数据的安全性将数据进行锁死。所以只需要创建一个操作类实例即可避免这个问题的发生。

Android开发SQLite基本用法_第3张图片

结尾

本篇文章介绍了在重构项目中关于Android内置数据库SQLite使用遇到的一些问题。在接下来的项目中将会深入相关方面知识。遇到的问题会在这里进行补充。

你可能感兴趣的:(Android)