第十三讲 SQL实战
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
创建表和索引
为了创建表和索引,需要调用 SQLiteDatabase 的 execSQL() 方法来执行 DDL 语句。 db.execSQL("CREATE TABLE mytable (_id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, value REAL);");
ContentProvider
Android提供了ContentProvider,一个程序可 以通过实现一个ContentProvider的抽象接口将 自己的数据完全暴露出去,而且 ContentProviders是以类似数据库中表的方式 将数据暴露,也就是说ContentProvider就像一 个“数据库”。 那么外界获取其提供的数据,也就应该与从数 据库中获取数据的操作基本一样,只不过是采 用URI来表示外界需要访问的“数据库”。
URI
A:标准前缀,用来说明一个Content Provider控制这些数据; B:URI的标识,它定义了是哪个Content Provider提供这些数据。 对于第三方应用程序,为了保证URI标识的唯一性,它必须是一个 完整的、小写的 类名。这个标识在<provider> 元素的 authorities 属性中说明: <provider name=”.TransportationProvider” authorities=”com.example.transp ortationprovider” . . . > C:路径,Content Provider使用这些路径来确定当前需要什么类型 的数据; D:如果URI中包含,表示需要获取的记录的ID;如果没有ID,就表 示返回全部;
给表添加数据
有两种方法可以给表添加数据。 像上面创建表一样,你可以使用 execSQL() 方法执行 INSERT, UPDATE, DELETE 等语句来更新表的数据。execSQL() 方法适用 于所有不返回结果的 SQL 语句。例如: db.execSQL("INSERT INTO widgets (name, inventory,title,score)"+ "VALUES ('Sprocket', 5)"); 另一种方法是使用 SQLiteDatabase 对象的 insert(), update(), delete() 方法。这些方法把 SQL 语句的一部分作为参数。示例如 下: ContentValues cv=new ContentValues(); cv.put(“name”,”jack”); db.insert(“mytable”,null, cv);
ContentProvider的抽象接口 的抽象接口
onCreate() which is called to initialize the provider query(Uri, String[], String, String[], String) which returns data to the caller insert(Uri, ContentValues) which inserts new data into the content provider update(Uri, ContentValues, String, String[]) which updates existing data in the content provider delete(Uri, String, String[]) which deletes data from the content provider getType(Uri) which returns the MIME type of data in the content provider
给表添加数据
update()方法有四个参数,分别是表名,表示列名和 值的 ContentValues 对象,可选的 WHERE 条件和可 选的填充 WHERE 语句的字符串,这些字符串会替换 WHERE 条件中的“?”标记。 update() 根据条件,更新指定列的值,所以用 execSQL() 方法可以达到同样的目的。 WHERE 条件和其参数和用过的其他 SQL APIs 类似。 例如: String[] parms=new String[] {"this is a string"}; db.update("widgets", replacements, "name=?", parms); delete() 方法的使用和 update() 类似,使用表名,可选 的 WHERE 条件和相应的填充 WHERE 条件的字符串。
绑定到listview 绑定到
SimpleCursorAdapter的构造函数接受下面5个 参数:
context:对当前Activity的引用 layout:一个资源,它定义一个列表条目的视图 cursor:数据集光标 from:一组列名称,数据来源于这些列 to:视图列表,这是数据的目的地
Android 应用程序之间数据共享
SQLite被广泛应用 被广泛应用
SQLite被广泛应用的在苹果、Adobe、Google 的各项产品。 如果非要举一个你身边应用SQLite的例子的话, 如果你的机器中装的有迅雷,请打开迅雷安装 目录,搜索一下sqlite3.dll,是不是找到了它的 身影? 如果你装的有金山词霸,那么打开他的安装目 录也会看到sqlite.dll的存在。
Android与SQLite 与
Android 在运行时集成了 SQLite,所以每个 Android 应用程序都可以使用 SQLite 数据库。 Android 提供了一些新的 API 来使用 SQLite 数据库,Android 开发中,程序员需要学使用 这些 API。 数据库存储在 data/< 项目文件夹 >/databases/ 下。
使用游标
不管你如何执行查询,都会返回一个 Cursor 。 Cursor result=db.rawQuery("SELECT ID, name, inventory FROM mytable"); result.moveToFirst(); while (!result.isAfterLast()) { int id=result.getInt(0); String name=result.getString(1); int inventory=result.getInt(2); result.moveToNext(); } result.close();
Biblioteka Baidu
查询数据库查询数据库
使用 rawQuery() 直接调用 SELECT 语句 Cursor c=db.rawQuery( "SELECT name FROM sqlite_master WHERE type='table' AND name='mytable'", null); 使用 query() 方法构建一个查询 String[] columns={"ID", "inventory"}; String[] parms={"snicklefritz"}; Cursor result=db.query("widgets", columns, "name=?",parms, null, null, null);
使用 SQLite 数据库
Activites 可以通过 Content Provider 或者 Service 访问一个数据库。
创建数据库
Android 提供了 SQLiteOpenHelper 帮助创建一个数据库,只要继 承 SQLiteOpenHelper 类,就可以轻松的创建数据库。 SQLiteOpenHelper 类根据开发应用程序的需要,封装了创建和更 新数据库使用的逻辑。SQLiteOpenHelper 的子类,至少需要实现 三个方法: 构造函数,调用父类 SQLiteOpenHelper 的构造函数。这个方法 需要四个参数:上下文环境(例如,一个 Activity),数据库名字, 一个可选的游标工厂(通常是 Null),一个代表你正在使用的数 据库模型版本的整数。 onCreate()方法,它需要一个 SQLiteDatabase 对象作为参数, 根据需要对这个对象填充表和初始化数据。 onUpgrage() 方法,它需要三个参数,一个 SQLiteDatabase 对象, 一个旧的版本号和一个新的版本号,这样你就可以清楚如何把一 个数据库从旧的模型转变到新的模型。
ContentProvider
组织应用程序的数据; 组织应用程序的数据; 向其他应用程序提供数据; 向其他应用程序提供数据;
ContentResolver
获取ContentProvider提供的数据; 提供的数据; 获取 提供的数据 修改/添加 删除更新数据等; 添加/删除更新数据等 修改 添加 删除更新数据等;
SQLite简介 简介
实现了多数的SQL-92标准,包括事务,就是代表原 子性、一致性、隔离性和持久性的(ACID),触发 器和多数的复杂查询。不进行类型检查。你可以把字 符串插入到整数列中。 SQLite 不支持一些标准的 SQL 功能,特别是外键约 束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 还有一些 ALTER TABLE 功能。
SQLite客户端管理工具 客户端管理工具
火狐插件 Sqlite Manger http://code.google.com/p/sqlite-manager/
SQLite结构 结构
SQLite结构 结构
接口(Interface) 接口 接口由SQLite C API组成,也就是说不管是程序、脚本语言还是库文件,最终都是通过它与 SQLite交互的(我们通常用得较多的ODBC/JDBC最后也会转化为相应C API的调用)。 编译器(Compiler) 编译器 在编译器中,分词器(Tokenizer)和分析器(Parser)对SQL进行语法检查,然后把它转化为 底层能更方便处理的分层的数据结构---语法树,然后把语法树传给代码生成器(code generator)进行处理。而代码生成器根据它生成一种针对SQLite的汇编代码,最后由虚拟机 (Virtual Machine)执行。 虚拟机(Virtual Machine) 虚拟机 架构中最核心的部分是虚拟机,或者叫做虚拟数据库引擎(Virtual Database Engine,VDBE)。 它和Java虚拟机相似,解释执行字节代码。VDBE的字节代码由128个操作码(opcodes)构成, 它们主要集中在数据库操作。它的每一条指令都用来完成特定的数据库操作(比如打开一个表 的游标)或者为这些操作栈空间的准备(比如压入参数)。总之,所有的这些指令都是为了满足 SQL命令的要求(关于VM,后面会做详细介绍)。 后端(Back-End) 后端 后端由B-树(B-tree),页缓存(page cache,pager)和操作系统接口(即系统调用)构成。B-tree 和page cache共同对数据进行管理。B-tree的主要功能就是索引,它维护着各个页面之间的 复杂的关系,便于快速找到所需数据。而pager的主要作用就是通过OS接口在B-tree和Disk 之间传递页面。
SQL 实战
SQLite简介 简介
SQLite是遵守ACID的关系数据库 关系数据库管理系统, 关系数据库 它包含在一个相对小的C库中。它是 D.RichardHipp创建的开源项目。 不像常见的客户端 服务器结构 客户端/服务器结构 客户端 服务器结构数据库, SQLite引擎不是个程序与之通信的独立进程, 而是连接到程序中成为它的一个主要部分。主 要的通信协议是在编程语言内的直接API调用。
获得数据库
调用SQLiteOpenHelper 类的 getReadableDatabase() 或 getWriteableDatabase() 方法,你可以得到 SQLiteDatabase 实例。
db=(new DatabaseHelper(getContext())).getWritableDatabase(); return (db == null) ? false : true;