当前位置: 移动技术网 > IT编程>移动开发>Android > Android使用SQLite数据库的示例

Android使用SQLite数据库的示例

2019年07月24日  | 移动技术网IT编程  | 我要评论

赤城县天气预报,超级战舰 bd,福元号

一. 简介

sqlite数据库是一个轻量级的dbms(数据库管理系统)。sqlite使用单个文件存储数据,android标准库包含sqlite库以及配套使用的一些java辅助类。主要特点:轻量级,单一文件,跨平台,开源。

二. android中sqlite数据库的使用

1、创建sqlite数据库

sqlitedatabase db=
sqlitedatabase.openorcreatedatabase(
"/data/data/" + getpackagename() + "/test.db",
 null);

执行完这条语句,可以在adb shell下进入/data/data/package-name/下看到刚才创建的数据库文件

这里写图片描述 

在android中使用sqlitedatabase的静态方法
openorcreatedatabase(string path, sqlitedatabase.cursorfactory factory)打开或者创建一个数据库。

它会自动去检测是否存在这个数据库,如果存在则打开,反之不存在就创建一个数据库;创建成功则返回一个sqlitedatabase对象,失败抛出filenotfoundexception异常。

除了以上方法,android还提供了sqliteopenhelper这个类来创建数据库,首先继承sqliteopenhelper,重写oncreate和onupgrade方法及构造方法

public class mysqlitehelper extends sqliteopenhelper{

public mysqlitehelper(context context) {
  super(context, "mysqlite.db", null, 1);
  //传入四个参数
  //第一个参数context 上下文对象
  //第二个参数mysqlite.db 数据库名称(文件名)
  //第三个参数一般为null
  //第四个参数数据库版本号,这里写1
}

@override
public void oncreate(sqlitedatabase db) {
  /* 数据库创建的时候会回调此方法,可以用db对象执行sql语
   * 句,创建所需要的表
   */
}

@override
public void onupgrade(sqlitedatabase db, int oldversion, int newversion) {
//当数据库升级时调用此方法
}
}

接着在需要创建数据库的时候调用

sqliteopenhelper dbhelper = new mysqlitehelper(this);
sqlitedatabase db = dbhelper.getwritabledatabase();

使用sqliteopenhelper创建的数据库,保存在/data/data/package-name/databases/目录下,通过adb shell可以看到创建的数据库文件

这里写图片描述

2、创建数据库中的数据表

数据库创建完成后,要创建保存数据的表,表是存放在数据库中的。示例代码入下

  private void createtable(sqlitedatabase db){
    //sql语句
    string sql = 
    "create table stutable(_id integer primary key autoincrement,name text,age integer)";
    db.execsql(sql);
  }

这里附上sqlite数据类型

null: 这个值可为空值

varchar(n):长度不固定且其最大长度为 n 的字串,n不能超过 4000。

char(n):长度固定为n的字串,n不能超过 254。

integer: 值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8….

real: 所有值都是浮动的数值,被存储为8字节的ieee浮动标记序号.

text: 值为文本字符串,使用数据库编码存储(tutf-8, utf-16be or utf-16-le).

blob: 值是blob数据块,以输入的数据格式进行存储。如何输入就如何存储,不改变格式。

data :包含了 年份、月份、日期

执行完上述语句,可以通过adm将数据库文件导出到电脑上

这里写图片描述 

通过可视化工具打开数据库文件可以看到之前创建的表,以及定义的表字段

 这里写图片描述

除了执行定义创建表的方法外,还可以在继承sqliteopenhelper类中的oncreate方法来初始化表结构,在后面的例子使用继承sqliteopenhelper方式创建表。

3、对表进行操作(数据表的增删改查)

增:在表中增加数据,可以使用sqlitedatabase类中提供的execsql(string sql)执行一条插入数据的sql语句来插入数据,不过,androidsqlitedatabase类提供了更为简单的方法来执行插入数据操作

  //sqlitedatabase类中提供的方法
  public long insert(
     string table,//要操作表名 
     string nullcolumnhack,//空列的默认值 
     contentvalues values
//contentvalues封装了列名称和列值的map
     ); 

  private void inserttotable(sqlitedatabase db){
    contentvalues cv = new contentvalues();
    cv.put("name","wxq");
    cv.put("age",11);
    db.insert("stutable",null,cv); 
  }

执行inserttable方法,再次导出数据库可以看到stutable表中增加了一条数据

这里写图片描述

删:好吧,刚插入一条数据。。。

同样android提供了delete方法

  //sqlitedatabase类中提供的方法
  public int delete(
      string table,//表名称
      string whereclause,//删除条件
      string[] whereargs); //删除条件值数组

  private void deletetotable(sqlitedatabase db){
    //删除条件,这里以name为条件,也可以是age = ?
    string whereclasuse = "name = ?";
    //删除条件参数,
    string[] whereargs = new string[]{"wxq"};
    //执行删除
    db.delete("stutable",whereclasuse,whereargs);
  }

