SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎。它支持大多数的SQL92标准,而且能够在全部主要的操做系统上运行。html
在Android中建立的SQLite数据库存储在:/data/data/<包名>/databases/目录下。sql
主要特色:数据库
-轻量级数据结构
-独立性,没有不依赖,无需安装ide
-跨平台,支持众多操做系统工具
-支持高达2TB大小的数据库this
-每一个数据库以单个文件的形式存在url
-以B-Tree的数据结构形式存储在硬盘spa
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(); } }