上篇博客提到过SQLite,它是嵌入式数据库,由于其轻巧但功能强大,被广泛的用于嵌入式设备当中。后来在智能手机、平板流行之后,它作为文件型数据库,几乎成为了智能设备单机数据库的必选,可以随着安卓app打包到apk文件当中。

SQLite的官方网站是http://www.sqlite.org/,可以任意下载,上面也有详尽的文档可以参考,这篇博客重点关注SQLite在Android开发中如何使用。

在Android开发中,推荐建立一个类继承自SQLiteOpenHelper来创建数据库操作类,比如:

public class DBHelper extends SQLiteOpenHelper {private static final String database = "test.db";private static final Integer version = 1;public DBHelper(Context context) {// 构造函数初始化各成员变量super(context, database, null, version);}@Overridepublic void onCreate(SQLiteDatabase db) {// 当通过SQLiteOpenHelper的子类获取数据库连接时,如果数据库不存在,则调用onCreate方法来创建数据库String sql = "create table Score(id integer primary key autoincrement,name varchar(20),point integer)";db.execSQL(sql);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// 当传入的实例的数据库版本号高于之前的版本号时,系统会自动调用onUpgrade方法更新数据库// 更新数据库的操作:备份数据库表数据,重新创建或修改表、约束等,然后将原来的数据导入到新建的表中。}
}

上面的代码有3点需要注意:

1、构造函数(方法)中指定了数据库的名称和版本号

它会默认的在data/data/包名/databases/目录下创建这个数据库,当然你也可以指定数据库文件存在的路径;版本号设置为1,如果你要想升级,可以在构造方法的参数中加上version,以便初始化。

2、onCreate是在数据库文件没有创建的时候执行,如果有了的话则不执行

3、onUpgrade是在新的指定版本号高于旧的指定版本号的时候执行,一般在数据库升级的时候需要操作

然后我们建一个具体的数据库操作类:

/*** 成绩操作类* * @author guwei* */
public class ScoreOp {// 插入一条成绩记录public long insert(SQLiteDatabase db, String name, Integer point) {try {db.beginTransaction();ContentValues values = new ContentValues();values.put("name", name);values.put("point", point);long result = db.insert("Score", null, values);if (result != -1) {db.setTransactionSuccessful();}return result;} finally {db.endTransaction();}}// 修改一条成绩记录public int update(SQLiteDatabase db, String name, Integer point) {try {db.beginTransaction();ContentValues values = new ContentValues();values.put("name", name);values.put("point", point);int result = db.update("Score", values, "name = ?",new String[] { name });db.setTransactionSuccessful();return result;} finally {db.endTransaction();}}// 删除一条成绩记录public long delete(SQLiteDatabase db, String name) {try {db.beginTransaction();int result = db.delete("Score", "name = ?", new String[] { name });db.setTransactionSuccessful();return result;} finally {db.endTransaction();}}// 查询根据name正向排序的前10条总分大于指定分数的人员信息public Cursor query(SQLiteDatabase db, Integer point) {return db.query("Score",new String[] { "name", "sum(point) as points" }, null, null,"name", "sum(point)>=" + point, "name asc", "0,10");}// 更灵活的查询,SQL任意拼接public Cursor query(SQLiteDatabase db, String sql, String[] selectionArgs) {return db.rawQuery(sql, selectionArgs);}
}

这上面封装了CRUD操作,而且都是带事务的(执行多条SQL时需要),值得关注的是最后的两个query方法。

第一个query是指定了一个复杂sql查询语句的情况。

按照顺序,参数的含义如下:

1)、table The table name to compile the query against.

指定的查询的表名

2)、columns A list of which columns to return. Passing null will return all columns, which is discouraged to prevent reading data from storage that isn't going to be used.

返回的查询列表的列名

3)、selection A filter declaring which rows to return, formatted as an SQL WHERE clause (excluding the WHERE itself). Passing null will return all rows for the given table.

where条件,不包括where关键字

4)、selectionArgs You may include ?s in selection, which will be replaced by the values from selectionArgs, in order that they appear in the selection. The values will be bound as Strings.

where条件指定的参数值

