Android数据存储之SQLite

SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,占用资源非常少,只有几百KB内存。支持Windows/Linux/Unix等等主流的操作系统,同时能够跟其他程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite是当前使用最广泛的数据库,基于以上优点,Android系统采用SQLite数据库。

SQLiteOpenHelper介绍

 Android应用程序为了对数据库进行管理,提供了一个抽象类SQLiteOpenHelper,SQLiteOpenHelper类提供了两个重要的方法,分别是 onCreate()和 onUpgrade(),onCreate用于初次使用软件时生成数据库表,onUpgrade用于升级软件时更新数据库表结构。

  当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法。onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。

onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的。

  假设现在的版本是1,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2,并且在onUpgrade()方法里面实现表结构的更新。当软件的版本升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后做出相应的表结构及数据更新。

Demo的实现

先来看一个页面:

布局就不用写了,就是四个按钮,实现的目的就是在生成Person数据库,同时生成一个表,然后操作Person中的数据:

首先需要重写一下抽象类SQLiteOpenHelper中的方法

public class MySQLDBHelper extends SQLiteOpenHelper {

	private static final String DBname="Person.db";
	private static	final int version=1;
	private String tag="MySQLDBHelper";

	public MySQLDBHelper(Context context) {
		super(context, DBname, null, version);
		Log.i(tag, "测试");
	}

	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		Log.i(tag, "Person数据库中Person创建前");
		String sqlString="create table Person (id integer primary key autoincrement,Name nvarchar(200),Address nvarchar(200))";
		db.execSQL(sqlString);
		Log.i(tag, "Person数据库中Person创建成功");
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
		Log.i(tag, "更新数据库,暂时不需要使用");
	}

}

构造函数中的数据库名称和版本号都是自己可以固定一下,测试就没有传那么多参数,,多说一下这个@Override:

@Override是伪代码,表示重写(当然不写也可以),不过写上有两点好处: 
1、可以当注释用,方便阅读;
2、编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错。例如,你如果没写@Override,而你下面的方法名写错了,这时你的编译器是可以编译通过的,因为编译器以为这个方法是你的子类中自己增加的方法。

插入数据调用,这里获取SQLiteDatabase,让后把拼接好的sql直接传入执行就OK了:

public void insert(View view) {
		SQLiteDatabase database = dbhelper.getWritableDatabase();
		String sql = "insert into Person values(NULL,?,?)";
		database.execSQL(sql, new Object[] { "FlyElephant", "北京" });
		Log.i(tag, "插入成功");
	}

更新数据,这里注意一下ContentValues的使用,键值对的顺序:

	public void update(View view) {
		SQLiteDatabase database = dbhelper.getWritableDatabase();
		ContentValues contentValues = new ContentValues();
		contentValues.put("Address", "深圳");
		database.update("Person", contentValues, "Name=?",
				new String[] { "FlyElephant" });
		Log.i(tag, "更新成功");
	}

查询数据,这里用到了游标,类似于C#中SqlDataReader的使用,moveToNext可以满足基本需求:

	public void query(View view) {
		SQLiteDatabase database = dbhelper.getReadableDatabase();
		Cursor cursor = database.rawQuery("select * from Person", null);
		if (cursor.getCount()>0) {
			while (cursor.moveToNext()) {
				String nameString = cursor.getString(cursor.getColumnIndex("Name"));
				String addreString = cursor.getString(cursor
						.getColumnIndex("Address"));
				Log.i(tag, "Name:" + nameString + "--Address:" + addreString);
			}
		}else {
			Log.i(tag, "没有数据");
		}
		cursor.close();
	}

如果你觉得moveToNext()不能满足需求,我就从网上找了一下别人贴的代码,如下:

c.move(int offset);	//以当前位置为参考,移动到指定行
c.moveToFirst();	//移动到第一行
c.moveToLast();		//移动到最后一行
c.moveToPosition(int position);	//移动到指定行
c.moveToPrevious();	//移动到前一行
c.moveToNext();		//移动到下一行
c.isFirst();		//是否指向第一条
c.isLast();		//是否指向最后一条
c.isBeforeFirst();	//是否指向第一条之前
c.isAfterLast();	//是否指向最后一条之后
c.isNull(int columnIndex);	//指定列是否为空(列基数为0)
c.isClosed();		//游标是否已关闭
c.getCount();		//总数据项数
c.getPosition();	//返回当前游标所指向的行数
c.getColumnIndex(String columnName);//返回某列名对应的列索引值
c.getString(int columnIndex);	//返回当前行指定列的值

删除数据:

	public void delete(View v) {
		SQLiteDatabase database = dbhelper.getReadableDatabase();
		database.delete("Person", "Name=?", new String[] { "FlyElephant" });
		Log.i(tag, "删除成功");
	}

 可以看下结果:

周末又过完了,希望大家明天上班都精精神神的,开开心心的,醉在周末~

时间: 2024-10-14 06:19:23

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

Android数据存储之SQLite的操作

