SQLite数据存储

Android 集成了 SQLite 数据库。它存储在 /data/data/< 项目文件夹 >/databases/ 下。Android 开发中使用 SQLite 数据库 Activites 可以通过 Content Provider 或者 Service 访问一个数据库。

Android数据库中主要涉及到的类有:SQLiteOpenHelper、SQLiteDatabase、Cursor、Context。

(01)SQLiteOpenHelper:它是 SQLiteDatabase的辅助类,主要功能是辅助管理数据库,如管理数据库的创建和版本。

(02)SQLiteDatabase:它是Android SQLite的核心类,包括的内容主要有,数据库表格的创建、删除,数据的添加、更新、删除,数据的查找等。

(03)Cursor:游标。当需要查找数据库的时候,会用到游标;通过Cursor可以对查找的结果进行方便的操作。

(04)Context:上下文环境。它提供了简单的打开/关闭数据库的接口。

也就是说,我们可以通过SQLiteOpenHelper或Context,来创建/打开数据;然后通过SQLiteDatabase的接口对数据库的值进行操作;需要对数据库进行查找时,便会用到Cursor。

下面分别对它们进行简单的介绍

1 SQLiteOpenHelper

它是SQLiteDatabase的辅助类,有两个功能:第一,用来管理SQLite数据库的创建和版本。第二,当创建/打开/升级数据库时,可以实现相应的回调函数响应一定的动作。

继承SQLiteOpenHelper的话,需要实现3个方法:

第一,构造函数。并要求在构造函数中调用父类的构造函数

第二,onCreate(SQLiteDatabase)。这是创建数据库的回调函数。

onUpgrade(SQLiteDatabase,int, int)。这是升级数据库的回调函数。

至于onOpen(SQLiteDatabase)方法,可以根据自己的意愿,选择是否覆盖。

1.1SQLiteOpenHelper构造函数

有如下两个构造函数

public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version)

public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler)第一个参数:Context类型,上下文对象。 第二个参数:String类型,数据库的名称 第三个参数:CursorFactory类型 第四个参数:int类型,数据库版本

第五个参数:DatabaseErrorHandler类型,数据库错误回调函数。

1.2 SQLiteOpenHelper常用API

1.3 SQLiteOpenHelper实例

HelloAndroid.java

package com.yarin.Android.HelloAndroid;

import android.app.Activity;
import android.content.Context;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.os.Bundle;
import android.widget.Button;
import android.util.Log; public class HelloAndroid extends Activity {
private static final String TAG = "skywang-->HelloAndroid";
private static final String DB_NAME = "skywang_SQLiteOpenHelper_db";
private static final int VERSION = 1; @Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); // 创建数据库
DatabaseHelper dbHelper = new DatabaseHelper(this, DB_NAME, null, VERSION); Log.d(TAG, "before call getReadableDatabase()"); // 只有调用了getWritableDatabase()方法或者getReadableDatabase()方法之后,才会创建或打开一个连接
// 即,才会调用onCreate()
SQLiteDatabase db = dbHelper.getReadableDatabase(); Log.d(TAG, "dabase name="+dbHelper.getDatabaseName());
dbHelper.close();
} // SQLiteOpenHelper是一个辅助类,用来管理数据库的创建和版本他
public class DatabaseHelper extends SQLiteOpenHelper { public DatabaseHelper(Context context, String name, CursorFactory factory,
int version) {
//必须通过super调用父类当中的构造函数
super(context, name, factory, version); Log.d(TAG, "call databaseHelper constructor");
} @Override
public void onCreate(SQLiteDatabase db) {
Log.d(TAG, "call database onCreate");
} @Override
public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
Log.d(TAG, "call database onUpgrade");
} @Override
public void onOpen(SQLiteDatabase db) {
Log.d(TAG, "call database onOpen");
}
}
}

打印结果如下:

D/skywang-->HelloAndroid(2712): call database onCreate

D/skywang-->HelloAndroid(2712): call database onOpen

D/skywang-->HelloAndroid(2712): dabase name=skywang_SQLiteOpenHelper_db

2 SQLiteDatabase

参考“3.2 Cursor实例

3Cursor

3.1 Cursor说明

3.2 Cursor实例

HelloAndroid.java

package com.yarin.Android.HelloAndroid;

