Android 开发中使用 SQLite 数据库
SQLite 介绍
SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。
此外它还是开源的,任何人都可以使用它。许多开源项目((Mozilla, PHP, Python)都使用了 SQLite.
SQLite 由以下几个组件组成:SQL 编译器、内核、后端以及附件。
SQLite 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展 SQLite 的内核变得更加方便。
SQLite 内部结构
原文 http://www.ibm.com/developerworks/cn/opensource/os-cn-sqlite/index.html
SQLite的优点:
-
轻量级
使用 SQLite 只需要带一个动态库,就可以享受它的全部功能, 而且那个动态库的尺寸想当小。 -
独立性
SQLite 数据库的核心引擎不需要依赖第三方软件,也不需要所谓的“安装”。 -
隔离性
SQLite 数据库中所有的信息(比如表、视图、触发器等) 都包含在一个文件夹内,方便管理和维护。 -
跨平台
SQLite 目前支持大部分操作系统,不至电脑操作系统更在众多的手机系统 也是能够运行,比如:Android。 -
多语言接口
SQLite 数据库支持多语言编程接口。 -
安全性
SQLite 数据库通过数据库级上的独占性和共享锁来实现独立事务处理。 这意味着多个进程可以在同一时间从同一数据库读取数据, 但只能有一个可以写入数据。
在Android中连接SQLite需要先创建一个类,并且继承个类extends SQLiteOpenHelper
package com.example.sqlite; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; public class MyOpenHelper extends SQLiteOpenHelper { /** * @param context 上下文 * name: 数据库的名字 * factory 目的创建 cursor 对象 * version 数据库的版本 从1开始 */ public MyOpenHelper(Context context) { super(context, "itheima.db", null, 1); // super(context, name, factory, version); } /** * Called when the database is created for the first time. This is where the creation of tables and the initial population of the tables should happen. * 当数据库第一次创建的时候调用 * 那么这个方法特别适合做表结构的初始化 创建表就是写 sql 语句 */ public void onCreate(SQLiteDatabase db) { // id 一般以 _d 下划线开头 String sql ="create table wx_user(" + "id int primary key," + "name varchar(30)," + "tou varchar(20)," + "content varchar(50)," + "dateTime varchar(30)" + ")"; db.execSQL(sql); } /** * Called when the database needs to be upgraded. * 当数据库版本升级的时候调用 * 这个方法适合做什么 表结构的更新 * */ public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("alter table info add phone varchar(20)"); } }
这里创建了数据库类,接下来是往数据库中插入数据;
//方法一 // 创建数据库 MyOpenHelper helper = new MyOpenHelper(this); SQLiteDatabase db = helper.getWritableDatabase(); // ContentValues 其实是一个map 对象 google 工程师封装的方法 ContentValues values = new ContentValues(); // 一一对应填充数据 values.put("id",1); values.put("name", "android"); values.put("tou", "xxx"); values.put("content", "今天学习了SQLite"); values.put("dateTime", "11月29号"); db.insert("t_Message", null, values); // 方法二:使用sql 语句 String sql = "insert into t_Message(id,name,tou,content,datetime) values(?,?,?,?,?)"; // String[] sqlVales = {2, "oracle", "aaa", "oracle快忘记了", "11月20日" }; db.execSQL(sql, sqlVales); // 关闭数据库连接 db.close();
// 方法三 //往数据库中插入数据的代码,在这里使用的是execSQL(sql); for(int i=3;i<20;i++){ String sql = "insert into wx_user(id,name,tou,content,dateTime) values("+i+",'oracle"+i+"','aa','oracle是什么','11月19日')"; sqlDatabase.execSQL(sql); }
往数据库中参入数据之后,我们再将数据库中的数据取出来看看;我们需要先创建一个实体类;
package com.example.entiy; // 创建实体类 public class unserInFo { private int id; private String name; private String dateTime; private String tou; private String content; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDateTime() { return datetime; } public void setDateTime(String dateTime) { this.dateTime= dateTime; } public String getTou() { return tou; } public void setTou(String tou) { this.tou = tou; } public String toString() { return "unserInFo [id="+id+,"name=" + name + ", dataTime=" + dataTime+ ", tou=" + tou+ "]"; } public unserInFo() { super(); } }
获取数据
//定义一个集合用来存放所有的结果 List<unserInFo> user = new ArrayList<unserInFo>(); //通过游标来获取表wx_user的信息, Cursor c=sqlDatabase.query("wx_user", null, null, null, null, null, null); //先判断是否有第一条数据(ic.moveToFirst()将游标移到第一条数据,如果没有第一条数据则返回false,否则返回true) if(c.moveToFirst()){ //通过getCount()来决定循环的次数getCount()是游标的总数量。 for (int i = 0; i<c.getCount();i++) { unserInFo uif = new unserInFo(); //将游标移动到下一条数据 c.moveToNext(); uif.setId(c.getInt(c.getColumnIndex("id"))); uif.setLastdate(c.getString(c.getColumnIndex("dateTime"))); uif.setName(c.getString(c.getColumnIndex("name"))); uif.setZhao(c.getString(c.getColumnIndex("tou"))); uif.setContent(c.getString(c.getColumnIndex("content"))); user.add(uif); } } //最后数据库中获取到的数据就全部存放到user集合中了,我们只需要遍历user就能显示数据了。
SQLiteOpenHelper是SQLiteDatabase的一个帮助类, 用来管理数据库的创建和版本的更新。
一般是建立一个类继承它,并实现它的onCreate和onUpgrade方法。 常用的方法有:
onCreate(SQLiteDatabase db) |
创建数据库时调用 |
onUpgrade(SQLiteDatabase db,int oldVersion , int newVersion) |
版本更新时调用 |
getReadableDatabase() |
创建或打开一个只读数据库 |
getWritableDatabase() |
创建或打开一个读写数据库 |
1.SQLiteDatabase类
常用方法:
(int) delete(String table,String whereClause,String[] whereArgs) | 删除数据行的便捷方法 |
(long) insert(String table,String nullColumnHack,ContentValues values) |
添加数据行的便捷方法 |
(int) update(String table, ContentValues values, String whereClause, String[] whereArgs) |
更新数据行的便捷方法 |
(void) execSQL(String sql) |
执行一个SQL语句,可以是一个select或其他的sql语句 |
(void) close() | 关闭数据库 |
(Cursor) query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) |
查询指定的数据表返回一个带游标的数据集 |
(Cursor) rawQuery(String sql, String[] selectionArgs) |
运行一个预置的SQL语句,返回带游标的数据集 (与上面的语句最大的区别就是防止SQL注入) |
2.SQLiteDatabase类
使用insert方法
ContentValues cv = new ContentValues(); // 实例化一个ContentValues用来装载待插入的数据 cv.put("username","Jack Johnson"); // 添加用户名 cv.put("password","iLovePopMusic"); // 添加密码 db.insert("user",null,cv); // 执行插入操作
使用execSQL方式来实现
String sql = "insert into user(username,password) values ('Jack Johnson','iLovePopMuisc'); //插入操作的SQL语句 db.execSQL(sql); //执行SQL语句
数据的删除
String whereClause = "username=?"; // 删除的条件 String[] whereArgs = {"Jack Johnson"}; // 删除的条件参数 db.delete("user",whereClause,whereArgs); // 执行删除 String sql = "delete from user where username='Jack Johnson'"; // 删除操作的SQL语句 db.execSQL(sql); // 执行删除操作
数据修改
ContentValues cv = new ContentValues(); // 实例化 ContentValues cv.put("password","iHatePopMusic"); // 添加要更改的字段及内容 String whereClause = "username=?"; // 修改条件 String[] whereArgs = {"Jack Johnson"}; // 修改条件的参数 db.update("user",cv,whereClause,whereArgs); // 执行修改 String sql = "update [user] set password = 'iHatePopMusic' where username='Jack Johnson'"; // 修改的SQL语句 db.execSQL(sql); // 执行修改
数据查询
通过query实现查询的
public Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit)
table |
表名称 |
column |
列名称数组 |
selection |
条件子句,,相当于where |
selectionArgs |
条件语句的参数数组 |
groupBy |
分组 |
having |
分组条件 |
orderBy |
排序类 |
limit |
分页查询的限制 |
Cursor |
返回值,相当于结果集resultSet |
游标(Cursor)
getCount() |
总记录条数 |
isFirst() |
判断是否第一条记录 |
isLast() |
判断是否最后一条记录 |
moveToFirst() |
移动到第一条记录 |
moveToLast() |
移动到最后一条记录 |
move(int offset) |
移动[是指偏移量而不是指移到指定位置] |
moveToNext() |
移动到吓一条记录 |
moveToPrevious() |
移动到上一条记录 |
getColumnIndex(String columnName) |
获得指定列索引的int类型值 |
游标(Cursor) Cursor c = db.query("user",null,null,null,null,null,null);//查询并获得游标 if(c.moveToFirst()){//判断游标是否为空 for(int i=0;i<c.getCount();i++){ c.moveToNext(); String username = c.getString(c.getColumnIndex("username"); String password = c.getString(c.getColumnIndex("password")); }
rawQuery实现的带参数查询
Cursor c = db.rawQuery("select * from user where username=?",new Stirng[]{"Jack Johnson"}); if(cursor.moveToFirst()) { String password = c.getString(c.getColumnIndex("password")); }
http://www.cnblogs.com/shanyou/archive/2007/01/08/615245.html