【移动开发】SQLite数据库使用 数据类型小结

【移动开发】SQLite数据库使用 数据类型小结,第1张

概述在我们平时做Android项目,不管是应用还是游戏,都会用到SQLite数据库,在这里我还是简单的整理了一下。 1.简介 SQLite 是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的SQL数据库引擎。 其特点是高度便携、使用方便、结构紧凑、高效、可靠。 与其他数据库管理系统不同,SQLite 的安装和运行非常简单,在大多数情况下 - 只要确保SQLite的二进制文件存在即可开始创建、

在我们平时做AndroID项目,不管是应用还是游戏,都会用到sqlite数据库,在这里我还是简单的整理了一下。

1.简介

@H_301_23@SQlite 是一个开源的嵌入式关系数据库,实现自包容、零配置、支持事务的sql数据库引擎。 其特点是高度便携、使用方便、结构紧凑、高效、可靠。 与其他数据库管理系统不同,sqlite 的安装和运行非常简单,在大多数情况下 - 只要确保sqlite的二进制文件存在即可开始创建、连接和使用数据库。如果您正在寻找一个嵌入式数据库项目或解决方案,sqlite是绝对值得考虑。

@H_301_23@一般的数据库采用的是固定的静态数据类型,sqlite采用@H_301_46@动态数据类型,创建一个表时,可以在 CREATE table 语句中指定某列的数据类型,但是你可以把任何数据类型放入任何列中。当某个值插入到数据库时,sqlite将会检查它的类型,如果该类型与关联的列不匹配,sqlite则会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储,比如可以把一个字符串(String)放入 INTEGER 列。sqlite称这为“弱类型”。但有一个特例,如果是INTEGER PRIMARY KEY,则其他类型不会被转换,会报一个“datatype missmatch”的错误。

@H_301_23@在事务处理方面,sqlite通过数据库级上的@H_301_46@独占性和@H_301_46@共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据。在某个进程或线程想数据库执行写 *** 作之前,必须获得独占锁。在获得独占锁之后,其他的读或写 *** 作将不会再发生。

@H_301_23@此外,sqlite 不支持一些标准的 sql 功能,特别是外键约束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FulL OUTER JOIN,还有一些 ALTER table 功能。

除了上述功能外,sqlite 是一个完整的 sql 系统,拥有完整的触发器,交易等等。


2.AndroID 集成了 sqlite 数据库

AndroID 在运行时(run-time)集成了 sqlite,所以每个 AndroID 应用程序都可以使用 sqlite 数据库。对于熟悉 sql 的开发人员来时,在 AndroID 开发中使用 sqlite 相当简单。但是,由于 JDBC 会消耗太多的系统资源,所以 JDBC 对于手机这种内存受限设备来说并不合适。因此,AndroID 提供了一些新的 API 来使用 sqlite 数据库,AndroID 开发中,程序员需要学使用这些 API。

数据库存储在 data/data/<项目文件夹>/databases/ 下。

A.数据类型

@H_301_23@ 1.NulL 空值

@H_301_23@ 2.INTEGER 带符号的整型

@H_301_23@ 3.REAL 浮点型

@H_301_23@ 4.TEXT 字符串文本

@H_301_23@ 5.BLOB 二进制对象

@H_301_23@但实际上,sqlite3也接受如下的数据类型:

@H_301_23@ smallint 16 位元的整数。

@H_301_23@ interger 32 位元的整数。

@H_301_23@ decimal(p,s) p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数点後有几位数。如果没有特别指定,则系统会设为 p=5; s=0 。

@H_301_23@ float 32位元的实数。

@H_301_23@ double 64位元的实数。

@H_301_23@ char(n) n 长度的字串,n不能超过 254。

@H_301_23@ varchar(n) 长度不固定且其最大长度为 n 的字串,n不能超过 4000。

@H_301_23@ graphic(n) 和 char(n) 一样,不过其单位是两个字元 double-bytes, n不能超过127。这个形态是为了支援两个字元长度的字体,例如中文字。

