Sqlite数据库作为一个轻量级数据库,可以较为方便地实现Android中诸如历史记录的储存等操作。本文首先介绍Sqlite数据库的创建与读写等数据库操作,而后完成使用界面的方式操作Sqlite数据库中的数据。
详细代码:github.com/Baolvlv/LearnAndroid/tree/master/UsingSqlite
一、Sqlite数据库的数据读取与写入
SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的SQL数据库引擎。它是一个零配置的数据库,不需要在系统中配置。SQLite引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite直接访问其存储文件。
1.创建
创建类继承自SQLiteOpenHelper
public classDbextendsSQLiteOpenHelper {
添加构造函数,不需要的参数可以不写
//构造函数,参数:name为数据库名称,Cursor用于逐行读取数据库结果,封装的查询结果,version为版本号
publicDb(Context context) {
super(context,"db", null,1);
}
重写数据库创建与升级方法
//当应用中不存在数据库时创建
@Override
public voidonCreate(SQLiteDatabase db) {
//创建表,包含name,sex两列,文本类型,默认值为空 PRIMARY KEY AUTOINCREMENT主键自增
db.execSQL("CREATE TABLE user("+
"_id INTEGER PRIMARY KEY AUTOINCREMENT,"+
"name TEXT,"+
"sex TEXT)");
}
//数据库升级,sql语句操作数据库,检查操作系统中的同名数据库版本号低则升级
@Override
public voidonUpgrade(SQLiteDatabase db, intoldVersion, intnewVersion) {
}
2.写入数据
//实例化数据库对象
Db db =newDb(this);
//获取可写入数据库用于插入数据
SQLiteDatabase dbWrite = db.getWritableDatabase();
//使用ContentValues封装数据
ContentValues cv =newContentValues();
//输入对应的键值对的值
cv.put("name","bss");
cv.put("sex","男");
//插入数据,参数为表名,当列为空时的填充值,封装数据的ContentValue
dbWrite.insert("user",null,cv);
使用完成后关闭数据库
//使用完之后关闭数据库
dbWrite.close();
3.读取数据
获取可读取数据库
SQLiteDatabasedbRead = db.getReadableDatabase();
使用query()方法查询,返回值为Cursor
Cursor c = dbRead.query("user",null,null,null,null,null,null);
query()的参数为:
参数:表名,查询的列,查询条件,条件参数,分组,分组条件,顺序
查询列的写法:
new String[]{"name"}
为防止sql注入攻击,查询条件与条件参数为:
"name =?",new String[]{"bss"
通过Cursor的moveToNext方法判断结果是否结束,通过getColumnIndex获取查询列的编号
通过getString获取编号下的值
while(c.moveToNext()){
String name = c.getString(c.getColumnIndex("name"));
String sex = c.getString(c.getColumnIndex("sex”));
二、通过界面操作Sqlite数据库
将数据库查询结果呈现到ListView中
主布局中添加listView,声明SimpleCursorAdapter对象用于接收查询结果Cursor
privateSimpleCursorAdapteradapter;
实例化数据库对象,获取可读写数据库对象
db=newDb(this);
dbRead=db.getReadableDatabase();
dbWrite=db.getWritableDatabase();
实例化SimpleCursorAdapter对象,参数为
//参数:context,显示结果的布局资源,Cursor,Cursor的需要输出的数据源,输出的位置,初次查询时cursor可以为空
adapter=newSimpleCursorAdapter(this,R.layout.user_list_cell
,null,newString[]{"name","sex"},new int[]{R.id.tvName,R.id.tvSex});
用于呈现结果的布局需要手动创建,线形布局,分别用大小文本呈现
大小文本的样式分别为:
android:textAppearance="?android:textAppearanceLarge”/>
android:textAppearance="?android:textAppearanceMedium"/>
注意:SimpleCursorAdapter要求数据表中必须有_id这一列,且为自增主键,创建如下:
//创建表,包含name,sex两列,文本类型,默认值为空 PRIMARY KEY AUTOINCREMENT主键自增
db.execSQL("CREATE TABLE user("+
"_id INTEGER PRIMARY KEY AUTOINCREMENT,"+
"name TEXT DEFAULT\"\","+
"sex TEXT DEFAULT\"\")");
实例化ListView并为listview设置adapter
lv= (ListView) findViewById(R.id.list);
//只要adapter发生改变,setAdapter()函数就执行
lv.setAdapter(adapter);
设置刷新列表的函数,通过改变adapter的cursor从而改变adapter达到刷新列表的目的
//更改adapter的Cursor,从而达到更新列表项
private voidrefershListview(){
Cursor c =dbRead.query("user",null,null,null,null,null,null);
adapter.changeCursor(c);
}
执行refershListView后,adapter改变,setAdapter自动执行,列表刷新
在button的onClick函数中,通过ContentValue存入数据,通过dbwriter将数据插入数据库
插入完成后刷新列表
public voidonClick(View v) {
ContentValues cv =newContentValues();
cv.put("name",etName.getText().toString());
cv.put("sex",etSex.getText().toString());
dbWrite.insert("user",null,cv);
refershListview();
}
实现ListView长按删除item
为listView设置onItemLongClickListener,返回值改为true,提示系统此次为长按操作,可以继续执行后续操作
lv.setOnItemLongClickListener(newAdapterView.OnItemLongClickListener() {
@Override
public booleanonItemLongClick(AdapterView parent,View view, final intposition, longid) {
//反馈操作系统此次是否为长按,true为长按,可触发震动等
return true;
通过AlertDialog创建对话框,设置title与message,通过积极按钮(positive Button)设置需要操作的button,铜过消极按钮(negative Button)设置不需要操作的button,positive button需要设置DialogInterface.onClickListener,negative button的事件监听器为null,通过show弹出对话框。
newAlertDialog.Builder(MainActivity.this).setTitle("提醒").setMessage("你确定要删除该项吗?")
.setPositiveButton("确定", newDialogInterface.OnClickListener() {
通过adapter中的cursor移动到相应位置,通过dbWriter删除,删除后刷新列表
//通过adapter获取到Cursor,并移动到长按的位置
Cursor c =adapter.getCursor();
//内部类访问可变变量有问题
c.moveToPosition(position);
//获取数据库中这条数据的_id
intitemId = c.getInt(c.getColumnIndex("_id"));
//删除对应的数据,参数为表名,删除的条件,条件的结果
dbWrite.delete("user","_id=?",newString[]{itemId+""});
refershListview();
注意:数据库创建时的onCreate函数在没有数据库时才会创建,如需重新创建应先手动清除应用数据