服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - Android数据存储之SQLite使用

Android数据存储之SQLite使用

2021-05-06 15:19Android开发网 Android

SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎。它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行

sqlite是一款开源的、嵌入式关系型数据库,第一个版本alpha发布于2000年。sqlite在便携性、易用性、紧凑性、高效性和可靠性方面有着突出的表现。

在android中创建的sqlite数据库存储在:/data/data/<包名>/databases/目录下。

主要特点:

-轻量级

-独立性,没有不依赖,无需安装

-跨平台,支持众多操作系统

-支持高达2tb大小的数据库

-每个数据库以单个文件的形式存在

-以b-tree的数据结构形式存储在硬盘

sqlite的数据类型:

sqlite支持null、integer、real、text和blob数据类型

分别代表:空值、整型值、浮点值、字符串值、二进制对象。

动态数据类型(弱引用):

当某个值插入到数据库中时,sqlite将会检测它的数据类型,如果该类型与关联的列不匹配,sqlite则会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储。

在android中使用sqlite主要涉及两个类:

sqlitedatabase和sqliteopenhelper,下面对这两个类进行主要的分析。

sqlitedatabase

这个类提供了一些管理sqlite数据库的方法,比如创建、删除、执行sql命令,和执行其他常见的数据库管理任务的方法。每个程序的数据库名字是唯一的。

常用方法:

db.execsql(string sql) //执行任何的sql语句

db.insert(string table,string nullcolumnhack,contentvalues values) //插入记录

db.delete(string table,string whereclause,string[] whereargs)//删除记录

db.update(string table,contentvalues values,string whereclause,string[] whereargs)//更新记录

db.query(string table,string[] columns,string selection,string[] selectionargs,string groupby,string having,string orderby)//查询记录

db.rawquery(string sql,string[] selectionargs)//通过sql语句查询记录

下面是一个简单操作sqlite数据库的示例:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public class mainactivity extends appcompatactivity {
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main);
//每个程序都有自己的数据库
//通过openorcreatedatabase来打开或创建一个数据库,返回sqlitedatabase对象
/**
* openorcreatedatabase(string name,int mode,sqlitedatabase.cursorfactory factory)
* name: 数据库名
* mode: 数据库权限,mode_private为本应用程序私有,mode_world_readable和mode_world_writeable分别为全局可读和可写。
* factory: 可以用来实例化一个cusor对象的工厂类
*/
sqlitedatabase db = openorcreatedatabase("user.db",mode_private,null);
//创建一个表
db.execsql("create table if not exists usertb (" +
"_id integer primary key," +
"name text not null,age integer not null," +
"sex text not null)");
//向表中插入记录
db.execsql("insert into usertb (name,age,sex) values ('张三',18,'女')");
db.execsql("insert into usertb (name,age,sex) values ('李四',19,'男')");
db.execsql("insert into usertb (name,age,sex) values ('王五',20,'女')");
//cursor为查询结果对象,类似于jdbc中的resultset
cursor queryresult = db.rawquery("select * from usertb", null);
if (queryresult != null) {
while (queryresult.movetonext()) {
log.i("info", "id: " + queryresult.getint(queryresult.getcolumnindex("_id"))
+ " 姓名: " + queryresult.getstring(queryresult.getcolumnindex("name"))
+ " 年龄: " + queryresult.getint(queryresult.getcolumnindex("age"))
+ " 性别: " + queryresult.getstring(queryresult.getcolumnindex("sex")));
}
//关闭游标对象
queryresult.close();
}
//关闭数据库
db.close();
}
}

当执行完openorcreatedatabase("user.db",mode_private,null)后,会在/data/data/<包名>/databases/目录下创建一个数据库文件,打开ddms可以查看。也可以将其导出,使用navigate等工具打开查看里面的数据。

Android数据存储之SQLite使用

另外,上述示例对记录的操作是使用execsql()方法通过原生的sql语句进行的,当然也可以使用上面介绍的sqlitedatabase常用的方法来操作,如insert()、delete()、update()、query()等方法。但是需要注意的是,以插入记录举例,当数据量不大时,通过execsql()使用sql语句进行插入与使用insert()方法插入记录的效率是差不多的,但是如果数据量比较大,那么使用前者比使用后者的效率明显高出很多。

sqliteopenhelper

这个类为sqlitedatabase的帮助类,主要用于管理数据库的创建与版本更新。sqlitehelper是一个抽象类,一般通过创建一个继承自它的子类并重写oncreat()和onupgrade()方法进行使用。

-oncreat(sqlitedatabase db) //首次创建数据库时调用,一般用于建表等操作。

-onupgrade(sqlitedatabase db,int oldversion,int newversion)//当升级数据库版本时调用

