热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

Android数据存储之SQLite使用

SQLite是D.RichardHipp用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数据库的示例:

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等工具打开查看里面的数据。

另外,上述示例对记录的操作是使用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的子类

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对象,进而对数据库进行一系列的操作了。

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();
}
}

推荐阅读
  • 国内BI工具迎战国际巨头Tableau,稳步崛起
    尽管商业智能(BI)工具在中国的普及程度尚不及国际市场,但近年来,随着本土企业的持续创新和市场推广,国内主流BI工具正逐渐崭露头角。面对国际品牌如Tableau的强大竞争,国内BI工具通过不断优化产品和技术,赢得了越来越多用户的认可。 ... [详细]
  • 本文详细介绍如何使用arm-eabi-gdb调试Android平台上的C/C++程序。通过具体步骤和实用技巧,帮助开发者更高效地进行调试工作。 ... [详细]
  • 深入理解 Oracle 存储函数:计算员工年收入
    本文介绍如何使用 Oracle 存储函数查询特定员工的年收入。我们将详细解释存储函数的创建过程,并提供完整的代码示例。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 在计算机技术的学习道路上,51CTO学院以其专业性和专注度给我留下了深刻印象。从2012年接触计算机到2014年开始系统学习网络技术和安全领域,51CTO学院始终是我信赖的学习平台。 ... [详细]
  • CSS 布局:液态三栏混合宽度布局
    本文介绍了如何使用 CSS 实现液态的三栏布局,其中各栏具有不同的宽度设置。通过调整容器和内容区域的属性,可以实现灵活且响应式的网页设计。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ... [详细]
  • 本文将详细介绍如何使用剪映应用中的镜像功能,帮助用户轻松实现视频的镜像效果。通过简单的步骤,您可以快速掌握这一实用技巧。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文介绍如何在 Xcode 中使用快捷键和菜单命令对多行代码进行缩进,包括右缩进和左缩进的具体操作方法。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 在Linux系统中配置并启动ActiveMQ
    本文详细介绍了如何在Linux环境中安装和配置ActiveMQ,包括端口开放及防火墙设置。通过本文,您可以掌握完整的ActiveMQ部署流程,确保其在网络环境中正常运行。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
author-avatar
turneerpelliccia_291
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有