当前位置: 萬仟网 > IT编程>移动开发>Android > 12.Android-SQLiteOpenHelper使用

12.Android-SQLiteOpenHelper使用

2020年01月18日 14:59  | 萬仟网IT编程  | 我要评论

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;
    }
    
}

 

 

 

 

 

如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复

相关文章:

◎已有 0 人评论

Copyright © 2020  萬仟网 保留所有权利. 粤ICP备17035492号-1
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com