Android SQLite 简易指北

时间:2022-09-29 12:31:43

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

保存到数据库

Saving Data in SQL Databases

Android - SQLite Database Tutorial

Android SQLite 简易指北的更多相关文章

  1. &lbrack;Android Studio&rsqb; 2019年Android Studio配置指北

    Android Studio是我学习Android开发路上的第一块绊脚石,新建一个项目,一行代码没动,直接编译不起来,我太难了,所以本文叫指北 本文讲解在9102年如何在国内网络不通畅的情况下流畅的使 ...

  2. Android&plus;Sqlite 实现古诗阅读应用(二)

    传送门:Android+Sqlite 实现古诗阅读应用(一) Hi,又回来了,最近接到很多热情洋溢的小伙伴们的来信,吼开心哈,我会继续努力的=-=! 上回的东西我们做到了有个textview能随机选择 ...

  3. Android Sqlite 数据库版本更新

      Android Sqlite 数据库版本更新 http://87426628.blog.163.com/blog/static/6069361820131069485844/ 1.自己写一个类继承 ...

  4. Android SQLite总结&lpar;一&rpar; (转)

    Android SQLite总结(一)  郑海波 2012-08-21 转载请声明:http://blog.csdn.net/nuptboyzhb/article/details/7891887 前言 ...

  5. 基于Android 平台简易即时通讯的研究与设计&lbrack;转&rsqb;

    摘要:论文简单介绍Android 平台的特性,主要阐述了基于Android 平台简易即时通讯(IM)的作用和功能以及实现方法.(复杂的通讯如引入视频音频等可以考虑AnyChat SDK~)关键词:An ...

  6. Android SQLite 数据库 增删改查操作

    Android SQLite 数据库 增删改查操作 转载▼ 一.使用嵌入式关系型SQLite数据库存储数据 在Android平台上,集成了一个嵌入式关系型数据库--SQLite,SQLite3支持NU ...

  7. Android SQLite总结&lbrack;转载&rsqb;

    [转载] :http://blog.163.com/zqy216_2008/blog/static/4119371820119954812509/ 最近在做的项目涉及到了SQLite,大学时没有好好学 ...

  8. Android开发简易教程

    Android开发简易教程 Android 开发因为涉及到代码编辑.UI 布局.打包等工序,有一款好用的IDE非常重要.Google 最早提供了基于 Eclipse 的 ADT 作为开发工具,后来在2 ...

  9. &lbrack;转&rsqb; iOS开发者的Weex伪最佳实践指北

    [From] http://www.cocoachina.com/ios/20170601/19404.html 引子 这篇文章是笔者近期关于Weex在iOS端的一些研究和实践心得,和大家一起分享分享 ...

随机推荐

  1. 转移博客到xinqiyang&period;freeflare&period;com了&comma;这里会继续更新&period;

    hi.... 欢迎大家来到这里,这里将转移到github page搭建的博客 http://xinqiyang.freeflare.com 了,现在习惯于实用markdown来写东西了,这样可以脱离浏 ...

  2. poj 3250 Bad Hair Day【栈】

    Bad Hair Day Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15922   Accepted: 5374 Des ...

  3. 学习和理解C&num;的委托

    去年自学C#用的教程是入门级的<学通C#的24堂课>,教材里面也没有提到委托和事件,工作中也没怎么用到.后来一次在网上看了一些大牛的博客,读完之后感觉懵懵懂懂,似懂非懂,过了两三天之后,却 ...

  4. drop表,然后创建表,插入数据,并创建索引等内容。

    execute immediate 'drop table sjb_jhgl_ydjhtdsbb';   execute immediate 'create table dw_sc.sjb_jhgl_ ...

  5. Redhat

    vm1 port:192.168.210.102 user:root;pwd:123456 user:openflowpwd:openflowKkm09!q esx4.1 server 安装一.修改I ...

  6. java EE中的hello1&period;java及Annotation&lpar;注解&rpar;

    一.Annotation(注解) 注解(Annotation)很重要,未来的开发模式都需要注解,注解是java.lang.annotation包,Annotation是从java5引入的,它提供一些不 ...

  7. 【消息中间件之RabbitMQ学习】-开篇-001

    写在前面的话 项目中因为要用到消息中间件,当初极力推荐RabbitMq.但因为种种原因,最终选型为java+mongodb自实现一套分布式的消.没有用RabbitMq工作过,实属遗憾.因为个人来说实在 ...

  8. 【BZOJ2425】&lbrack;HAOI2010&rsqb;计数(组合数学)

    [BZOJ2425][HAOI2010]计数(组合数学) 题面 BZOJ 洛谷 题解 很容易的一道题目. 统计一下每个数位出现的次数,然后从前往后依次枚举每一位,表示前面都已经卡在了范围内,从这一位开 ...

  9. POJ 1459&amp&semi;&amp&semi;3436

    两道比较基础的网络流题目,重点就是建图. 1458:题意就是给你一些东西它们的数据,其中一些是发电站,还有一些是用户的家里,其中还有一些是中转站.让你求最大的输送电量. 就是一道很基础的最大流题目,建 ...

  10. python学习一月总结&lowbar;汇总大牛们的思想&lowbar;值得收藏

    ''' 下面是我汇总的我学习一个月python(version:3.3.2)的所有笔记 你可以访问:http://www.python.org获取更多信息 你也可以访问:http://www.cnbl ...