执行上述语句,将会删除stutable表中刚才插入的数据。

改:

  //sqlitedatabase类中提供的方法
  public int update(
  //表名称
  string table,
  //和行列contentvalues键值对应的key-value
  contentvalues values,
  //更新条件
  string whereclause,
  //更新条件数组
  string[] whereargs
  );

  private void updatetotable(sqlitedatabase db){
    //实例化contentvalues
    contentvalues cv= new contentvalues();
    cv.put("age",23);
    //更新条件
    string whereclause = "name = ?";
    //更新条件数组
    string[] whereargs = new string[]{"wxq"};
    db.update("stutable",cv,whereclause,whereargs);
  }

执行完更新语句,导出数据库文件,在可视化工具中查看

这里写图片描述

查:在android中查询数据是通过cursor类来实现的,可以使用sqlitedatabase.query()方法时,这里使用别一个方法rawquery

  public cursor rawquery(
  string sql,//查询的sql语句
  string[] selectionargs//当sql语句中含有?,这里代表值
  );

  public void querytotable(sqlitedatabase db){
    string sql = "select * from stutable";//全查
    cursor c = db.rawquery(sql,null);//这里会返回一个cursor(游标)对象
  }

这里写图片描述

使用sqlite的一个demo(英雄管理系统)

这里写图片描述 

主要操作数据库的代码

public class herosqlitemanager {
  private sqliteopenhelper dbhelper;
  private sqlitedatabase db;
  private static herosqlitemanager instance;

  private static final string table_name = "hero";
  private static final string name_field = "name";
  private static final string icoid_field = "icoid";
  private static final string attack_field = "attack";
  private static final string defense_field = "defense";

  public static herosqlitemanager getinstance() {
    if (instance == null) {
      synchronized (herosqlitemanager.class) {
        if (instance == null) {
          instance = new herosqlitemanager();
        }
      }
    }
    return instance;
  }

  private herosqlitemanager() {
    dbhelper = new herosqlitehelper(heroapplication.getcontext());
    db = dbhelper.getwritabledatabase();
  }

  /**
   * 插入记录
   * @param hero
   */
  public void insertdata(hero hero) {
    contentvalues cv = new contentvalues();
    cv.put(name_field, hero.name);
    cv.put(icoid_field, hero.icoid);
    cv.put(attack_field, hero.attack);
    cv.put(defense_field, hero.defense);
    db.insert(table_name, null, cv);
  }

  /**
   * 删除记录
   * @param
   */
  public void deletedata(int id) {
    string whereclasuse = "_id = ?";
    string[] whereargs = new string[]{string.valueof(id)};
    db.delete(table_name, whereclasuse, whereargs);
  }

  /**
   * 修改记录
   * @param hero
   */
  public void updatedata(hero hero) {
    contentvalues cv = new contentvalues();
    cv.put(name_field, hero.name);
    cv.put(icoid_field, hero.icoid);
    cv.put(attack_field, hero.attack);
    cv.put(defense_field, hero.defense);
    string whereclasuse = "_id = ?";
    string[] whereargs = new string[]{string.valueof(hero.id)};
    db.update(table_name, cv, whereclasuse, whereargs);
  }


  /**
   * 查询所有的英雄
   * @return
   */
  public list<hero> selectdata() {
    list<hero> herolist = new arraylist<>();
    cursor c = db.rawquery("select * from " + table_name, null);
    while (c.movetonext()) {
      hero hero = new hero();
      hero.id = c.getint(c.getcolumnindex("_id"));
      hero.name = c.getstring(c.getcolumnindex(name_field));
      hero.icoid = c.getint(c.getcolumnindex(icoid_field));
      hero.attack = c.getint(c.getcolumnindex(attack_field));
      hero.defense = c.getint(c.getcolumnindex(defense_field));
      herolist.add(hero);
    }
    c.close();
    return herolist;
  }

  /**
   * 按name查询
   * @param name
   * @return
   */
  public hero selectforname(string name) {
    cursor c = db.rawquery("select * from " + table_name + " where name = ?", new string[]{name});
    hero hero = null;
    if (c.movetonext()) {
      hero = new hero();
      hero.id = c.getint(c.getcolumnindex("_id"));
      hero.name = c.getstring(c.getcolumnindex(name_field));
      hero.icoid = c.getint(c.getcolumnindex(icoid_field));
      hero.attack = c.getint(c.getcolumnindex(attack_field));
      hero.defense = c.getint(c.getcolumnindex(defense_field));
    }
    c.close();
    return hero;
  }

  public void destroy() {
//    if (db != null) {
//      db.close();
//    }
//    db = null;
  }
}

  

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

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

相关文章:

验证码:
移动技术网