12.Android-SQLiteOpenHelper使用
1.sqlite介绍
sqlite,是一款轻型的数据库,它的优缺点有如下:
- 轻量级,适合嵌入式设备,并且本身不依赖第三方的软件,使用它也不需要“安装”。
- 并发(包括多进程和多线程)读写方面的性能不太理想。可能会被写操作独占,从而导致其它读写操作阻塞或出错
2.sqliteopenhelper介绍
为了在本地创建sqlite数据库,我们需要创建一个sqliteopenhelper的子类,这里取名的为myopenhelper类,然后还要写构造方法来初始化父类、以及abstract修饰的抽象方法:oncreate(sqlitedatabase)、onupgrade(sqlitedatabase,int,int).
2.1 为什么要创建sqliteopenhelper的子类(myopenhelper类)?
因为sqliteopenhelper不知道我们要创建的数据库是什么名字,以及表的内容,所以我们要创建myopenhelper类.
3.sqliteopenhelper构造方法
构造方法用来创建数据库文件的,构造方法如下:
public sqliteopenhelper(context context, string name, cursorfactory factory, int version); //第一个参数:上下文 //第二个参数:数据库文件的名字,如果传入null 则表示创建临时数据库,在应用退出之后,数据就会丢失 //第三个参数:游标工厂 如果使用系统默认的游标工厂就传入null,一般都填null //第四个参数:数据库的版本号 用版本号来控制数据库的升级和降级 版本号从1开始
比如创建一个demo.db,我们只需要在myopenhelper类构造方法里填入下面代码即可:
super(context, "demo.db", null, 1);
4.public abstract void oncreate (sqlitedatabase db)
- 参数db : 数据库对象,这里通过db.execsql(string)来创建表.
oncreate用来创建数据库表结构的,该函数在第一次创建数据库时调用,也就是在调用sqliteopenhelper类的getwritabledatabase()或者getreadabledatabase()时会调用该方法,如下图所示:
可以看到只有调用getwritabledatabase()或者getreadabledatabase()时,才会真正创建数据库。
- getreadabledatabase() : 获取一个只读数据库(不能写入)
- getwritabledatabase () : 获取一个可写的数据库,不再操作的时候,一定要close()关闭数据库,如果磁盘已满,获取将会报错.
比如创建一个student学生表,标题分别为id、name、score、class,填入下面代码即可:
5.public abstract void onupgrade (sqlitedatabase db, int oldversion, int newversion)
- db : 数据库对象,通过db.execsql(string)来执行sql语句
- oldversion : 显示之前旧的数据库版本。
- newversion : 显示升级之后的新数据库版本。
当数据库需要升级时调用。使用此方法删除表、添加表或执行升级到新模式版本所需的任何其他操作。
如果添加新列,可以使用alter table将它们插入活动表。如果重命名或删除列,可以使用alter table重命名旧表,然后创建新表,然后用旧表的内容填充新表。
6.数据库增删改查
实现了sqliteopenhelper的子类(myopenhelper类)后,就有了数据库了,接下来我们便可以对sqlitedatabase类进行数据库增删改查
6.1 通过sqlitedatabase getwritabledatabase()来获取sqlitedatabase类.
sqlitedatabase类中常用方法如下所示:
public cursor rawquery (string sql, string[] selectionargs); // rawquery:查询数据库内容,并将查询到的结果集保存在cursor游标类中,并返回. // sql:填入select查询语句 // selectionargs:如果sql参数填入的内容是正常语句,则这里填null,如果是where子句中包含?,则将会被selectionargs中的值替换. void execsql(string sql); //用来执行insert、update 或 delete 的sql语句
cursor类游标默认是指向所有结果之前的一行,然后通过movetonext()方法就能获取每一行结果的内容
示例如下-读出student表里的内容:
sqlitedatabase database = new myopenhelper(this).getwritabledatabase(); //获取数据库 cursor cursor = database.rawquery("select * from student", null); //查询student表内容 while (cursor.movetonext()) { //可以通过 getxxx方法 获取每一行数据 string name = cursor.getstring(cursor.getcolumnindex("name")); //获取当前游标所在行下的name列内容 string score = cursor.getstring(cursor.getcolumnindex("score"));//获取当前游标所在行下的score列内容 system.out.println("name=" + name + " score =" + score); } cursor.close(); database.close();
7.安卓示例-查询添加删除示例
界面如下:
操作示例如下:
如下图所示,可以看到我们刚刚操作的数据库:
打开后,如下图所示,就可以看到我们刚刚写入的数据:
8.具体代码实现
8.1 activity_main.xml如下所示:
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingbottom="@dimen/activity_vertical_margin" android:paddingleft="@dimen/activity_horizontal_margin" android:paddingright="@dimen/activity_horizontal_margin" android:paddingtop="@dimen/activity_vertical_margin" tools:context=".mainactivity" > <edittext android:id="@+id/et_query" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="这里显示要查询的内容" android:textsize="12sp" android:minlines="10" /> <button android:id="@+id/btn_query" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparentright="true" android:layout_below="@id/et_query" android:text="查询内容" /> <textview android:id="@+id/textview1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparentleft="true" android:layout_below="@id/btn_query" android:paddingtop="50dp" android:text="名字:" /> <edittext android:id="@+id/et_nameadd" android:layout_width="50dp" android:layout_height="wrap_content" android:layout_alignbaseline="@id/textview1" android:layout_torightof="@id/textview1" android:textsize="11sp" /> <textview android:id="@+id/textview2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_torightof="@id/et_nameadd" android:layout_alignbaseline="@id/textview1" android:text="成绩:" /> <edittext android:id="@+id/et_scoreadd" android:layout_width="50dp" android:layout_height="wrap_content" android:layout_alignbaseline="@id/textview1" android:layout_torightof="@id/textview2" android:textsize="11sp" /> <textview android:id="@+id/textview3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_torightof="@id/et_scoreadd" android:layout_alignbaseline="@id/textview1" android:text="班级:" /> <edittext android:id="@+id/et_classadd" android:layout_width="50dp" android:layout_height="wrap_content" android:layout_alignbaseline="@id/textview1" android:layout_torightof="@id/textview3" android:textsize="11sp" /> <button android:id="@+id/btn_add" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignbaseline="@id/textview1" android:layout_torightof="@id/et_classadd" android:text="添加" android:textsize="11sp" /> <textview android:id="@+id/textview4" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignparentleft="true" android:layout_alignparentbottom="true" android:paddingbottom="20dp" android:text="要删除的id:" /> <edittext android:id="@+id/et_deleteid" android:layout_width="140dp" android:layout_height="wrap_content" android:layout_alignbaseline="@+id/textview4" android:layout_torightof="@+id/textview4" android:textsize="11sp" /> <button android:id="@+id/btn_deleteid" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignbaseline="@+id/et_deleteid" android:layout_alignparentright="true" android:textsize="13sp" android:text="删除"/> </relativelayout>
8.2 myopenhelper.java如下所示:
public class myopenhelper extends sqliteopenhelper { public myopenhelper(context context) { //这里创建一个数据库,名字为demo.db super(context, "demo.db", null, 1); } @override public void oncreate(sqlitedatabase db) { //oncreate用来创建数据库表结构的,这里创建一个student学生表,标题分别为id、name、score、class db.execsql("create table student (" +"id integer primary key autoincrement, " +"name varchar(40) not null, " +"score integer not null, " +"class varchar(40) not null)"); system.out.println("oncreate 创建表"); } @override public void onupgrade(sqlitedatabase db, int oldversion, int newversion) { //实现版本升级的函数 system.out.println("onupgrade oldversion"+oldversion+"newversion"+newversion); switch (oldversion) { case 1: //如果之前版本号为1.(标题只有id、name、score、class),那么将添加科目和考号标题 db.execsql("alter table info add age 科目"); db.execsql("alter table info add age 考号"); break; } } }
8.3 mainactivity.java如下所示:
public class mainactivity extends activity { private myopenhelper openhelper; private edittext et_nameadd; private edittext et_scoreadd; private edittext et_classadd; private edittext et_query; private edittext et_deleteid; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); openhelper = new myopenhelper(this); et_nameadd = (edittext)findviewbyid(r.id.et_nameadd); et_scoreadd = (edittext)findviewbyid(r.id.et_scoreadd); et_classadd = (edittext)findviewbyid(r.id.et_classadd); et_query = (edittext)findviewbyid(r.id.et_query); et_deleteid = (edittext)findviewbyid(r.id.et_deleteid); //实现查询数据库功能 button btn_query = (button)findviewbyid(r.id.btn_query); btn_query.setonclicklistener(new onclicklistener() { @override public void onclick(view v) { sqlitedatabase readabledatabase = openhelper.getreadabledatabase(); cursor rawquery = readabledatabase.rawquery("select * from student", null); stringbuilder text = new stringbuilder(); text.append("query length:"+string.valueof(rawquery.getcount())); while(rawquery.movetonext()){ string id = rawquery.getstring(rawquery.getcolumnindex("id"));//获取当前游标所在行下的id列内容 string name = rawquery.getstring(rawquery.getcolumnindex("name")); //获取当前游标所在行下的name列内容 string score = rawquery.getstring(rawquery.getcolumnindex("score"));//获取当前游标所在行下的score列内容 string classs = rawquery.getstring(rawquery.getcolumnindex("class"));//获取当前游标所在行下的class列内容 text.append("\r\n id:"+id+" 名字:"+name+" 成绩:"+score+" 班级:"+classs); } rawquery.close(); readabledatabase.close(); et_query.settext(text.tostring()); } }); //实现添加数据项功能 button btn_add = (button)findviewbyid(r.id.btn_add); btn_add.setonclicklistener(new onclicklistener() { @override public void onclick(view v) { string name = et_nameadd.gettext().tostring().trim(); string score = et_scoreadd.gettext().tostring().trim(); string classs = et_classadd.gettext().tostring().trim(); if(textutils.isempty(name)||textutils.isempty(score)||textutils.isempty(classs)) { toast.maketext(mainactivity.this, "添加的内容不能为空", toast.length_short).show(); return; } string sql = "insert into student(name, score,class) " +"values ('"+name+"', "+score+", '"+classs+"')"; sqlitedatabase writabledatabase = openhelper.getwritabledatabase(); writabledatabase.execsql(sql); writabledatabase.close(); system.out.println(sql); } }); //实现通过id号来删除某一行数据项功能 button btn_deleteid = (button)findviewbyid(r.id.btn_deleteid); btn_deleteid.setonclicklistener(new onclicklistener() { @override public void onclick(view v) { string id = et_deleteid.gettext().tostring().trim(); if(textutils.isempty(id)){ toast.maketext(mainactivity.this, "删除的内容不能为空", toast.length_short).show(); return; }else if(!textutils.isdigitsonly(id)){ toast.maketext(mainactivity.this, "请填入要删除的数字!", toast.length_short).show(); return; } sqlitedatabase readabledatabase = openhelper.getreadabledatabase(); readabledatabase.execsql("delete from student where id = "+id+""); system.out.println("delete from student where id = "+id+""); toast.maketext(mainactivity.this, "已删除id"+id+"所在的一行!", toast.length_short).show(); } }); } @override public boolean oncreateoptionsmenu(menu menu) { // inflate the menu; this adds items to the action bar if it is present. getmenuinflater().inflate(r.menu.main, menu); return true; } }
上一篇: 淡水鲨鱼价格你感兴趣吗,一起来看看
下一篇: 红糖会长胖吗,适量食用是不会胖的
推荐阅读
-
使用MailKit发送带有内嵌图片的邮件且图片不显示成附件
-
.net core 反射的介绍与使用
-
C#在循环中使用Random时生成的随机数相同的解决办法
-
Android中使用Post请求的方法
-
抖音跟别人合拍怎么拍视频?抖音合拍视频功能使用教程
-
Flash cs4颜料桶工具怎么使用?
-
JavaScript学习和使用之函数声明和函数表达式的区别
-
使用Mysql5.x以上版本出现报错#1929 Incorrect datetime value: '''' for column ''createtime''
-
Android字符串资源文件format方法使用实例
-
详解使用uni-app开发微信小程序之登录模块