importandroid.app.Activity;
importandroid.content.Context;
importandroid.content.ContentValues;
importandroid.database.Cursor;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.database.sqlite.SQLiteOpenHelper;
importandroid.database.sqlite.SQLiteDatabase.CursorFactory;
importandroid.os.Bundle;
importandroid.view.View;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.util.Log; public classHelloAndroid extends Activity {
private static final String TAG ="skywang-->HelloAndroid"; private static final String DB_NAME ="skywang_SQLiteOpenHelper_db";
private static final int VERSION_01 = 1;
private static final int VERSION_02 = 1; private static final String TABLE_NAME ="person";
private static final String ATTR_ID ="id";
private static final String ATTR_NAME ="name";
private DatabaseHelper dbHelper = null;
private SQLiteDatabase db = null;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.main); // 创建数据库
dbHelper = new DatabaseHelper(this,DB_NAME, null, VERSION_01); // 获取数据库对象
db = dbHelper.getWritableDatabase(); //创建表
//db.execSQL("CREATE TABLE IF NOTEXISTS person(id INTEGER PRIMARY KEY AUTOINCREMENT,name varchar(20))");
db.execSQL("CREATE TABLE IF NOTEXISTS "
+TABLE_NAME+" ( "
+ATTR_ID+" INTEGER PRIMARYKEY AUTOINCREMENT, "
+ATTR_NAME +"varchar(20))"); // 插入数据(方法一)
// INSERT INTO person (id, name) VALUES(20130225, 'anybody')
/*
db.execSQL("INSERT INTO "
+ TABLE_NAME +"("
+ ATTR_ID + ","
+ ATTR_NAME+ ") VALUES"
+ "(20130225,'anybody')");
//*/
db.execSQL("INSERT INTO "
+ TABLE_NAME + " VALUES"
+ "(20130225,'anybody')");
printDatabase() ; // 插入数据(方法二)
// 创建ContentValues对象
ContentValues values = new ContentValues();
values.put(ATTR_ID, 598435460);
values.put(ATTR_NAME,"skywang");
// 调用insert方法,就可以将数据插入到数据库当中
// 第一个参数:表名称
// 第二个参数:SQl不允许一个空列,如果ContentValues是空的,那么这一列被明确的指明为NULL值
// 第三个参数:ContentValues对象
db.insert(TABLE_NAME, null, values);
printDatabase() ; // 更新数据(方法一)
//UPDATE Person SET Address = 'Zhongshan23', City = 'Nanjing'
// WHERELastName = 'Wilson'
db.execSQL("UPDATE "
+ TABLE_NAME + " SET"
+ ATTR_NAME+ " = 'nobody'WHERE "
+ ATTR_ID + " =20130225");
printDatabase() ; // 更新数据(方法二)
// update()方法有四个参数,分别是表名,表示列名和值的 ContentValues 对象,可选的 WHERE 条件和可选的填充 WHERE 语句的字符串,这些字符串会替换 WHERE 条件中的“?”标记
values = new ContentValues();
String[] attStr = new String[]{"598435460"};
values.put(ATTR_NAME,"ghost_walker");
db.update(TABLE_NAME, values,ATTR_ID+"=?", attStr);
printDatabase() ; printNobody() ; // 删除数据(方法一)
// DELETE FROM person WHERE id =20130225
db.execSQL("DELETE FROM "
+TABLE_NAME + " WHERE "
+ ATTR_ID + " =20130225");
printDatabase() ; // 删除数据(方法二)
String[] args = newString[]{"598435460"};
db.delete(TABLE_NAME,ATTR_ID+"=?", args);
printDatabase() ; Log.d(TAG, " delete all things inthe table.");
// 删除表格内的全部数据
db.delete(TABLE_NAME,null,null);
//db.execSQL("DELETE * FROM "+TABLE_NAME);
printDatabase() ;
} @Override
public void onDestroy() {
super.onDestroy();
if (dbHelper != null)
dbHelper.close();
} // 打印出数据库的全部数据
private void printDatabase() {
// SELECT * FROM person
Cursor c = db.rawQuery("SELECT *FROM " + TABLE_NAME, null);
Log.d(TAG, "===printdatabase===");
while(c.moveToNext()) {
int index = c.getPosition();
int id =c.getInt(c.getColumnIndex(ATTR_ID));
String name =c.getString(c.getColumnIndex(ATTR_NAME)); Log.d(TAG,"line-"+index+" : "+"id="+id+",name="+name);
}
} // 查找name=nobody,并打印出结果
private void printNobody() {
// query方法一
// 说明:字符串需要用单引号(')括起来
// SELECT id, name FROM person WHEREname='nobody'
Cursor c = db.rawQuery("SELECT"
+ ATTR_ID + " , "
+ ATTR_NAME + " FROM "
+ TABLE_NAME + " WHERE "
+ ATTR_NAME + "='nobody'", null);
while(c.moveToNext()) {
int id =c.getInt(c.getColumnIndex(ATTR_ID));
String name =c.getString(c.getColumnIndex(ATTR_NAME));
Log.d(TAG, "Method-01-->thenobody has been found: id="+id+", name="+name);
} // query方法二
String[] columns=new String[]{ATTR_ID,ATTR_NAME};
String[] parms=newString[]{"nobody"};
c=db.query(TABLE_NAME, columns,ATTR_NAME+"=?",parms, null, null, null);
while(c.moveToNext()) {
int id =c.getInt(c.getColumnIndex(ATTR_ID));
String name = c.getString(c.getColumnIndex(ATTR_NAME));
Log.d(TAG, "Method-02-->thenobody has been found: id="+id+", name="+name);
}
} public class DatabaseHelper extendsSQLiteOpenHelper { public DatabaseHelper(Context context,String name, CursorFactory factory,
int version) {
//必须通过super调用父类当中的构造函数
super(context, name, factory,version);
Log.d(TAG, "call databaseHelperconstructor");
} @Override
public void onCreate(SQLiteDatabase db){
} @Override
public void onUpgrade(SQLiteDatabasearg0, int arg1, int arg2) {
}
} }

