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

Android SQLite 数据库

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

陈明宪妻子周茜,潮汐王子成就怎么做,陈德荣

sqlite数据库简介

  sqlite 是一个轻量级数据库,它是d. richard hipp建立的公有领域项目,在2000年发布了第一个版本。它的设计目标是嵌入式的,而且占用资源非常低,在内存中只需要占用几百kb的存储空间,这也是android移动设备采用sqlite数据库的重要原因之一。

  sqlite 是遵守acid的关系型数据库管理系统。这里的acid是指数据库事务正确执行的4个基本要素,即原子性(atomicity)、致性 ( consistency)、 隔离性( lolation). 持久性( durabilily )。它能够支持windows/linux/unix等主流的操作系统,能够跟很多程序语言,例如tcl、c#、php、 java等相结合。比起mysql、postgresql 这两款开源数据库管理系统来讲,sqlite的处理速度更快。

  sqlite 没有服务器进程,它通过文件保存数据,该文件是跨平台的,可以放在其他平台中使用。并且在保存数据时,支持null(零) 、integer (整数)、real (浮点数字) 、text (字符串文本)和blob(二进制对象)5种数据类型。但实际上sqlite也接收varchar(n)、 char(n)、decimal(p,s)等数据类型,只不过在运算或保存时会转换成对应的5种数据类型。因此,可以将各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型。