Android作为一个应用在移动设备上的操作系统,自然也就少不了数据的存储.然而SQLite作为一个轻型的关系型数据库,基于其轻量.跨平台.多语言接口及安全性等诸多因数考虑,因而Android较大的数据存储采用了SQLite.SQLite与大多数关系型数据库一样都遵循ACID,语法也非常相似.只要您懂得mysql.sqlserver等关系型数据库的操作,只要查看下SQLite的官方文档便可快速上手.SQLite语法您可通过http://sqlite.org/lang.html进行查看. 接下来看

【转载】Android数据存储之SQLite

SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎.它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行. 在Android中创建的SQLite数据库存储在:/data/data/<包名>/databases/目录下. 主要特点: -轻量级 -独立性,没有不依赖,无需安装 -跨平台,支持众多操作系统 -支持高达2TB大小的数据库 -每个数据库以单个文件的形式存在 -以B-Tree的数据结构形式存储在硬盘 SQLite的数据类型: SQLite支持NULL.

Android数据存储之SQLite使用

SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎.它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行. 在Android中创建的SQLite数据库存储在:/data/data/<包名>/databases/目录下. 主要特点: -轻量级 -独立性,没有不依赖,无需安装 -跨平台,支持众多操作系统 -支持高达2TB大小的数据库 -每个数据库以单个文件的形式存在 -以B-Tree的数据结构形式存储在硬盘 SQLite的数据类型: SQLite支持NULL.

android数据存储之Sqlite(二)

SQLite学习笔记 前言:上一章我们介绍了sqlite的一些基本知识以及在dos命令下对sqlite进行的增删改查的操作,这一章我们将在android项目中实际来操作sqlite. 1. SQLiteDatabase的介绍 Android提供了创建和是用SQLite数据库的API.SQLiteDatabase代表一个数据库对象,提供了操作数据库的一些方法.在 Android的SDK目录下有sqlite3工具,我们可以利用它创建数据库.创建表和执行一些SQL语句.下面是SQLiteDatabas

Android数据存储之SQLite数据库

SQLite是一个小巧的嵌入式数据库,使用方便.开发简单,手机上最早由IOS运用,后来Android也采用了SQLite. SQLite的多数SQL语法与Oracle 一样,下面只列出不同的地方: (1)建表时为避免重复操作,应加上IF NOT EXISTS关键词,例如CREATE TABLE IF NOT EXISTS table_name (2)删表时为避免重复操作,应加上IF EXISTS关键词,例如DROP TABLE IF EXISTS table_name (3)添加新列时使用ALT

android数据存储之Sqlite(一)

SQLite学习笔记 1. Sqlite简介 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入 式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了.它能够支持 Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如Tcl.PHP.Java.C++..Net等,还有 ODBC接口,同样比起 Mysql.PostgreSQL这两款开源世界著名的数据库管理系统来讲,它

Android数据存储之Sqlite采用SQLCipher数据库加密实战

前言: 最近研究了Android Sqlite数据库(文章地址:http://www.cnblogs.com/whoislcj/p/5506294.html)以及ContentProvider程序间数据共享(http://www.cnblogs.com/whoislcj/p/5507928.html),我们清晰的知道Sqlite数据库默认存放位置data/data/pakage/database目录下,对于已经ROOT的手机来说的没有任何安全性可以,一旦被利用将会导致数据库数据的泄漏,所以我们该

android 数据存储之SQLite

使用嵌入式关系型SQLite数据库存储数据 除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据. 在Android平台上,集成了一个嵌入式关系型数据库—SQLite, 1.SQLite3支持 NULL.INTEGER.REAL(浮点数字).TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型虽然只有五种,但实际上sqlite3也接受varchar(n).char(n).decimal(p,s) 等数据类型,只不过在运算或保存

Android数据存储引擎---SQLite数据库

目标:是否可以在PC端桌面上使用SQLite数据库制作一个财务文件? 目录: 来源: 实践: 总结和比较: SQLite数据简介 是什么,内部结构是怎样的,数据库和表的关系是什么 有什么用 常用的操作是什么 SQLite数据库使用 增 删 改 查 SQLite数据库实践上的优化措施 对于Android平台来说,系统内置了丰富的API来供开发人员操作SQLite,使我们轻松完成对数据的存取. 步骤1,熟悉创建数据库表,熟悉相关的操作指令,实现对SQLite数据库的感性认识 创建一个包含简单内容的数

Android数据存储之SQLite 数据库学习

Android提供了五种存取数据的方式 (1)SharedPreference,存放较少的五种类型的数据,只能在同一个包内使用,生成XML的格式存放在设备中 (2) SQLite数据库,存放各种数据,是一个轻量级的嵌入式数据库 (3) File文件,通过读取写入方式生成文件存放数据 (4) ContentProvider,主要用于让其他应用程序使用保存的数据 (5)通过网络获取数据和写入数据到网络存储空间 SQLite 数据库介绍 SQLite 是一款轻量级的关系型数据库,它的运算速度非常快,占