打印结果如下:

D/skywang-->HelloAndroid(2661): ===print database===

D/skywang-->HelloAndroid(2661): line-0 : id=20130225, name=anybody

D/skywang-->HelloAndroid(2661): ===print database===

D/skywang-->HelloAndroid(2661): line-0 : id=20130225, name=anybody

D/skywang-->HelloAndroid(2661): line-1 : id=598435460, name=skywang

D/skywang-->HelloAndroid(2661): ===print database===

D/skywang-->HelloAndroid(2661): line-0 : id=20130225, name=nobody

D/skywang-->HelloAndroid(2661): line-1 : id=598435460, name=skywang

D/skywang-->HelloAndroid(2661): ===print database===

D/skywang-->HelloAndroid(2661): line-0 : id=20130225, name=nobody

D/skywang-->HelloAndroid(2661): line-1 : id=598435460, name=ghost_walker

D/skywang-->HelloAndroid(2661): Method-01-->the nobody has been found: id=20130225, name=nobody

D/skywang-->HelloAndroid(2661): Method-02-->the nobody has been found: id=20130225, name=nobody

D/skywang-->HelloAndroid(2661): ===print database===

D/skywang-->HelloAndroid(2661): line-0 : id=598435460, name=ghost_walker

D/skywang-->HelloAndroid(2661): ===print database===

D/skywang-->HelloAndroid(2661):  delete all things in the table.

D/skywang-->HelloAndroid(2661): ===print database===

4Context

4.1Context自带的database接口

参考文献:

1, Android API文档

2,Android实现数据存储技术:http://www.cnblogs.com/hanyonglu/archive/2012/03/01/2374894.html

