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表。
我们还可以通过 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.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5)。原因是我创建了两个操作类的实例去操作同一个数据库,并发访问数据库,数据库为了保持数据的安全性将数据进行锁死。所以只需要创建一个操作类实例即可避免这个问题的发生。
本篇文章介绍了在重构项目中关于Android内置数据库SQLite使用遇到的一些问题。在接下来的项目中将会深入相关方面知识。遇到的问题会在这里进行补充。