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

详解Android数据存储—使用SQLite数据库

程序员文章站 2023-12-03 08:28:04
sqlite是android自带的关系型数据库,是一个基于文件的轻量级数据库。android提供了3种操作数据的方式,sharedpreference(共享首选项)、文件存...

sqlite是android自带的关系型数据库,是一个基于文件的轻量级数据库。android提供了3种操作数据的方式,sharedpreference(共享首选项)、文件存储以及sqlite数据库。

sqlite数据库文件被保存在/data/data/package_name/databases目录下。

一、创建和删除表

1.创建表

创建表的sql语句为:

create table userinfo_brief (
id integer primary key autoincrement,
name text,
password text);

对应的java代码为:

  final static int version=1;
  final static string tablename="userinfo_brief";
  final static string id="id";
  final static string name="name";
  final static string password="password";
  string sql="create table "+tablename+"("+"id"+" integer primary key autoincrement," 
    +name+" text,"// attention:注意sql语法,每个变量后需要有空格,否则不认识。
    +password+" text,"
    +age+" text);";
    db.execsql(sql);

2.删除表

sql语句为:

drop table userinfo_brief;

对应的java代码为:

string sql="drop table "+tablename+";";
db.execsql(sql);

二、操作数据库中的记录

1.插入记录

insert用法:

sqlitedatabase.insert(string table,string nullcolumnhack,contentvalues values)
contentvalues values=new contentvalues();//获取contentvalues对象,类似hashmap
      values.put(databasehelper.name, name);//键值对形式保存数据
      values.put(databasehelper.password, pass);
      values.put(databasehelper.age, age);
      db.insert(databasehelper.tablename, null, values);

2.更新记录

update使用方法:

复制代码 代码如下:

sqlitedatabase.update(string table,contentvalues values,string where-clause,string[] whereargs)

eg:更新表中name为bob的密码

contentvalues values=new contentvalues();
values.put(password,"123456");//要更新的数据
db.update(tablename,values,name+"=?",new string[]{"bob"});

3.删除记录

delete使用方法:

sqlitedatabase.delete(string table,string where-clause,string[] whereargs)

eg:删除那么为bob的记录

db.delete(tablename,name+"=?",new string[]{"bob"});

4.查询记录

1.单表查询

使用sqlitedatabase.query(7个参数)。

2.多表查询

如果a表中存了用户名和密码,b表中存了用户名和其他具体信息,使用sqlitequerybuilder多表查询。
sql语句:

复制代码 代码如下:

select a.name,a.password,b.age,b.sex from a,b where a.name=b.name and a.name=“bob”

多表查询步骤:

sqlitequerybuilder builder=new sqlitequerybuilder();//获得对象
builder.settables(tablename_a,tablename_b);//设置需要查询的表,可多个
builder.appendwhere(tablename_a+"."+name+"="tablename_b+"."+name);//设置关联属性,表与属性间.隔开,属性以=连接
cursor=builder.query(7个属性);//7属性同单表查询

实例—通过数据库验证登录

1.数据库设计

使用了数据库帮助类,从写oncreate方法

public class databasehelper extends sqliteopenhelper {
  final static string databasename="my_database.db";
  final static int version=1;
  final static string tablename="userinfo_detail";
  final static string id="id";
  final static string name="name";
  final static string password="password";
  final static string age="age";

  public databasehelper(context context) {
    super(context, databasename, null, version);
    // todo 自动生成的构造函数存根
  }

  @override
  public void oncreate(sqlitedatabase db) {
    // todo 自动生成的方法存根
    string sql="create table "+tablename+"("+"id"+" integer primary key autoincrement,"
    +name+" text,"
    +password+" text,"
    +age+" text);";
    db.execsql(sql);

  }

  @override
  public void onupgrade(sqlitedatabase db, int oldversion, int newversion) {
    // todo 自动生成的方法存根

  }

}

2.登录界面

public class loginactivity extends activity {

  private edittext username; 
  private edittext password; 
  private checkbox autologin; 
  private sharedpreferences sharedpreferences; 
  private string message; 
  sqlitedatabase db;
  @override 
  public void oncreate(bundle savedinstancestate) { 
    super.oncreate(savedinstancestate); 
   // myapplication.getinstance().addactivity(this); 

    sharedpreferences = this.getsharedpreferences("userinfo",context.mode_world_readable); //sharedpreferences实例化,用于记住登录状态,判断是否需要自动登录

    if (sharedpreferences.getboolean("auto_ischeck", false)) { //自动登录

      intent intent = new intent(); 
      intent.setclass(loginactivity.this, mainactivity.class); 
      intent.putextra("name", sharedpreferences.getstring("username", ""));
      startactivity(intent); 

    } else { 
      setcontentview(r.layout.login_main); 
      initview(); 

     username = (edittext) findviewbyid(r.id.accountedittext); 
     password = (edittext) findviewbyid(r.id.pwdedittext); 
     button btn_login=(button) findviewbyid(r.id.login_in);
     button btn_register=(button)findviewbyid(r.id.register);
     btn_register.setonclicklistener(new onclicklistener() {//跳转注册界面

      @override
      public void onclick(view v) {
        // todo 自动生成的方法存根
        intent intent=new intent(loginactivity.this, registeractivity.class);
        startactivity(intent);
      }
    });
     btn_login.setonclicklistener(new onclicklistener() { //判断登录

       @override
       public void onclick(view v) {
         // todo auto-generated method stub
        userlogin();
       }
     });
    } 
  } 

  /** 
   * 初始化视图控件 
   */ 
  public void initview() { 
    log.i(tag, "初始化视图控件"); 

    username = (edittext) findviewbyid(r.id.accountedittext); 
    password = (edittext) findviewbyid(r.id.pwdedittext); 
    autologin = (checkbox) findviewbyid(r.id.checkbox1); 

    // 默认记住用户名 
    username.settext(sharedpreferences.getstring("username", "")); 

  } 

