Android中Sqlite数据库读写数据

        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函数在没有数据库时才会创建,如需重新创建应先手动清除应用数据

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,340评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,762评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,329评论 0 329
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,678评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,583评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 47,995评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,493评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,145评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,293评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,250评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,267评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,973评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,556评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,648评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,873评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,257评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,809评论 2 339

推荐阅读更多精彩内容