SQLite 在 Android 的应用
Android提供了创建和使用SQLite数据库的API(Application Programming Interface,应用程序编程接口)。
在Android系统中,主要由类SQLiteDatabase和SQLiteOpenHelper对SQLite数据库进行管理和操作。
(一)SQLiteOpenHelper类
SQLiteOpenHelper是SQLiteDatabase的一个帮助类,用来管理数据库的创建和版本的更新。
因为是个抽象类,所以必须创建一个类来继承它,并实现两个抽象的方法onCreate()和onUpgrade()方法。
| 方法 | 说明 |
|
SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) |
构造方法 |
| abstract void onCreate(SQLiteDatabase db) | 创建数据库时调用 |
|
abstract void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) |
升级数据库时调用
|
| void onOpen(SQLiteDatabase db) | 打开数据库时调用 |
| SQLiteDatabase getReadableDatabase() |
创建或打开数据库
|
| SQLiteDatabase getWritableDatabase() | 创建或打开一个读写数据库 |
下面是一个具体的例子:DatabaseHelper.java
private static class DatabaseHelper extends SQLiteOpenHelper {
static final String DATABASE_NAME = "College.db";
static final int DATABASE_VERSION = 1;
static final String STUDENTS_TABLE_NAME = "students";
static final String CREATE_DB_TABLE =
" CREATE TABLE " + STUDENTS_TABLE_NAME +
" (_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
" name TEXT NOT NULL, " +
" grade TEXT NOT NULL);";
DatabaseHelper(Context context){
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
db.execSQL(CREATE_DB_TABLE);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXISTS " + STUDENTS_TABLE_NAME);
onCreate(db);
}
}
(二)创建数据库
在Activity中创建数据库对象,可能是在onCreate()方法或事件中创建:
DatabaseHelper database = new DatabaseHelper(this);
SQLiteDatabase db = null;
db = database.getWritableDatabase();
首先实例一个SQLiteOpenHelper帮助类的对象,然后调用该对象的getWritableDatabase() 或 getReadableDatabase()方法 获得SQLiteDatabase 数据库对象。
另外2种创建的方法:
1、应用SQLiteDatabase对象openDatabase()方法及openOrCreateDatabase()方法创建数据库;
2、应用Activity继承于父类android.content.Context创建数据库的方法openOrCreateDatabase()来创建数据库。
1、在DDMS中查看,College.db 生成在/data/data/xxxx(包名)/databases路径下。
2、删除数据库文件,应用android.content.Context类的deleteDatabase(String name)方法来删除指定的数据库。
(三)SQLiteDatabase 类
SQLiteDatabase 类的方法有很多,下面是最常用的几个。一般的数据操作,可以使用对应的方法,或者自己写需要的sql语句,再调用execSQL()方法执行。
| 方法 | 说明 |
|
openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory) |
打开或创建数据库 |
|
openDatabase(String path, SQLiteDatabase.CursorFactory factory,int flags) |
打开指定的数据库 |
|
insert(String table, String nullColumnHack, ContentValues values) |
新增一条记录 |
|
delete(String table,String whereClause, String[] whereArgs) |
删除一条记录 |
|
update(String table,ContentValues values, String whereClause,String[] whereArgs) |
修改记录 |
|
query(String table,String[] columns, String selection, String[]selectionArgs, String groupBy,String having, String orderBy) |
查询一条记录 |
| execSQL(String sql) | 执行SQL语句 |
| close() | 关闭数据库 |
(四)增删改查
对数据记录的操作处理有两种方法:
- 编写一条对记录进行增、删、改、查的SQL语句,通过exeSQL()方法来执行
- 使用SQLiteDatabase对象的相应方法进行操作
数据添加
insert(String table, String nullColumnHack, ContentValues values)方法
第1个参数table:增加记录的数据表;
第2个参数nullColumnHack:空列的默认值,通常为null;
第3个参数ContentValues:为ContentValues对象,其实就是一个键值对的字段名称,键名为表中的字段名,键值为要增加的记录数据值。通过ContentValues对象的put()方法把数据存放到ContentValues对象中。
ContentValues cv = new ContentValues(); //实例化ContentValues用来装载待插入的数据
cv.put("name","Apple"); //添加学生
cv.put("grade","A"); //添加成绩
db.insert("user",null,cv); //执行插入操作
或者
String sql = "insert into students (name,grade) values ('Apple','A');
db.execSQL(sql);
数据删除
delete(String table,String whereClause, String[] whereArgs)方法
第1个参数table:修改记录的数据表;
第2个参数whereClause:删除数据的条件,相当于SQL语句的where子句;
第3个参数whereArgs:删除条件的参数数组。
String whereClause = "name=?"; //删除的条件
String[] whereArgs = {"Apple"}; //删除的条件参数
db.delete("students",whereClause,whereArgs); //执行删除
或者
String sql = "delete from students where name='Apple'";
db.execSQL(sql);
数据修改
update(String table,ContentValues values,String whereClause, String[] whereArgs)方法
第1个参数table:修改记录的数据表;
第2个参数ContentValues:ContentValues对象,存放已作修改的数据的对象;
第3个参数whereClause:修改数据的条件,相当于SQL语句的where子句;
第4个参数whereArgs:修改数据值的数组。
ContentValues cv = new ContentValues(); //实例化ContentValues
cv.put("grade","AA"); //添加要更改的字段及内容
String whereClause = "username=?"; //修改条件
String[] whereArgs = {"Appke"}; //修改条件的参数
db.update("students",cv,whereClause,whereArgs); //执行修改
或者
String sql = "update students set grade = 'AA' where name='Apple'";
db.execSQL(sql);
数据查询
query(String table, String[] columns, String selection,
String[] selectionArgs, String groupBy, String having, String orderBy)方法
第1个参数table:查询记录的数据表;
第2个参数columns:查询的字段,如为null,则为所有字段;
第3个参数selection:查询条件,可以使用通配符“?”;
第4个参数selectionArgs:参数数组,用于替换查询条件中的“?”;
第5个参数groupBy:查询结果按指定字段分组;
第6个参数having:限定分组的条件;
第7个参数orderBy:查询结果的排序条件。
db.query("students",null,null,null,null,null,null);
或者
String sql = "select * from students";
db.execSQL(sql);
(五)对查询结果cursor的处理
query()方法查询的数据均封装到查询结果Cursor对象之中,Cursor相当于SQL语句中resultSet结果集上的一个游标,可以向前向后移动。
Cursor对象的常用方法有:
|
方法 |
说明 |
|
getCount() |
获取总记录条数 |
|
isFirst() |
判断是否第一条记录 |
|
isLast() |
判断是否最后一条记录 |
|
moveToFirst() |
移动到第一条记录 |
|
moveToLast() |
移动到最后一条记录 |
|
move(int offset) |
移动到指定的记录 |
|
moveToNext() |
移动到下一条记录 |
|
moveToPrevious() |
移动到上一条记录 |
|
getColumnIndex(String columnName) |
获得指定列索引的int类型值 |
一个例子:
Cursor c = db.query("students",null,null,null,null,null,null); //查询并获得游标
if(c.moveToFirst()){ //判断游标是否为空
for(int i=0;i<c.getCount();i++){
c.move(i); //移动到指定记录
String name = c.getString(c.getColumnIndex("name");
String grade = c.getString(c.getColumnIndex("grade"));
}
}
SQLite 在 Android 的应用的更多相关文章
- sqlite在Android上的一个bug:SQLiteCantOpenDatabaseException when nativeExecuteForCursorWindow
更多内容在这里查看 https://ahangchen.gitbooks.io/windy-afternoon/content/ ::-/com.company.product W/System.er ...
- 利用SQLite在android上实现增删改查
利用SQLite在android上实现增删改查 方法: 一.直接利用database.execSQL()方法输入完整sql语句进行操作 这种方法适用于复杂的sql语句,比如多表查询等等 这里适合于增删 ...
- 利用SQLite在android上创建数据库
利用SQLite在android上创建数据库 方法: 1.创建我们的数据库类继承SQLiteOpenHelper类 完成相关函数的重写和数据库对象的初始化 public MySQLiteOpenHel ...
- sqlite与android交互 (封装)
学android已经有大概一周时间了吧 ,总感觉自己基础不怎么好,只能通过一点一点积累着敲来巩固平常的知识,有的时候就先不封装的敲一遍,再封装上,有些语句真的记不住,虽然知道他是什么意思,于是乎就反复 ...
- Sqlite in Android
在Android上保存本地数据有三种方式,SharedPreferences.Files和Sqlite.SharedPreferences主要是用来保存键值对形式的程序配置信息,与ini.proper ...
- SQLite在Android程序中的使用方法,SQLite的增删查改方法
Sqlite: 1.一款用来实现本地数据存储的轻量级数据管理工具,是众多用来实现数据库管理的工具之一. 2.Android已经将SQLite的代码功能吸收在它的系统中,我们可以直接在Android程序 ...
- 关于SQLite在Android开发中的知识点总结
一.存放位置 1.内部存储-放在 data/data 底下, 也就是内部存储, 里面的文件以及文件夹是私有的, 其他 app 不能访问, 也随着 app 卸载而删除; 2.放在 sd 卡里面, 如果设 ...
- what are Datatypes in SQLite supporting android
As said at Datatypes In SQLite Version 3: Datatypes In SQLite Version 3 Most SQL database engines (e ...
- android安卓Sqlite数据库实现用户登录注册
看了很多别人写的安卓SQlite数据的操作代码,一点也不通俗易懂,我觉得我写的不错,而且安卓项目也用上了,所以在博客园里保存分享一下!建立一个类 并继承SQLiteOpenHelper public ...
随机推荐
- 16.copy_to定制组合field解决cross-fields搜索弊端
主要知识点: 在index的mapping中加copy_to字段的方法 copy_to搜索方法 用most_fields策略,去实现cross-fields搜索,有3大弊端,为了解决这三个弊端 ...
- jquery源码分析(五)——Deferred 延迟对象
javascript的异步编程 为什么要使用异步编程? JS是单线程语言,就简单性而言,把每一件事情(包括GUI事件和渲染)都放在一个线程里来处理是一个很好的程序模型,因为这样就无需再考虑线程同步这些 ...
- web开发如何使用高德地图API(四)通过AMap.Marker自定义标点
说两句: 以下内容除了我自己写的部分,其他部分在高德开放平台都有(可点击外链访问). 我所整理的内容以实际项目为基础希望更有针对性的,更精简. 点击直奔主题. 准备工作: 首先,注册开发者账号,成为高 ...
- 大逃亡(escape.*)
给出数字N(1<=N<=10000),X(1<=x<=1000),Y(1<=Y<=1000),代表有N个敌人分布一个X行Y列的矩阵上,矩形的行号从0到X-1,列号从 ...
- C++ premier 中文版 学习笔记(第五章 表达式)
解应用和自增组合使用的理解 由于后自增操作的优先级高于解引用操作,因此 *iter++ 等效于*(iter++).子表达式 iter++ 使 iter 加 1,然后返回 iter 原值的副本作为该表达 ...
- 为什么要阅读——兼分享《首先,打破一切常规》[中译文]:世界顶级管理者的成功秘诀/(美)马库斯·白金汉,(美)柯特·科夫曼 著
<ctrlno=255632">首先,打破一切常规>[中译文]:世界顶级管理者的成功秘诀/(美)马库斯·白金汉,(美)柯特·科夫曼 著:鲍世修 等译 下载地址:http:/ ...
- Linux模块化机制和module_init
致谢: 微信公众号:嵌入式企鹅圈 每天都新增爱好者关注,感谢大家的支持和大牛们的建议. 本人将竭力出品很多其它优质的原创文章回馈大家的厚爱. 引子:模块化机制长处 模块化机制(module)是Linu ...
- GTK经常使用控件之行编辑( GtkEntry )
行编辑,仅仅同意输入一行内容的控件.如password输入框. 行编辑的创建: GtkWidget *gtk_entry_new(void); 返回值:行编辑指针 设置行编辑内容的最大长度: void ...
- UVA10254 - The Priest Mathematician(找规律)
UVA10254 - The Priest Mathematician(找规律) 题目链接 题目大意:4根柱子的汉诺塔. 解题思路:题目里面有提示,先借助四个柱子移走k个,然后在借助三个柱子移走剩余的 ...
- 【字符串处理】关于KMP算法输出的是什么&代码
输入: ABCDABTBD_TISABCDABCABCDABC q为当前nxt处理的模版文本串下标: k为“失配时去哪里”,详情请看注释. --------------我是求完nxt的分界线----- ...