热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

android:SQLite创建数据库

SQLite是一款轻量级的关系型数据库,它的运算速度非常快,占用资源很少,通常只需要几百K的内存就足够了,因而特别适合在移动设备上使用。SQLite不仅支持标准的SQL语法,还遵循了数据

SQLite 是一款轻量级的关系型数据库,它的运算速度非常快, 占用资源很少,通常只需要几百 K 的内存就足够了,因而特别适合在移动设备上使用。SQLite 不仅支持标准的 SQL 语法,还遵循了数据库的 ACID 事务,所以只要你以前使用过其他的 关系型数据库,就可以很快地上手 SQLite。而 SQLite 又比一般的数据库要简单得多,它甚 至不用设置用户名和密码就可以使用。Android 正是把这个功能极为强大的数据库嵌入到了 系统当中,使得本地持久化的功能有了一次质的飞跃。

前面我们所学的文件存储和 SharedPreferences 存储毕竟只适用于去保存一些简单的数据 和键值对,当需要存储大量复杂的关系型数据的时候,你就会发现以上两种存储方式很难应 付得了。比如我们手机的短信程序中可能会有很多个会话,每个会话中又包含了很多条信息 内容,并且大部分会话还可能各自对应了电话簿中的某个联系人。很难想象如何用文件或者 SharedPreferences 来存储这些数据量大、结构性复杂的数据吧?但是使用数据库就可以做得 到。那么我们就赶快来看一看,Android 中的 SQLite 数据库到底是如何使用的。

创建数据库

Android 为了让我们能够更加方便地管理数据库,专门提供了一个 SQLiteOpenHelper 帮 助类,借助这个类就可以非常简单地对数据库进行创建和升级。既然有好东西可以直接使用, 那我们自然要尝试一下了,下面我就将对 SQLiteOpenHelper 的基本用法进行介绍。

首先你要知道 SQLiteOpenHelper 是一个抽象类,这意味着如果我们想要使用它的话, 就需要创建一个自己的帮助类去继承它。SQLiteOpenHelper 中有两个抽象方法,分别是 onCreate()和 onUpgrade(),我们必须在自己的帮助类里面重写这两个方法,然后分别在这两 个方法中去实现创建、升级数据库的逻辑。

SQLiteOpenHelper 中 还 有 两 个 非 常 重 要 的 实 例 方 法 , getReadableDatabase() 和 getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在 则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。不 同的是,当数据库不可写入的时候(如磁盘空间已满)getReadableDatabase()方法返回的对 象将以只读的方式去打开数据库,而 getWritableDatabase()方法则将出现异常。

SQLiteOpenHelper 中有两个构造方法可供重写,一般使用参数少一点的那个构造方法即 可。这个构造方法中接收四个参数,第一个参数是 Context,这个没什么好说的,必须要有 它才能对数据库进行操作。第二个参数是数据库名,创建数据库时使用的就是这里指定的名 称。第三个参数允许我们在查询数据的时候返回一个自定义的 Cursor,一般都是传入 null。 第 四 个 参 表 示 当 前 数 据 库 的 版 本 号 , 可 用 于 对 数 据 库 进 行 升 级 操 作 。 构 建 出 SQLiteOpenHelper 的实例之后,再调用它的 getReadableDatabase()或 getWritableDatabase()方法就能够创建数据库了,数据库文件会存放在/data/data//databases/目录下。
此时,重写的 onCreate()方法也会得到执行,所以通常会在这里去处理一些创建表的逻辑。

接下来还是让我们通过例子的方式来更加直观地体会 SQLiteOpenHelper 的用法吧,首先新建一个 DatabaseTest 项目。 这里我们希望创建一个名为 BookStore.db 的数据库,然后在这个数据库中新建一张 Book表,表中有 id(主键)、作者、价格、页数和书名等列。创建数据库表当然还是需要用建表 语句的,这里也是要考验一下你的 SQL 基本功了,Book 表的建表语句如下所示:

 

create table Book (

id integer primary key autoincrement, author text,

price real, pages integer, name text)

只要你对 SQL 方面的知识稍微有一些了解,上面的建表语句对你来说应该都不难吧。SQLite 不像其他的数据库拥有众多繁杂的数据类型,它的数据类型很简单,integer 表示整型,real 表示浮点型,text 表示文本类型,blob 表示二进制类型。另外,上述建表语句中我们还使用了 primary key 将 id 列设为主键,并用 autoincrement 关键字表示 id 列是自增长的。 然后需要在代码中去执行这条 SQL 语句,才能完成创建表的操作。新建 MyDatabaseHelper类继承自 SQLiteOpenHelper,代码如下所示:

 public class MyDatabaseHelper extends SQLiteOpenHelper {

 

public static final String CREATE_BOOK = "create table book ("

+ "id integer primary key autoincrement, "

+ "author text, "

+ "price real, "

+ "pages integer, "

+ "name text)";

 

 

private Context mContext;

 

 

public MyDatabaseHelper(Context context, String name, CursorFactory factory, int version) {

super(context, name, factory, version);

mCOntext= context;

}

 

 

@Override

public void onCreate(SQLiteDatabase db) {

db.execSQL(CREATE_BOOK);

Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();

}

 

 

@Override

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

}

 

 

}

