Android SQLite 简易指北
Android SQLite
- SQLite一款开源的, 轻量级的数据库.
- 以文本文件的形式存储数据.
- SQLite支持所有标准的关系型数据库特性.
- SQLite运行时占用内存非常少(约250 KByte).
- 使用简单, 无需安装配置.
SQLite数据库存储类型支持TEXT(类似Java中的String), INTEGER(类似Java中的LONG), REAL(类似JAVA中的double).所有其他的类型都在存储前转换成上述类型. 实际上SQLite数据库是无类型检查的.
More information about SQLite can be found on the SQLite website
基本SQL语句
表操作
- 创建表
CREATE TABLE products (_id INTEGER PRIMARY KEY AUTOINCREMENT, productname TEXT)
- 删除表
DROP TABLE products
增查改删CRUD
- 增Create
INSERT INTO products VALUES (NULL, 'apple')
- 查Retrieve
SELECT * FROM products WHERE productname='apple'
- 改Update
UPDATE products SET productname='orange' WHERE _id=1
- 删Delete
DELETE FROM products WHERE productname='apple'
使用SQL Helper操作数据库
我们通过继承SQLiteOpenHelper类来实现我们自己的数据库管理类, 在构造器中要调用父类SQLiteOpenHelper的构造器声明数据库名和当前数据库版本号.
public DatabaseHandler(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
在这个类中有两个需要重写的方法用来创建和更新数据库, 两个方法都接收一个SQLiteDatabase对象作为参数, :
onCreate()- 构造数据的方法, 如果数据库已经连接但是还没有创建, 系统框架会调用这个方法. 我们在此处创建数据库表.onUpgrade()- 当已存在的数据库版本号与代码中声明的版本号不同时系统调用此方法升级数据库.(与之类似的还有onDowngrade()方法).
@Override
public void onCreate(SQLiteDatabase db) {
Log.i(TAG, "handler created");
String sql = "create table " + TABLE_PRODUCTS + "(" +
COL_ID + " integer primary key autoincrement, " +
COL_PRODUCT_NAME + " text );";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
官方建议数据库表中包含_id字段作为主键, 一些Android功能依赖于此字段.
SQLiteOpenHelper类提供getReadableDatabase()和getWriteableDatabase()方法来访问数据库对象, 分别是只读和读写模式.
SQLiteDatabase
SQLiteDatabase提供如下方法用于操作数据库:
long insert(String table, String nullColumnHack, ContentValues values)插入int delete(String table, String whereClause, String[] whereArgs)删除int update(String table, ContentValues values, String whereClause, String[] whereArgs)更新Cursor query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)查询void execSQL(String sql)直接执行sql语句.Cursor rawQuery(String sql, String[] selectionArgs)直接运行sql查询语句.void close()释放对象引用.
ContentValues对象可以定义一组键值对. key代表数据库表中的列名, value代表对应列的值.
参数化的查询方式可以避免SQL注入攻击, 同时更具可读性.
insert()代码实例:
// Gets the data repository in write mode
SQLiteDatabase db = mDbHelper.getWritableDatabase();
// Create a new map of values, where column names are the keys
ContentValues values = new ContentValues();
values.put(FeedEntry.COLUMN_NAME_ENTRY_ID, id);
values.put(FeedEntry.COLUMN_NAME_TITLE, title);
values.put(FeedEntry.COLUMN_NAME_CONTENT, content);
// Insert the new row, returning the primary key value of the new row
long newRowId;
newRowId = db.insert(
FeedEntry.TABLE_NAME,
FeedEntry.COLUMN_NAME_NULLABLE,
values);
游标Cursor
查询操作返回一个游标对象. Cursor代表一次查询的结果并且指向查询结果中的一行. 这样Android可以有效的缓存查询结果, 因为它不会把所有的结果加载进内存.
getCount()获得结果的数量.moveToFirst()moveToNext()等方法用于移动游标.isAfterLast()检验是否游标移动到最后.getString(int columnIndex)获取当前游标位置的数据, 还可以是getLong()...void close()游标在使用结束后需要关闭.
示例代码
简单起见, 示例代码中使用直接执行SQL语句的方式进行数据库操作.
public class DBHandler extends SQLiteOpenHelper {
private static final int DB_VERSION = 1;
private static final String DB_NAME = "products.db";
private static final String TABLE_PRODUCTS = "products";
private static final String COL_ID = "_id";
private static final String COL_PRODUCT_NAME = "productname";
private static final String TAG = "ysz";
public DBHandler(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
String sql = "create table " + TABLE_PRODUCTS + "(" +
COL_ID + " integer primary key autoincrement, " +
COL_PRODUCT_NAME + " text );";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
public void insert(String name) {
SQLiteDatabase db = getWritableDatabase();
for (int i = 1; i < 499; i++) {
db.execSQL("insert into products values (null, ?)", new String[]{name});
}
db.close();
}
public void delete(String name) {
SQLiteDatabase db = getWritableDatabase();
db.execSQL("delete from products where productname=?", new String[]{name});
db.close();
}
public String getAllProducts() {
StringBuffer buffer = new StringBuffer();
// Select All Query
String selectQuery = "SELECT * FROM " + TABLE_PRODUCTS;
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursor = db.rawQuery(selectQuery, null);
// looping through all rows and adding to list
if (cursor.moveToFirst()) {
do {
buffer.append(cursor.getString(1));
buffer.append("\n");
} while (cursor.moveToNext());
}
cursor.close();
db.close();
return buffer.toString();
}
}
参考
Android SQLite database and content provider - Tutorial
Android SQLite Database Tutorial
Android - SQLite Database Tutorial
Android SQLite 简易指北的更多相关文章
- [Android Studio] 2019年Android Studio配置指北
Android Studio是我学习Android开发路上的第一块绊脚石,新建一个项目,一行代码没动,直接编译不起来,我太难了,所以本文叫指北 本文讲解在9102年如何在国内网络不通畅的情况下流畅的使 ...
- Android+Sqlite 实现古诗阅读应用(二)
传送门:Android+Sqlite 实现古诗阅读应用(一) Hi,又回来了,最近接到很多热情洋溢的小伙伴们的来信,吼开心哈,我会继续努力的=-=! 上回的东西我们做到了有个textview能随机选择 ...
- Android Sqlite 数据库版本更新
Android Sqlite 数据库版本更新 http://87426628.blog.163.com/blog/static/6069361820131069485844/ 1.自己写一个类继承 ...
- Android SQLite总结(一) (转)
Android SQLite总结(一) 郑海波 2012-08-21 转载请声明:http://blog.csdn.net/nuptboyzhb/article/details/7891887 前言 ...
- 基于Android 平台简易即时通讯的研究与设计[转]
摘要:论文简单介绍Android 平台的特性,主要阐述了基于Android 平台简易即时通讯(IM)的作用和功能以及实现方法.(复杂的通讯如引入视频音频等可以考虑AnyChat SDK~)关键词:An ...
- Android SQLite 数据库 增删改查操作
Android SQLite 数据库 增删改查操作 转载▼ 一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库--SQLite,SQLite3支持NU ...
- Android SQLite总结[转载]
[转载] :http://blog.163.com/zqy216_2008/blog/static/4119371820119954812509/ 最近在做的项目涉及到了SQLite,大学时没有好好学 ...
- Android开发简易教程
Android开发简易教程 Android 开发因为涉及到代码编辑.UI 布局.打包等工序,有一款好用的IDE非常重要.Google 最早提供了基于 Eclipse 的 ADT 作为开发工具,后来在2 ...
- [转] iOS开发者的Weex伪最佳实践指北
[From] http://www.cocoachina.com/ios/20170601/19404.html 引子 这篇文章是笔者近期关于Weex在iOS端的一些研究和实践心得,和大家一起分享分享 ...
随机推荐
- IDEA的热部署插件jrebel6.4.3离线安装版配置与破解
JRebel 介绍 IDEA上原生是不支持热部署的,一般更新了 Java 文件后要手动重启 Tomcat 服务器,才能生效,浪费不少生命啊.目前对于idea热部署最好的解决方案就是安装JRebel插件 ...
- MongoDB的Windows安装
一.下载MongoDB安装文件 下载地址:http://pan.baidu.com/s/1nvEuDD3 二.双击下载的文件,根据向导一直到finish.比如安装目录为 d:\mongodb 1.创建 ...
- Android - AIDL 使用
AIDL(Android Interface Definition Language) 程序员可以利用AIDL自定义编程接口,在客户端和服务端之间实现进程间通信(IPC).在Android平台上,一个 ...
- Sping之Ioc
Ioc,控制反转,依赖注入! 作用:降低代码之间的耦合性 代码永远是最好的示例: 1.新建test类 package demo; public class test { String string_v ...
- 完整版百度地图点击列表定位到对应位置并有交互动画效果demo
1.前言 将地图嵌入到项目中的需求很多,好吧,我一般都是用的百度地图.那么今天就主要写一个完整的demo.展示一个列表,点击列表的任一内容,在地图上定位到该位置,并有动画效果.来来来,直接上demo ...
- WAS 部署 Birt 报表出现 error.CannotStartupOSGIPlatform 和 更新web.xml
在WAS7.0中部署Birt报表会出现error.CannotStartupOSGIPlatform错误,通常需要这样修改 1.依次打开Applications->WebSphere enter ...
- Uva 122 树的层次遍历 Trees on the level lrj白书 p149
是否可以把树上结点的编号,然后把二叉树存储在数组中呢?很遗憾如果结点在一条链上,那将是2^256个结点 所以需要采用动态结构 首先要读取结点,建立二叉树addnode()+read_input()承担 ...
- html、js简单实现含中文csv文件下载(后端为django)
1.在django views.py中使用HttpResponse views.py首行加上utf-8编码,将默认unicode编码变为utf-8 # -*- coding:utf-8 -*- 下面 ...
- multiset与set
set的含义是集合,它是一个有序的容器,里面的元素都是排序好的,支持插入,删除,查找等操作,就 像一个集合一样.所有的操作的都是严格在logn时间之内完成,效率非常高. set和multiset的 ...
- css2--垂直对齐
## CSS2 vertical-align 垂直对齐 - baseline 默认值.基于基线对齐 - middle 位于同一行的非衬线字体小写字母的 1/2 处.不要为父 ...