数据库的创建 

  在android系统中,创建sqlite数据库是非常简单的。android系统推荐使用 sqliteopenhelper 的子类创建数据库,因此需要创建一个继承自sqliteopenhelper,并重写该类中的oncreate()方法和onupgrade()方法即可。

  为什么要使用sqliteopenhelper的子类呢,因为sqliteopenhelper为抽象类(abstract),必须使用其子类进行继承,同时还需要重写父类的抽象方法,oncreate()方法和onupgrade()方法都是其父类中的抽象方法。

 

 1 public class myhelper extends sqliteopenhelper {
 2     @override
 3     private static string database_name = "alan.db";
 4     private static int database_version = 2;
 5     public myhelper(context context){
 6         super(context,database_name,null,database_version);          //调用父类的构造方法
 7     }
 8 
 9     //数据库第一次被创建时调用该方法
10     public void oncreate(sqlitedatabase db){
11         //初始化数据库的表结构,执行一条建表的sql语句
12         db.execsql("create table if not exists person(_id integer primary key autoincrement, name varchar(20), price integer);
13 
14     }
15     //当数据库版本增加时调用
16     public void onupgrade(sqlitedatabase db,int oldversion,int newversion){
17     
18     }
19 }  

 

1 //sqliteopenhelper类的构造函数有四个参数
2 //context代表上下文,name是数据库名字,factory是游标工厂,一般情况下为null值,version是数据库版本,软件在今后的升级中会用到。
3 public sqliteopenhelper(context context, string name, cursorfactory factory, int version) {
4   this(context, name, factory, version, null);
5 }

 

数据库的使用

  前面介绍了sqlite 数据库及如何创建数据库,接下来将针对sqlite数据库的增、删、改、查操作进行详细讲解。

 

一、sqlite 的基本操作方法 一

 

1. 增加一条数据

  下面以 alan.db 数据库中的person表为例,介绍如何使用 sqlitedatabase对象的insert()方法向表中插入一条数据,示例代码如下。

 

1 public void insert(string name, string price){
2     sqlitedatabase db = myhelper.getwritabledatabase(); //获取可读写sqlitedatabase 对象
3     contentvalues values = new contentvalues();   //创建 contentvalues 对象 
4     values.put("name",name);          //将数据添加到contentvalues对象
5     values.put("price",price);
6     long id = db.insert("person",null,values); //插入一条数据到person表 
7     db.close();   //关闭数据库       
8 }

 

  在上述代码中,通过getwritabledatabase()方 法得到sqlitedatabase对象,然后获得contentvalues对象并将数据添加到contentvalues对象中,最后调用inser()方法将数据插入到person表中。


  insert()方法接收3个参数,第一个参数是数据表的名称,第二个参数表示如果发现将要插入的行为空行时,会将这个列名的值设为null,第三个参数为contentvalues对象。contentvalues类类似于map类,通过键值对的形式存入数据,这里的key表示插入数据的列名,value 表示要插入的数据。


  需要注意的是,使用完sqlitedatabase对象后定要调用close()方法关闭,否则数据库连接会一直存在,不断消耗内存,当系统内存不足时将获取不到sqlitedatabase对象,并且会报出数据库未关闭异常。

 

2. 修改一条数据

  下面介绍如何使用sqlitedatabase的update()方法修改person表中的数据,示例代码如下。

 

1 public int update(string name, string price) {
2     sqlitedatabase db = myhelper.getwritabledatabasel;
3     contentvalues values = new contentvalues();
4     values.put ("price", price);
5     int number = db.update("person",values,"name =?",new string[]{name});
6     db.close();
7     return number;
8 }

  

  在上述代码中,通过sqlitedatebase对象db调用update()方法用来修改数据库中的数据,update()方法接收4个参数,第一个参数表示表名,第二个参数接收一个contentvalues对象,第三个参数可选择where语句,第四个参数表示whereclause语句中的占位参数列表,这些字符串会替换掉where条件中的 " ? "。

 

3. 删除一条数据

  下面介绍如何使用sqlitedatabase的delete()方法修改person表中的数据,示例代码如下。

 

1  public int delete(long id) {
2      sqlitedatabase db = myhelper.getwritabledatabasel;
3      int number = db.delete("person",_id =?,"name =?",new string[]{id});
4      db.close();
5      return number;
6  }

 

  从上述代码中可以看出,删除数据不同于增加和修改数据,因为删除数据不需要contentvalues来添加数据。

 

4. 查询一条数据

  在进行数据查询时使用的是sqlitedatabase的query0方法,该方法返回的是一个行数集合cursor。 cursor 是一个游标接口,提供了遍历查询结果的方法,如移动指针方法move(),获得列值方法getstring()等,通过这些方法可以获取集合中的属性值以及序号等。

  需要注意的是,在使用完cursor对象后,一定要及时关闭,否则会造成内存泄露。下面介绍如何使用sqlitedatabase的query()方法查询数据,示例代码如下。

 

public boolean find(long id) {
    sqlitedatabase db = helper .getreadabledatabase ();
    cursor cursor = db.query("person", null,“_id =?", new string[]{id}),null, null, null) ;
    boolean result = cursor.movetonext () ;
    cursor.close();    // 关闭游标
    db.close() ;
    return result;
}

 

 1 //cursor 中的的重要方法:
 2 
 3 c.move(int offset); //以当前位置为参考,移动到指定行  
 4 c.movetofirst();    //移动到第一行  
 5 c.movetolast();     //移动到最后一行  
 6 c.movetoposition(int position); //移动到指定行  
 7 c.movetoprevious(); //移动到前一行  
 8 c.movetonext();     //移动到下一行  
 9 c.isfirst();        //是否指向第一条  
10 c.islast();     //是否指向最后一条  
11 c.isbeforefirst();  //是否指向第一条之前  
12 c.isafterlast();    //是否指向最后一条之后  
13 c.isnull(int columnindex);  //指定列是否为空(列基数为0)  
14 c.isclosed();       //游标是否已关闭  
15 c.getcount();       //总数据项数  
16 c.getposition();    //返回当前游标所指向的行数  
17 c.getcolumnindex(string columnname);//返回某列名对应的列索引值,如果不存在返回-1  
18 c.getstring(int columnindex);   //返回当前行指定列的值  
19 c·getcolumnindexorthrow(string columnname)   //从零开始返回指定列名称,如果不存在将抛出illegalargumentexception 异常。
20 c.close()  //关闭游标,释放资源

 

  在上述代码中,介绍了使用query()方法查询person表中的数据,query()方法接收7个参数,第一个参数表示表名称,第二个参数表示查询的列名,第三个参数接收查询条件子句,第四个参数接收查询子句对应的条件值,第五个参数表示分组方式,第六个参数接收having条件,即定义组的过滤器,第七个参数表示排序方式。

 

二、sqlite 的基本操作方法 二

 

  这种操作方法类似于执行sql语句。

 

1. 增加一条数据

 

1 db.execsql("insert into perosn (name, price) values(?,?)",new string[]{name,price})

 

2. 修改一条数据

 

1 db.execsql("update person set price =? where name =?", new string[]{price,name});

 

3. 删除一条数据

 

db.execsql("delete from person where _id = ?",new string[]{id});

 

4. 查询一条数据

 

cursor cursor = db.rawquery("select _id,name,price from person where id =?",new string[]{id});

 

  从上述代码可以看出,查询操作与增、删、改操作有所不同,前面三个操作都是通过execsql()方法执行sql语句,而查询操作使用的是rawquery()方法。这是因为查询数据库会返回一个结果集cursor,而execsql()方法则没有返回值。

 

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

相关文章:

验证码:
移动技术网