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
这里创建了数据库类,接下来是往数据库中插入数据;
//方法一
// 创建数据库
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); // 执行插入操作
实例化一个ContentValues
使用execSQL方式来实现
String sql = "insert into user(username,password) values ('Jack Johnson','iLovePopMuisc'); //插入操作的SQL语句 db.execSQL(sql); //执行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
Android 开发中使用 SQLite 数据库的更多相关文章
- 在Android 开发中使用 SQLite 数据库笔记
SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PH ...
- android开发之使用SQLite数据库存储
http://blog.csdn.net/jason0539/article/details/16360835 SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且 ...
- Android虚拟机中的sqlite数据库文件
Android虚拟机中的sqlite数据库文件 ①
- 在安卓开发中使用SQLite数据库操作实例
前段时间写了个安卓平台下SQLite数据库操作的实例 ,一直没得时间总结 ,今天把它弄出来了. 在Android 运行时环境包含了完整的 SQLite. 首先介绍一下SQLite这个数据库: SQLi ...
- android开发之使用SQLite数据库(db文件)
在开发中,有时须要使用db文件数据库.所以就须要将其导入项目,再将其使用程序写入到应用的db文件下使用. 代码非常easy.能够拿来直接使用. 要使用须要两个步骤: 1.创建raw文件.导入db文件. ...
- C# Android 开发中使用 Sqlite.NET ORM
开发环境:VS2015 Xamarin Sqlite.NET ORM 不就相当于 Entiry Framework For Xamarin 吗? 相当于用 C# 开发安卓程序访问 Sqlite 可以使 ...
- 【转】Android开发中的SQLite事务处理,即beginTransaction()方法
使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTrans ...
- Android开发中的SQLite事务处理,即beginTransaction()方法
使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTrans ...
- Android 开发中 SQLite 数据库的使用
SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PHP, ...
随机推荐
- lightoj 1300 边双联通分量+交叉染色求奇圈
题目链接:http://lightoj.com/volume_showproblem.php?problem=1300 边双连通分量首先dfs找出桥并标记,然后dfs交叉着色找奇圈上的点.这题只要求在 ...
- Android程序的入口点和全局变量设置--application
首先看看 application的官方文档 我之前一直以为Android程序的入口点就是带MAIN和LAUNCHER的Activity的onCreate方法,看来我是错了~ 原来真正的入口点是 Ap ...
- MyBatis总结-实现关联表查询
一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...
- 堆排序中建堆过程时间复杂度O(n)怎么来的?
首先这个循环是从i = headsize/2 -> 1,也就是说这是一个bottom-up的建堆.于是,有1/2的元素向下比较了一次,有1/4的向下比较了两次,1/8的,向下比较了3次,.... ...
- OpenMP与C++:事半功倍地获得多线程的好处
来源:IIEEG 01-28-2011 在并行计算领域有一个广为流传的笑话——并行计算是未来之事并且永远都是.这个小笑话几十年来一直都是对的.一种类似的观点在计算机架构社区中流传,处理器时钟速度的极限 ...
- java+ mysql 给所有的表添加假数据
需求:别的项目, 代码扣过来了, 数据库也拿过来了, 但是数据库全是空表, 一共700 张表,需求是给表添加假数据,让它能运行起来. 一下是代码实现: 1.数据库连接: public static C ...
- ECLIPSE里面SVN图标消失,文件状态不显示问题
ECLIPSE里面SVN状态图标消失,重新启动eclipse,重新导入工程也不能显示SVN状态图标.这多半是由于之前eclipse没有正常关闭引起的. 解决办法2个: 方法一:1. 在Window&g ...
- GDB调试技巧
1. 查看内存分布 (gdb) info proc mappings 2. 对于类的调试,先通过行号来设断点, 比如:(gdb) b TcpConnection.cc:63 3. 打印数组的内容 (g ...
- Centos6.3 配置yum 163源
1. 下载repo文件 下载地址:http://mirrors.163.com/.help/CentOS6-Base-163.repo 2. 备份并替换系统的repo文件[root@localh ...
- Python中的map()函数和reduce()函数的用法
Python中的map()函数和reduce()函数的用法 这篇文章主要介绍了Python中的map()函数和reduce()函数的用法,代码基于Python2.x版本,需要的朋友可以参考下 Py ...