可以看到,我们把建表语句定义成了一个字符串常量,然后在 onCreate()方法中又调用 了 SQLiteDatabase 的 execSQL()方法去执行这条建表语句,并弹出一个 Toast 提示创建成功, 这样就可以保证在数据库创建完成的同时还能成功创建 Book 表。

现在修改 activity_main.xml 中的代码,如下所示:

 

android:layout_ android:layout_

android:orientation="vertical" >

 

再次点击 Create database 按钮时,会发现此时已经存在 BookStore.db 数据库了,因此不会再 创建一次。

现在就可以运行一下代码了,在程序主界面点击 Create database 按钮,结果如图 6.11 所示。

 

图   6.11

 

此时 BookStore.db 数据库和 Book 表应该都已经创建成功了,因为当你再次点击 Create database 按钮时不会再有 Toast 弹出。可是又回到了之前的那个老问题,怎样才能证实它们 的确是创建成功了?如果还是使用 File Explorer,那么最多你只能看到 databases 目录下出现 了一个 BookStore.db 文件,Book 表是无法通过 File Explorer 看到的。因此这次我们准备换一 种查看方式,使用 adb shell 来对数据库和表的创建情况进行检查。

adb 是 Android SDK 中自带的一个调试工具,使用这个工具可以直接对连接在电脑上的 手机或模拟器进行调试操作。它存放在 sdk 的 platform-tools 目录下,如果想要在命令行中使 用这个工具,就需要先把它的路径配置到环境变量里。

如果你使用的是 Windows 系统,可以右击我的电脑→属性→高级→环境变量,然后在 系统变量里找到 Path 并点击编辑,将 platform-tools 目录配置进去,如图 6.12 所示。

图   6.12

 

如果你使用的是 Linux 系统,可以在 home 路径下编辑.bash_profile 文件,将 platform-tools目录配置进去即可,如图 6.13 所示:

 

图   6.13

 

配置好了环境变量之后,就可以使用 adb 工具了。打开命令行界面,输入 adb shell,就 会进入到设备的控制台,如图 6.14 所示。

 

图   6.14

 

然后使用 cd 命令进行到/data/data/com.example.databasetest/databases/目录下,并使用 ls命令查看到该目录里的文件,如图 6.15 所示。

图   6.15

 

这个目录下出现了两个数据库文件,一个正是我们创建的 BookStore.db ,而另一个 BookStore.db-journal 则是为了让数据库能够支持事务而产生的临时日志文件,通常情况下这 个文件的大小都是 0 字节。

接下来我们就要借助 sqlite 命令来打开数据库了,只需要键入 sqlite3,后面加上数据库 名即可,如图 6.16 所示。

 

图   6.16

 

这时就已经打开了 BookStore.db 数据库,现在就可以对这个数据库中的表进行管理了。 首先来看一下目前数据库中有哪些表,键入.table 命令,如图 6.17 所示。

 

图   6.17

 

可以看到,此时数据库中有两张表,android_metadata 表是每个数据库中都会自动生成的,不用管它,而另外一张 Book 表就是我们在 MyDatabaseHelper 中创建的了。这里还可以通过.schema 命令来查看它们的建表语句,如图 6.18 所示。

 

图   6.18

 

由此证明,BookStore.db 数据库和 Book 表确实已经是创建成功了。之后键入.exit 或.quit命令可以退出数据库的编辑,再键入 exit 命令就可以退出设备控制台了。


推荐阅读
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 1,关于死锁的理解死锁,我们可以简单的理解为是两个线程同时使用同一资源,两个线程又得不到相应的资源而造成永无相互等待的情况。 2,模拟死锁背景介绍:我们创建一个朋友 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 本文介绍了C#中数据集DataSet对象的使用及相关方法详解,包括DataSet对象的概述、与数据关系对象的互联、Rows集合和Columns集合的组成,以及DataSet对象常用的方法之一——Merge方法的使用。通过本文的阅读,读者可以了解到DataSet对象在C#中的重要性和使用方法。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 在说Hibernate映射前,我们先来了解下对象关系映射ORM。ORM的实现思想就是将关系数据库中表的数据映射成对象,以对象的形式展现。这样开发人员就可以把对数据库的操作转化为对 ... [详细]
  • 知识图谱——机器大脑中的知识库
    本文介绍了知识图谱在机器大脑中的应用,以及搜索引擎在知识图谱方面的发展。以谷歌知识图谱为例,说明了知识图谱的智能化特点。通过搜索引擎用户可以获取更加智能化的答案,如搜索关键词"Marie Curie",会得到居里夫人的详细信息以及与之相关的历史人物。知识图谱的出现引起了搜索引擎行业的变革,不仅美国的微软必应,中国的百度、搜狗等搜索引擎公司也纷纷推出了自己的知识图谱。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
author-avatar
王耀
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有