  /** 
   * 点击登录按钮时触发的方法 
   */ 
  public void userlogin() { 
    //通过帮助类获得数据库对象
    databasehelper helper=new databasehelper(getbasecontext());
    db=helper.getreadabledatabase();
    //得到用户输入信息
    string usernamestring = username.gettext().tostring(); 
    string passwordstring = password.gettext().tostring(); 
    //根据用户名查询数据库信息
    cursor cursor=db.query(databasehelper.tablename, new string[]{databasehelper.password},
        databasehelper.name+"=?", new string[]{usernamestring}, null, null, null);
    //若没有查询到相关信息,不再继续操作
    if(cursor.getcount()==0)
    {
      toast.maketext(getbasecontext(), "用户名不存在", toast.length_short).show();
      return;
    }
    //若用户名存在,则继续操作
    cursor.movetofirst(); //指向第一条记录
    string password=cursor.getstring(0);//取得密码
    //判断密码,若一样则进行跳转
    if(password.equals(passwordstring)){
      if(autologin.ischecked()){
        editor editor=sharedpreferences.edit();
        editor.putstring("username", usernamestring);
        editor.putboolean("auto_ischeck", true);
        editor.commit();
      }
      intent intent=new intent(loginactivity.this, mainactivity.class);
      intent.putextra("name",usernamestring);
      startactivity(intent);
    }
    else
    {
//     editor editor = sharedpreferences.edit(); 
//      editor.putstring("username", usernamestring); 
//      editor.commit(); 
      toast.maketext(getbasecontext(), "密码错误", toast.length_short).show();
    }

  }
 }

详解Android数据存储—使用SQLite数据库

3.注册界面

public class registeractivity extends activity {
  string name;
  string pass;
  string age;
  sqlitedatabase db;

  @override
  protected void oncreate(bundle savedinstancestate) {
    // todo 自动生成的方法存根
    super.oncreate(savedinstancestate);
    setcontentview(r.layout.register);
    final edittext et_username=(edittext)findviewbyid(r.id.edittext_1);
    final edittext et_password=(edittext)findviewbyid(r.id.edittext_2);
    final edittext et_age=(edittext)findviewbyid(r.id.edittext_3);
    button btn_confirm=(button)findviewbyid(r.id.register_confirm);
    btn_confirm.setonclicklistener(new onclicklistener() {

      @override
      public void onclick(view v) {
        // todo 自动生成的方法存根
        name=et_username.gettext().tostring();
        pass=et_password.gettext().tostring();
        age=et_age.gettext().tostring();
        //得到数据库对象

        databasehelper helper=new databasehelper(getbasecontext());
        db=helper.getwritabledatabase();
        //判断用户名是否已存在
        cursor cursor=db.query(databasehelper.tablename, new string[]{databasehelper.name},
            databasehelper.name+"=?", new string[]{name}, null, null, null);
        //若查询目标已存在
        if(cursor.getcount()>0){
          toast.maketext(getbasecontext(), "用户名已存在", toast.length_short).show();
          return;
        }

      //若不存在,则插入数据

      contentvalues values=new contentvalues();
      values.put(databasehelper.name, name);
      values.put(databasehelper.password, pass);
      values.put(databasehelper.age, age);
      db.insert(databasehelper.tablename, null, values);
      //进行跳转
      intent intent=new intent(registeractivity.this, mainactivity.class);
      intent.putextra("name", name);
      startactivity(intent);
      }
    });
  }
}

详解Android数据存储—使用SQLite数据库 

详解Android数据存储—使用SQLite数据库

4.登录成功界面

public class mainactivity extends activity {
  string name;
  string pass;
  string age;

   private button logout;
   sqlitedatabase db;
   private sharedpreferences sharedpreferences;  
  protected void oncreate(bundle savedinstancestate) {
    super.oncreate(savedinstancestate);
  //  myapplication.getinstance().addactivity(this); 
    setcontentview(r.layout.main_activity);
    logout=(button) findviewbyid(r.id.logout);
    doquery();//进行查询
    doshow();//进行显示
    logout.setonclicklistener(new onclicklistener() {

      @override
      public void onclick(view v) {
        // todo 自动生成的方法存根
        removesharedpreference();
       intent intent=new intent();
       intent.setclass(mainactivity.this, loginactivity.class);
       startactivity(intent);
      }
    });
  }

  private void doquery() {
    // todo 自动生成的方法存根
    name=getintent().getextras().getstring("name");
    databasehelper helper=new databasehelper(getbasecontext());
    db=helper.getreadabledatabase();
    //准备查询de属性
    string[] columns=new string[]{databasehelper.password,databasehelper.age};
    cursor cursor=db.query(databasehelper.tablename, columns, databasehelper.name+"=?", 
        new string[]{name}, null, null, null);
    cursor.movetofirst();
    while(!cursor.isafterlast()){//判断是否是最后一条记录
      pass=cursor.getstring(0);
       age=cursor.getstring(1);
      cursor.movetonext();
    }
  }
  private void doshow() {
    // todo 自动生成的方法存根
    textview tv_show=(textview)findviewbyid(r.id.show1);
    tv_show.settext("用户信息如下:\n"+"账户:"+name+"\n密码"+pass+"\n年龄"+age);
  }
  public void removesharedpreference() {
    sharedpreferences = getsharedpreferences("userinfo", context.mode_private);
    editor editor = sharedpreferences.edit();
    //editor.remove("username");
    editor.remove("auto_ischeck");
    editor.commit();// 提交修改
    }
}

详解Android数据存储—使用SQLite数据库

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。