android开发分享12.Android-SQLiteOpenHelper使用

1.SQLite介绍 SQLite,是一款轻型的数据库,它的优缺点有如下: 轻量级,适合嵌入式设备,并且本身不依赖第三方的软件,使用它也不需要“安装”。 并发(包括多进程和多线程)读写方面的性能不太理想。可能会被写操作独占,从而导致其它读写操作阻塞或出错 2.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()时会调用该方法,如下图所示:

12.Android-SQLiteOpenHelper使用

 可以看到只有调用getwritabledatabase()或者getreadabledatabase()时,才会真正创建数据库。

  • getreadabledatabase() : 获取一个只读数据库(不能写入)
  • getwritabledatabase ()  :  获取一个可写的数据库,不再操作的时候,一定要close()关闭数据库,如果磁盘已满,获取将会报错.

 

比如创建一个student学生表,标题分别为id、name、score、class,填入下面代码即可:

12.Android-SQLiteOpenHelper使用

 

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.安卓示例-查询添加删除示例

界面如下:

 12.Android-SQLiteOpenHelper使用

操作示例如下:

 12.Android-SQLiteOpenHelper使用

如下图所示,可以看到我们刚刚操作的数据库:

 12.Android-SQLiteOpenHelper使用

打开后,如下图所示,就可以看到我们刚刚写入的数据:

 12.Android-SQLiteOpenHelper使用

 

8.具体代码实现

8.1 activity_main.xml如下所示:

<relativelayout xmlns:android="https://schemas.android.com/apk/res/android"     xmlns:tools="https://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("rn 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;     }      }

 

 

 

 

 

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/addevelopment/899927.html

(0)
上一篇 2021年10月23日
下一篇 2021年10月23日

精彩推荐