5)、groupBy A filter declaring how to group rows, formatted as an SQL GROUP BY clause (excluding the GROUP BY itself). Passing null will cause the rows to not be grouped.

group by分组后面跟着的列名

6)、having A filter declare which row groups to include in the cursor, if row grouping is being used, formatted as an SQL HAVING clause (excluding the HAVING itself). Passing null will cause all row groups to be included, and is required when row grouping is not being used.
having 后面紧跟着的在分组基础上进一步筛选的内容

7)、orderBy How to order the rows, formatted as an SQL ORDER BY clause (excluding the ORDER BY itself). Passing null will use the default sort order, which may be unordered.

order by后面根据某字段排序

8)、limit Limits the number of rows returned by the query, formatted as LIMIT clause. Passing null denotes no LIMIT clause.
limit关键字,分页查询时使用

实际上上面对应的这8个参数,就是对应如下SQL查询语句各关键字后面的内容,其原理就是通过指定参数拼接如下SQL语句。

这里顺便提一下,SQLite Expert是非常好用的管理SQLite数据库的工具,可以在http://www.sqliteexpert.com/下载到,也可以直接搜索下载相应破解版本。

回到第二个query方法,参数很简单,只有一个sql语句以及一个string数组(提供sql语句参数的值)。这个方法的意义就在于它很灵活,可以直接把能够执行的sql扔进去执行,而且是参数化的,是第一种查询方法很有力的补充。

好,最后我们就可以写测试代码来验证了。界面很简单,直接放置一个按钮即可。