@H_301_23@ vargraphic(n) 可变长度且其最大长度为 n 的双字元字串,n不能超过 2000

@H_301_23@ date 包含了 年份、月份、日期。

@H_301_23@ time 包含了 小时、分钟、秒。

@H_301_23@ timestamp 包含了 年、月、日、时、分、秒、千分之一秒。

@H_301_23@ datetime 包含日期时间格式,必须写成'2010-08-05'不能写为'2010-8-5',否则在读取时会产生错误!

@H_301_23@B.简单使用

AndroID平台下数据库相关类:
sqliteOpenHelper 抽象类:通过从此类继承实现用户类,来提供数据库打开、关闭等 *** 作函数。
sqliteDatabase 数据库访问类:执行对数据库的插入记录、查询记录等 *** 作。
sqliteCursor 查询结构 *** 作类:用来访问查询结果中的记录。

Activites 可以通过 Content ProvIDer 或者 Service 访问一个数据库。

C.创建数据库

@H_301_23@AndroID不自动提供数据库。在 AndroID 应用程序中使用 sqlite,必须自己创建数据库,然后创建表、索引,填充数据。@H_301_23@AndroID 提供了 sqliteOpenHelper 帮助你创建一个数据库,你只要继承 sqliteOpenHelper 类,就可以轻松的创建数据库。

@H_301_23@sqliteOpenHelper 类根据开发应用程序的需要,封装了创建和更新数据库使用的逻辑。sqliteOpenHelper 的子类,至少需要实现三个方法:

