android中的数据库操作
Posted IT_xiao小巫
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android中的数据库操作相关的知识,希望对你有一定的参考价值。
android中的数据库操作
android中的应用开发很难避免不去使用数据库,这次就和大家聊聊android中的数据库操作。
一、android内的数据库的基础知识介绍
1.用了什么数据库
android中采用的数据库是SQLite这个轻量级的嵌入式开源数据库,它是用c语言构建的。相关简介可以从链接查看。
2.数据库基本知识观花
对于一些和我一样还没有真正系统学习数据库技术的同学来说,把SQL92标准中的一些基本概念、基本语句快速的了解一下,是很有必要的,这样待会用Android的database相关方法去执行一些数据库语句时就不会茫然了。
①数据库的基本结构——表格
表格是数据库中储存资料的基本架构。表格被分为栏位 (column) 及列位 (row)。每一列代表一笔资料,而每一栏代表一笔资料的一部份。举例来说,如果我们有一个记载顾客资料的表格,那栏位就有可能包括姓、名、地址、城市、国家、生日...等等。每一个表格拥有一个独一无二的名字(Table Name)以便能够让用户定位到它上面。一个典型的表格结构如下:
Store_Information 表格
store_name | Sales | Date |
Los Angeles | $1500 | Jan-05-1999 |
San Diego | $250 | Jan-07-1999 |
Los Angeles | $300 | Jan-08-1999 |
Boston | $700 | Jan-08-1999 |
②关于数据类型
和其他的数据库不同的是,sqlite是无类型的。也就是当你创建一个表格时,无需对每一个栏位要存储的数据的类型进行声明,当你在给表格增加数据条目时,sqlite会自动找到存入的数据的类型。
SQLite允许忽略数据类型,但是,仍然建议在Create Table语句中指定数据类型,因为数据类型有利于增强程序的可读性。SQLite支持常见的数据类型,如VARCHAR、NVARCHAR、TEXT、INTEGER、FLOAT、BOOLEAN、CLOB、BLOB、TIMESTAMP、NUMERIC、VARYING、CHARACTER、NATl0NAI, VARYINGCHARACTER。这些数据类型都是SQL92标准中规定的标准数据库数据类型,想要有更近一步了解,请参看下表。
SQL数据库数据类型详解 |
|
你或许已经在纳闷了,为什么之前的数据类型是大写的,而到了这个表格就变成了小写的。其实这是sqlite的一个不得不提的特性:sqlite是大小写不敏感的!这一特性对于很多c语言fans来说是很不习惯的。
③数据库的基本操作语句
其实这个还是SQL92标准中的一部分,只是不同的数据库会有一点点的不同而已,下面就对在android中最常用的几个操作语句给以概述,详细介绍请参看SQL语句简单介绍。
(1)CREATE TABLE
由于创建一个表格,基本使用语法结构是:
CREATE TABLE "表格名" ("栏位1" 保存资料类型 , "栏位3" 保存资料类型 , "栏位2" 保存资料类型 .....);
例如我要创建刚才的Store_Information表格,就可以这样:
CREATE TABLE Store_Information (Store_Name char[50] , Sales long , Date date );
需要提示的是,这里还是声明了数据类型。而且不难发现,c语言构建的sqlite自身也有一些c语言的性格(例如一个完整语句后的分号)。
(2)SELECT
用于将资料从数据库中的表格内选出,基本语法结构为:
SELECT "栏位名" FROM "表格名" ;
例如我想将 Store_Information 里面的store_name 选出,则可以这样:
SELECT store_name FROM Store_Information ;
这句执行后就会显示如下的信息:
store_name |
Los Angeles |
San Diego |
Los Angeles |
Boston |
好了,效果一目了然。
(3)SELECT语句可以添加条件来缩小选择结果:
去掉重复的结果:
SELECT DISTINCT "栏位名" FROM "表格名"
例如将刚才的语句改为:
SELECT DISTINCT store_name FROM Store_Information ;
则显示的结果为:
store_name |
Los Angeles |
San Diego |
Boston |
实现有条件的筛选:
SELECT "栏位名" FROM "表格名" WHERE "条件语句" ;
条件语句和c语言中的类似,只不过用AND表示“且”,OR表示“或”。
例如对表执行如下语句:
SELECT store_name FROM Store_Information WHERE Sales > 1000 ;
则显示结果为:
store_name
Los Angeles
其中WHERE语句用的较多,因为它可以实现自定义条件的使用和多条件的组合。
(4)INSERT INTO
在表格中加入资料——可以实现一笔的加入和多笔的加入。
加入一笔:
INSERT INTO "表格名" ("栏位1", "栏位2", ...) VALUES ("值1", "值2", ...);
加入多笔:
INSERT INTO "待加入数据的表格" ("栏位1", "栏位2", ...) SELECT "栏位3", "栏位4", ... FROM "被加入的表格" ;
加入多笔其实就是将另一个表格加入到现有表格中。
(5)UPDATE
用于修改表格中的数据,语法结构为:
UPDATE "表格名" SET "栏位1" = [新值] WHERE 条件;
例如:
UPDATE Store_Information SET Sales = 500 WHERE store_name = "Los Angeles" AND Date = "Jan-08-1999" ;
具体是什么意思的话就不说了,你懂的~~~
(6)DELETE FROM
删除表格中的某些数据,语法结构为:
DELETE FROM "表格名" WHERE 条件 ;
满足条件的所有资料都会被删除掉。
二、如何在android中调用数据库资源
在android中主要有两种方法来实现对数据库的访问,一种是adb shell方式,另一种是通过相关的android 的java类来间接的对数据库来进行操作。其中前者主要用于在开发过程中进行调试等工作,后者则为android中主要的使用数据库的方式。
下面就对这两种方式进行一个简要的介绍。
1.adb shell方式
说白了,adb shell 就是一个android模拟器的后台资源调用器(个人理解啦~~)。它的操作方式和命令提示符差不多——以命令行的方式进行。
既然是模拟器的后台资源调用器,那当然得先打开android模拟器了。
打开模拟器后,再打开命令提示符,在里面输入adb shell,这时会出现一个#号(懂linux的同学懂的),具体效果如下:
然后你就可以像在linux下进行shell命令的执行了。
接着输入 cd data/data/ 并执行,再执行ls,则会显示一些安装的软件的工程包名,效果如下:
其实这在模拟器中是以一个个文件夹的形式存在的,所以你可以用cd命令进入它。例如我进入一个后,再用ls命令显示里面的内容:
该文件夹内又存在databases、 lib等文件夹(如果没有databases的话可以自己手动用mkdir命令创建一个)。而这个databases文件夹就是这个应用的数据库文件的所在地,cd进入后,应该会看到里面有一个或多个.db格式的文件(其实sqlite对文件的名字没有特殊要求,你用.txt等其他的格式也可以,但推荐.db)。如果没有db文件的话,可以用如下命令创建:sqlite3 mydata.db。这样就会在databases里面生成了一个数据库文件。如果已存在,可以直接用sqlite3命令调用该数据库文件,命令为 sqlite3 mydata.db(其实就是和刚才的命令一个样)。接下来你就会看到:
在sqlite>后面就可以执行你的sql语句了。下面执行了一些简单的语句:
好了,adb shell的方式介绍到这里。
2.通过android中的相关java类
Android中对数据库进行操作的相关的借口、类等都在andorid.database和android.database.sqlite两个包里面。里面存在着很多的与数据库操作相关的类,但是在平时普通的开发中最经常遇到的仅仅就是那几个类而已,所以在这里我就省去通篇的介绍,对一些常用的接口、类做一下简介。
①SQLiteDatabase(android.database.sqlite.SQLiteDatabase)
文档信息:
public class
SQLiteDatabase
Exposes methods to manage a SQLite database.SQLiteDatabase has methods to create, delete, execute SQLcommands, and perform other common database management tasks.atabase names must be unique within an application, not across all applications.
简介:
这个是在android中数据库操作使用最频繁的一个类。通过它可以实现数据库的创建或打开、创建表、插入数据、删除数据、查询数据、修改数据等操作。
重要方法介绍:
(1)public static SQLiteDatabase openOrCreateDatabase (File file, SQLiteDatabase.CursorFactory factory)
public static SQLiteDatabase openOrCreateDatabase (String path, SQLiteDatabase.CursorFactory factory)
这个方法用于打开或创建一个数据库(对于sqlite来说,就是打开或产生一个数据库文件),参数中的File类就是java中表示系统文件路径的File类,而SQLiteDatabase.CursorFactory则是一个产生Cursor对象的工厂类(Cursor接口将在后面介绍到)。
(2)public long insert (String table, String nullColumnHack, ContentValues values)
看到它的名字以及sql中的相关语句你不难猜到这个方法用于在数据库中加入数据。ContentValue类似于java中HashMap类,用于以键值对的方式保存数据。
(3)public int delete (String table, String whereClause, String[] whereArgs)
不用说了,用于删除表中的数据。
(4)public Cursor query (booleandistinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
名字很长是吧,它的功能也很强大,用于查询数据库中的数据。
(5)public int update (String table, ContentValues values, String whereClause, String[] whereArgs)
用于修改数据。根据传入参数的名字可以对使用方法略知一二。
(6)public void execSQL (String sql, Object[] bindArgs)
public void execSQL (String sql)
这是我个人认为最为重要的方法。这个方法用于执行你用String表示的非查询(因为它不会返回一个Cursor对象)的sql语句,例如CREATE,SELECT等。遗憾的是现在尚无法一次调用该方法来执行用“;”分开的多条sql语句。第二个重写方法使用的更多些。
在我周围 5 公里半径值范围内的 android 应用上标记地理位置。
如何从 SQLite 数据库中的用户位置检索特定范围内的一组位置