Android数据存储之SQLite使用
SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎。它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行。
在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();
    }
}
Android数据存储之SQLite使用的更多相关文章
- Android数据存储:SQLite
		Android数据存储之SQLite SQLite:Android提供的一个标准的数据库,支持SQL语句.用来处理数据量较大的数据.△ SQLite特征:1.轻量性2.独立性3.隔离性4.跨平台性5. ... 
- Android数据存储之SQLite数据库
		Android数据存储 之SQLite数据库简介 SQLite的相关知识,并结合Java实现对SQLite数据库的操作. SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎. ... 
- 【转载】Android数据存储之SQLite
		SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎.它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行. 在Android中创建的SQLite数据库存储在:/d ... 
- Android数据存储之SQLite的操作
		Android作为一个应用在移动设备上的操作系统,自然也就少不了数据的存储.然而SQLite作为一个轻型的关系型数据库,基于其轻量.跨平台.多语言接口及安全性等诸多因数考虑,因而Android较大的数 ... 
- android数据存储之Sqlite(二)
		SQLite学习笔记 前言:上一章我们介绍了sqlite的一些基本知识以及在dos命令下对sqlite进行的增删改查的操作,这一章我们将在android项目中实际来操作sqlite. 1. SQLit ... 
- Android数据存储之Sqlite的介绍及使用
		前言: 本来没有打算整理有关Sqlite数据库文章的,最近一直在研究ContentProvider的使用,所有觉得还是先对Sqlite进行一个简单的回顾,也方便研究学习ContentProvider. ... 
- Android 数据存储之 SQLite数据库存储
		----------------------------------------SQLite数据库---------------------------------------------- SQLi ... 
- android数据存储之Sqlite(一)
		SQLite学习笔记 1. Sqlite简介 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入 式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低 ... 
- 【Android 应用开发】Android 数据存储 之 SQLite数据库详解
		. 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19028665 . SQLiteDataBase示例程序下 ... 
随机推荐
- STS(eclipse)3.7.3新建项目报错:org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.MavenProject,   org.apache.maven.archiver.MavenArchiveConfiguration)
			烦人的版本兼容问题 没有使用sts3.7.3系统内嵌的maven3.3.3,调整为稍高版本的maven3.5.2,懒得修改配置了. 升级eclipse插件吧. Eclipse,Help -> I ... 
- 下载安装 STS(Spring Tool Suite),推荐对应 Eclipse 版本号,适用于Windows32位(xp、2003)
			sts下载地址:https://spring.io/tools/sts/legacy 虽然sts内置了版本对应的eclipse,仍推荐使用当前环境下稳定使用的eclipse版本. Start 找到ec ... 
- mysql连接测试java脚本
			JDBC.java import java.io.IOException; import java.io.InputStream; import java.sql.*; import java.uti ... 
- 初学c# -- 学习笔记(9) 关于SQL2008
			在做一个局域网的类似网盘的学习练习,服务端差不多了,在改bug.用vlc的dll做的全格式视频.音频预览在线播放下载等等. 在做服务端也遇到了一些问题,走了好多弯路. 开始把上传的视频.音频.图像.文 ... 
- 168. Excel Sheet Column Title (Math)
			Given a positive integer, return its corresponding column title as appear in an Excel sheet. For exa ... 
- HDU 6304 Chiaki Sequence Revisited
			题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=6304 多校contest1 Problem Description Chiaki is int ... 
- pythone函数基础(10)MD5加密
			导入hashlib模块import hashlibs='yulin123456's.encode()#把数字转换成bytes类型m=hashlib.md5(s.encode())print(m.hex ... 
- ant 执行java文件,java文件中含中文,显示乱码
			在build.xml文件run target下添加下面一行 <sysproperty key="file.encoding" value="UTF-8" ... 
- slf4j 日志组件
			slf4j:Simple Logging Facade for Java 官网:https://www.slf4j.org/ 
- [c#.net]未能加载文件或程序集“”或它的某一个依赖项。系统找不到指定的文件
			问题是这样嘀: 项目采用了三层架构和工厂模式,并借鉴了PetShop的架构,因为这个项目也是采用分布式的数据库,目前只有三个数据库,主要出于提高访问性能考虑. 原来是按照网上对PetShop的介绍来给 ... 