package com.dandan.fm.db;import androID.content.Context;import androID.database.sqlite.sqliteDatabase;import androID.database.sqlite.sqliteDatabase.CursorFactory;import androID.database.sqlite.sqliteOpenHelper;/** * 可以通过sqliteOpenHelper的以下两个方法来或得sqliteDatabase的对象: * getReadableDatabase() 创建或者打开一个查询数据库 * getWritableDatabase() 创建或者打开一个可写数据库 */public class DBHelper extends sqliteOpenHelper {    /**     * 构造函数,必须实现     * @param context 上下文路径     * @param name 数据库名称     * @param factory 可选游标工厂,通常为NulL     * @param version 当前数据库版本号     */    public DBHelper(Context context,String name,CursorFactory factory,int version) {        super(context,name,factory,version);    }                                                                                                                                                                                                                                                                                                                            //数据库第一次创建时会调用,一般在其中创建数据库表    @OverrIDe    public voID onCreate(sqliteDatabase db) {        //使用execsql()方法执行DDL语句,如果没有异常,这个方法没有返回值        db.execsql("create table user(ID INTEGER PRIMARY KEY autoINCREMENT," + "name varchar(20),address TEXT)");    }                                                                                                                                                                                                                                                                                                                            //当数据库需要修改的时候,AndroID系统会主动的调用这个方法。    @OverrIDe    public voID onUpgrade(sqliteDatabase db,int oldVersion,int newVersion) {    //数据库版本升级时,更新数据库 *** 作    }                                                                                                                                                                                                                                                                                                                            //打开数据库时的回调函数,一般不会用    @OverrIDe    public voID onopen(sqliteDatabase db) {        super.onopen(db);    }                                                                                                                                                                                                                                                                                                                            @OverrIDe    public synchronized voID close() {        super.close();    }}


说明:

创建表和索引

db.execsql("create table user(ID INTEGER PRIMARY KEY autoINCREMENT," + "name varchar(20),address TEXT)");

给表添加数据

有两种方式添加数据:
1.向上面创建表一样,可以使用execsql方法执行 INSERT,UPDATE,DELETE 等语句来更新表的数据。execsql适用于 所有不需要返回结果的SQL语句。如:

db.execsql("INSERT INTO user (name,address) VALUES ('woniu'," +"'http://http://smallwoniu.blog.51cto.com/')");

@H_301_23@2.sqliteDatabase 对象的 insert(),update(),delete() 方法。这些方法把 sql 语句的一部分作为参数。如:

private sqliteDatabase mDataBase = null;private static final String USER_table = "user";                                                                                                                                                                                                public voID getDB() {    //创建DBHelper对象    DBHelper db = new DBHelper(this,USER_table,null,1);    //获取可写sqliteDatabase    mDataBase = db.getWritableDatabase();}                                                                                                                                                                                                public voID insert() {    //ContentValues对象,向其中插入键值对,键是数据库列名,值是插入到这一列的值    ContentValues cv = new ContentValues();    cv.put("name","liuMing");    cv.put("address","ShangHai");    mDataBase.insert(USER_table,cv);}                                                                                                                                                                                                public int update() {    ContentValues cv = new ContentValues();    cv.put("name","Mali");    //第三个参数where语句,相当于SQL语句中where后面的语句,?是占位符    //第四个参数是占位符的值    return mDataBase.update(USER_table,cv,"ID = ?",new String[]{"1"});}                                                                                                                                                                                                public int delete() {    //和udate()类似    return mDataBase.delete(USER_table,"ID = ? and name = ?",new String[]{"1","Mali"});}

查询数据库
与INSERT,DELETE类似,有两种方法从数据库中查询数据。

/** * 使用rawquery()直接调用SELECT语句,最简单的查询方法 * 如果查询是动态的,使用rawquery就会非常复杂 * @return Cursor可以迭代查询结果 */public Cursor rawquery() {    return mDataBase.rawquery("select * from user where ID = ? and name = ?","liuMing"});}//使用SELECT语句段构建查询,SELECT语句内容做为query()方法的参数public Cursor query() {    String[] columns = {"name","address"};    //第二个参数: 要查询的列名    //第三个参数:where语句    //第三个参数:where语句中占位符的值    //第四个参数:对查询结果进行分组    //第五个参数:对分组结果进行限制    //第六个参数:对查询结果进行排序    return mDataBase.query(USER_table,columns,new String[] {"1"},null);}


最后着重提及一下使用游标,不管如何执行查询,都会返回一个Cursor,Curosr主要方法如下:

getCount(): 获得结果集中有多少记录。
movetoFirst(): 移动到第一行。
movetoNext(): 移动到下一行,可遍历所有记录。
isAfterLast(): 判断是否最后一行。
getColumnnames(): 返回字段名。
getColumnCount(): 返回字段号。
getString(),getInt(): 得到给定字段当前记录的值。
requery(): 重新执行查询得到游标。
close(): 释放游标资源。


/** 查询记事本表的所有记录 **/    public ArrayList<HashMap<String,Object>> getWriteallCount() {        // 打开数据库        openDatabase();        ArrayList<HashMap<String,Object>> data = null; // 接收数据        // Cursor----ResultSet:用于接收数据库数据列表        Cursor cursor = db.query(DBInfo.table.TB_WRITE_name,null);        if (null != cursor && cursor.getCount() > 0) {            data = new ArrayList<HashMap<String,Object>>();            while (cursor.movetoNext()) {                HashMap<String,Object> map = new HashMap<String,Object>();                map.put("Title",cursor.getString(cursor.getColumnIndex("Title")));                map.put("content",cursor.getString(cursor.getColumnIndex("content")));                map.put("imagePath",cursor.getString(cursor.getColumnIndex("imagePath")));                map.put("time",cursor.getString(cursor.getColumnIndex("time")));                map.put("color",cursor.getString(cursor.getColumnIndex("color")));                map.put("background",cursor.getInt(cursor.getColumnIndex("background")));                map.put("lock",cursor.getInt(cursor.getColumnIndex("lock")));                data.add(map);            }        }        cursor.close();        db.close(); // 用完记得要关闭哦        return data;    }

当然,如果我们遇到大量反复对数据库进行 *** 作时,我们可以使用异步加载数据库(可以看我的下一篇博客),改善加的用户体验效果

总结

以上是内存溢出为你收集整理的【移动开发】SQLite数据库使用 数据类型小结全部内容,希望文章能够帮你解决【移动开发】SQLite数据库使用 数据类型小结所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1173978.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)