欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

12.Android-SQLiteOpenHelper使用

程序员文章站 2022-07-02 15:57:48
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="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;
    }
    
}