Android 数据存储03之SQLite的更多相关文章

  1. android 数据存储操作之SQLite

    一. SQLite介绍 SQLite是android内置的一个很小的关系型数据库. 二. SQLiteOpenHelper的使用方法 ①SQLiteOpenHelper是一个辅助类来管理数据库的创建和 ...

  2. Android数据存储之SQLite的操作

    Android作为一个应用在移动设备上的操作系统,自然也就少不了数据的存储.然而SQLite作为一个轻型的关系型数据库,基于其轻量.跨平台.多语言接口及安全性等诸多因数考虑,因而Android较大的数 ...

  3. Android数据存储:SQLite

    Android数据存储之SQLite SQLite:Android提供的一个标准的数据库,支持SQL语句.用来处理数据量较大的数据.△ SQLite特征:1.轻量性2.独立性3.隔离性4.跨平台性5. ...

  4. Android数据存储之SQLite数据库

    Android数据存储 之SQLite数据库简介 SQLite的相关知识,并结合Java实现对SQLite数据库的操作. SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎. ...

  5. 【Android开发日记】之入门篇(八)——Android数据存储(下)

    废话不多说了,紧接着来讲数据库的操作吧.Come On! 提到数据存储问题,数据库是不得不提的.数据库是用来存储关系型数据的不二利器.Android为开发者提供了强大的数据库支持,可以用来轻松地构造基 ...

  6. Android数据存储之SQLCipher数据库加密

    前言: 最近研究了Android Sqlite数据库(文章地址:Android数据存储之Sqlite的介绍及使用)以及ContentProvider程序间数据共享(Android探索之ContentP ...

  7. Android数据存储之GreenDao 3.0 详解

    前言: 今天一大早收到GreenDao 3.0 正式发布的消息,自从2014年接触GreenDao至今,项目中一直使用GreenDao框架处理数据库操作,本人使用数据库路线 Sqlite----> ...

  8. Android数据存储方式--SharedPreferences

    Android数据存储方式有如下四种:SharedPreferences.存储到文件.SQLite数据库.内容提供者(Content provider).存储到网络服务器. 本文主要介绍一下Share ...

  9. 10、Android数据存储

    课程目标: 掌握Android中数据存储的几种方式 熟练使用PreferenceActivity&PreferenceScreen做专业的Setting功能 熟练使用SQLite3来存储数据 ...

随机推荐

  1. urbuntu12.04 ftp服务器搭建

    1.安装ftp服务器: sudo apt-get install vsftpd 2..配置ftp 修改ftp的配置文件,该文件在/etc目录下,在终端中键入如下命令以打开配置文件: sudo vi / ...

  2. tenaorflow函数(1)

    TensorFlow 将图形定义转换成分布式执行的操作, 以充分利用可用的计算资源(如 CPU 或 GPU.一般你不需要显式指定使用 CPU 还是 GPU, TensorFlow 能自动检测.如果检测 ...

  3. 【LOJ】#2549. 「JSOI2018」战争

    题解 仔细分析了一下,如果写个凸包+每次暴力半平面交可以得到70分,正解有点懵啊 然后用到了一个非常结论,但是大概出题人觉得江苏神仙一个个都可以手证的结论吧.. Minkowski sum 两个凸包分 ...

  4. Java之路(五) 访问权限控制

    在Java中,所有事物都具有某种形式的访问权限控制. 访问权限的控制等级从最大到最小依次为:public,protected,包访问权限(无关键词)和private. public,protected ...

  5. shiro xml标准配置

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  6. 大数据技术之_14_Oozie学习_Oozie 的简介+Oozie 的功能模块介绍+Oozie 的部署+Oozie 的使用案列

    第1章 Oozie 的简介第2章 Oozie 的功能模块介绍2.1 模块2.2 常用节点第3章 Oozie 的部署3.1 部署 Hadoop(CDH版本的)3.1.1 解压缩 CDH 版本的 hado ...

  7. Android View事件分发-从源码分析

    View事件分发-从源码分析 学习自 <Android开发艺术探索> https://blog.csdn.net/qian520ao/article/details/78555397?lo ...

  8. Nessus漏洞扫描教程之使用Nmap工具扫描识别指纹

    Nessus漏洞扫描教程之使用Nmap工具扫描识别指纹 Nmap工具的准备工作 当用户对Nessus工具有清晰的认识后,即可使用该工具实施扫描.但是,在扫描之前需要做一些准备工作,如探测网络中活动的主 ...

  9. zookeeper 节点启动时的更新机制

    使用zk的应用节点和zk数据本身的同步,当系统启动时使用zk配置的信息和zk本身存储不一致, 此时应存在一个更新机制将应用配置数据和zk数据更新一致. 启动时更新拉取zk配置中心的更新本地数据,以zk ...

  10. BZOJ.2521.[SHOI2010]最小生成树(最小割ISAP/Dinic)

    题目链接 一条边不变其它边减少可以看做一条边增加其它边不变. 假设要加的边lab为(A->B,v),那么肯定是要使除这条边外,A->B的每条路径上的最小权值都\(>v\),这样在连通 ...