下面是使用sqliteopenhelper的一个简单示例:

创建一个继承自sqliteopenhelper的子类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class sqlitehelper extends sqliteopenhelper {
/**
* context:上下文对象
* name:数据库名
*/
public sqlitehelper(context context, string name) {
super(context, name, null, 1);
}
//首次创建数据库的时候调用,一般进行建表或某些初始化的操作
@override
public void oncreate(sqlitedatabase db) {
//建表
db.execsql("create table if not exists usertb (" +
"_id integer primary key," +
"name text not null,age integer not null," +
"sex text not null)");
}
//当数据库版本升级时自动调用
@override
public void onupgrade(sqlitedatabase db, int oldversion, int newversion) {
 
}
}

然后就可以通过sqlitehelper的实例获取一个sqlitedatabase对象,进而对数据库进行一系列的操作了。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class mainactivity2 extends appcompatactivity {
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.activity_main2);
//创建一个sqlitehelper对象
sqlitehelper helper = new sqlitehelper(mainactivity2.this,"stu.db");
//使用getwritabledatabase()或getreadabledatabase()方法获得sqlitedatabase对象
sqlitedatabase db = helper.getwritabledatabase();
//插入记录
db.execsql("insert into usertb (name,age,sex) values ('张三',18,'女')");
db.execsql("insert into usertb (name,age,sex) values ('李四',19,'男')");
db.execsql("insert into usertb (name,age,sex) values ('王五',20,'女')");
//获取游标对象
cursor queryresult = db.rawquery("select * from usertb", null);
if (queryresult != null) {
//打印所有记录
while (queryresult.movetonext()) {
log.i("info", "id: " + queryresult.getint(queryresult.getcolumnindex("_id"))
+ " 姓名: " + queryresult.getstring(queryresult.getcolumnindex("name"))
+ " 年龄: " + queryresult.getint(queryresult.getcolumnindex("age"))
+ " 性别: " + queryresult.getstring(queryresult.getcolumnindex("sex")));
}
//关闭游标对象
queryresult.close();
}
//关闭数据库
db.close();
}
}

延伸 · 阅读

精彩推荐
  • Android汇总Android视频录制中常见问题

    汇总Android视频录制中常见问题

    这篇文章主要汇总了Android视频录制中常见问题,帮助大家更好地解决Android视频录制中常见的问题,需要的朋友可以参考下...

    yh_thu5192021-04-28
  • AndroidAndroid界面效果UI开发资料汇总(附资料包)

    Android界面效果UI开发资料汇总(附资料包)

    android ui界面设计,友好的界面会提高用户体验度;同时也增强了android ui界面设计的难度,本文提供了一些常用开发资料(有下载哦)感兴趣的朋友可以了解下...

    Android开发网4672021-01-03
  • AndroidAndroid程序设计之AIDL实例详解

    Android程序设计之AIDL实例详解

    这篇文章主要介绍了Android程序设计的AIDL,以一个完整实例的形式较为详细的讲述了AIDL的原理及实现方法,需要的朋友可以参考下...

    Android开发网4642021-03-09
  • AndroidAndroid中AsyncTask详细介绍

    Android中AsyncTask详细介绍

    这篇文章主要介绍了Android中AsyncTask详细介绍,AsyncTask是一个很常用的API,尤其异步处理数据并将数据应用到视图的操作场合,需要的朋友可以参考下...

    Android开发网7452021-03-11
  • AndroidAndroid实现固定屏幕显示的方法

    Android实现固定屏幕显示的方法

    这篇文章主要介绍了Android实现固定屏幕显示的方法,实例分析了Android屏幕固定显示所涉及的相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    鉴客6192021-03-27
  • AndroidAndroid编程解析XML方法详解(SAX,DOM与PULL)

    Android编程解析XML方法详解(SAX,DOM与PULL)

    这篇文章主要介绍了Android编程解析XML方法,结合实例形式详细分析了Android解析XML文件的常用方法与相关实现技巧,需要的朋友可以参考下...

    liuhe68810052021-05-03
  • AndroidAndroid CardView+ViewPager实现ViewPager翻页动画的方法

    Android CardView+ViewPager实现ViewPager翻页动画的方法

    本篇文章主要介绍了Android CardView+ViewPager实现ViewPager翻页动画的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Abby代黎明9602022-03-02
  • AndroidAndroid实现Service获取当前位置(GPS+基站)的方法

    Android实现Service获取当前位置(GPS+基站)的方法

    这篇文章主要介绍了Android实现Service获取当前位置(GPS+基站)的方法,较为详细的分析了Service基于GPS位置的技巧,具有一定参考借鉴价值,需要的朋友可以参考下...

    Ruthless8342021-03-31