public class SQLiteActivity extends Activity {  @Override  protected void onCreate(Bundle savedInstanceState) {  super.onCreate(savedInstanceState);  setContentView(R.layout.activity_sqlite);  Button btn = (Button) findViewById(R.id.btn);  btn.setOnClickListener(new View.OnClickListener() {  @Override  public void onClick(View v) {  DBHelper dbHelper = new DBHelper(SQLiteActivity.this);  //获得一个可写数据库操作对象  SQLiteDatabase wdb = dbHelper.getWritableDatabase();  //添加纪录  ScoreOp scoreOp = new ScoreOp();  scoreOp.insert(wdb, "zhang3", 98);  scoreOp.insert(wdb, "zhang3", 94);  scoreOp.insert(wdb, "li4", 92);  scoreOp.insert(wdb, "wang5", 89);  scoreOp.insert(wdb, "wang5", 82);  //修改记录  scoreOp.update(wdb, "li4", 90);  //删除记录  scoreOp.delete(wdb, "li4");  //获得一个可读数据库操作对象  SQLiteDatabase rdb = dbHelper.getReadableDatabase();  // 1.可以调用系统提供的query方法,以指定参数的形式返回Cursor对象  // Cursor cursor = scoreOp.query(rdb, 192);  // 2.可以直接执行SQL查询语句  Cursor cursor = scoreOp  .query(rdb,  "select name,sum(point) as points from Score group by name having sum(point)>=192 order by name asc limit ?,?",  new String[] { "0", "10" });  while (cursor.moveToNext()) {  String name = cursor.getString(cursor  .getColumnIndex("name"));  Integer points = cursor.getInt(cursor  .getColumnIndex("points"));  Toast.makeText(SQLiteActivity.this,  "姓名:" + name + ";总分:" + points, Toast.LENGTH_SHORT)  .show();  }  cursor.close();  }  });  }  }  

点击按钮执行之后就可以弹出符合条件的数据。如果不放心,可以切换到DDMS界面,选择File Explorer选项卡,找到路径下的我们创建的test.db文件,Pull(拉取)到电脑磁盘上,用SQLite Expert等工具打开验证。

Android数据库开发——SQLite相关推荐

  1. Android 数据库开发实战(简单易懂+DEMO)

    Android数据库开发实战 我们在Android开发中,如果需要本地持久化数据,可以采用SP.数据库.本地文件等方式.SP适合小数据的存取.数据库查询修改方面非常适合.文件存储适合大数据文件的操作. ...

  2. Android 数据库(SQLite)的导入导出命令

    在网上找了很多有关android数据库的导入导出,都找不到答案,今天问了同事才得知,分享给大家: android不管是真机还是模拟器都可执行一下导入导出操作: cmd打开命令窗口: 导入: adb p ...

  3. android 数据库索引,SQLite数据库提供警告自动索引(列)升级Android L后

    我已经升级了我的Nexus 7与Android 5.0 Lollipop,之前,我的应用程序运行良好与SQLite数据库,但现在每当我执行任何类型的查询,它给我log cat错误,如: 12-09 1 ...

  4. Android数据库 之 SQLite数据库

    一.关系型数据库SQLIte 每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的.与操作系统无关的SQL数据库-SQLite.SQLite第一个Alpha版本诞生于20 ...

  5. android数据库开发案例教程,Android Studio项目开发教程 第6章 数据库编程(30页)-原创力文档...

    ;目录;;;;;;6.3 SQLite数据库的操作;;;;表 6.1 Cursor类提供的常用方法;;;;;6.5购物商城的数据库编程;使用Activity类中的 getPreferences方法获取 ...

  6. Android Studio开发(四)SQLite数据库的DAO标准CRUD操作模拟微信通讯录

    Android Studio开发(四)SQLite数据库的DAO标准CRUD操作模拟微信通讯录 Android Studio开发(四)SQLite数据库的DAO标准CRUD操作模拟微信通讯录 一.任务 ...

  7. Android App开发基础篇—数据存储(SQLite数据库)

    Android App开发基础篇-数据存储(SQLite数据库) 前言:Android中提供了对SQLite数据库的支持.开发人员可以在应用中创建和操作自己的数据库来存储数据,并对数据进行操作. 一. ...

  8. Android开发 SQLite 通过.db文件导入已有数据库

    见过几次Android数据库操作,貌似都是在程序开始时建一个空数据库,然后进行操作. 那,如果想要用一个已有的数据库怎么办? 因为Android系统下的数据库是存放在/data/data/com.*. ...

  9. 安卓大作业:使用Android Studio开发天气预报APP(使用sqlite数据库)

    使用Android Studio开发天气预报APP 今天我来分享一下如何使用Android Studio开发一个天气预报APP.在文中,我们将使用第三方接口获取实时天气数据,并显示在APP界面上. 步 ...

最新文章

  1. java 8代码 改 java7_Window安装JDK7和JDK8,并一键切换
  2. 【深度学习入门到精通系列】留一交叉验证法Python实现(看不懂你来打我~!)
  3. 剑指offer之二叉搜索树的第K个节点
  4. lstm原文_LRCN: LSTM与CNN相结合模型
  5. PHP读取TXT中文乱码的解决方法
  6. 兼容性测试需要注意的测试点
  7. Linux添加虚拟网卡的多种方法
  8. 怎么清理ug10注册表_注册表清理优化工具用它就够了,赶紧上车!
  9. 2016考试计算机知识基础题库,2016考试计算机基础知识题库.pdf
  10. 十二属相配对与最佳配偶
  11. 生成图片带有随机码的验证码
  12. c语言程序编写字体,c语言程序设计练习题
  13. NEON 常用函数讲解
  14. Hadoop自动化安装脚本
  15. 二进制求和和x的平方根
  16. 三款html版女朋友表白告白代码,动态爱心表白代码,总有一款适合你,可定制表白内容
  17. 【附源码】计算机毕业设计SSM-小区停车场信息系统
  18. 商品规格表设计_超市商品配置表的管理
  19. 微信小程序好看的图文混排文章样式
  20. 计算机桌面上的声音图标没了怎么办,电脑桌面的声音图标不见了怎么办

热门文章

  1. 读写EEPROM_AT24CXXX
  2. 《Semantically Conditioned Dialog Response Generation via Hierarchical Disentangled Self-Attention》
  3. (Visual Navigation)深度图像转点云
  4. 给alias的命令传递自定义参数
  5. ES6 数组操作大全
  6. ios xib 四等分_iOS界面布局的核心以及TangramKit介绍
  7. java15转2进制_Java-Day02,进制转换
  8. 亲属卡额度是什么意思_5万中行,12万邮储,23.8万工行分期卡。
  9. Word文档怎么转换为PDF格式?介绍两种方式
  10. flexpaper java 例子_Flexpaper二次开发入门教程》(十) Flexpaper简单使用-第一个Flexpaper例子...