在安卓开发中使用SQLite数据库操作实例
前段时间写了个安卓平台下SQLite数据库操作的实例 ,一直没得时间总结 ,今天把它弄出来了。
在Android 运行时环境包含了完整的 SQLite。
首先介绍一下SQLite这个数据库:
SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源世界著名的数据库管理系统来讲,它的处理速度比他们都快。
有一点相对其他数据库来说比较特殊的是:SQLite是无类型的. 这意味着你可以保存任何类型的数据到你所想要保存的任何表的任何列中,意思就是说话你可以在创建数据库表的时候任意定义数据类型,却不影响实际使用时的数据存储。
举个例子说就是你可以在创建表时定义username字段为varchar类型,但是实时使用时你可以向这个字段存入1、2.5、2012-6-6.。。这样的整型,单精,以及时间等其他类型,在SQLite里没有这种限制。
但是有一种情况例外:当字段类型为 ”Integer Primary Key” 时,就是定义表主键,这个就只能是integer类型。和普通数据库相同 。
SQLite 不支持一些标准的 SQL 功能,特别是外键约束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 还有一些 ALTER TABLE 功能。
需要注意一点: SQLite不支持存储过程!
我这里就简单介绍,如需要可自行去了解关于SQLite的更多知识,
然后是我的Demo(一个简单的完成数据库增删查改操作):
首先是项目目录结构:

在本项目中我们使用JUnit测试,就要在AndroidManifest.xml配置JUnit
AndroidManifest.xml
- <manifest xmlns:android="http://schemas.android.com/apk/res/android"
- package="org.yzsoft.sqlitedemo.test"
- android:versionCode="1"
- android:versionName="1.0" >
- <!-- 为了方便测试,我直接把上面包位置改成我项目的测试包下 -->
- <uses-sdk
- android:minSdkVersion="8"
- android:targetSdkVersion="15" />
- <application
- android:icon="@drawable/ic_launcher"
- android:label="@string/app_name"
- android:theme="@style/AppTheme" >
- <!--
- 因为我们开发项目的时候,包会比较多,所以最好在下面这个activity的配置( android:name="org.yzsoft.sqlitedemo.activity.MainActivity" )这句这里打上完整的 包名.类名
- ,虽然可以直接用 .类名,但是这个.类名是建立在
- <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="org.yzsoft.sqlitedemo.test"
- 之上的,用package+.类名也刚好可以组合成完整路径。但是我们保险一点写完整去。
- -->
- <activity
- android:name="org.yzsoft.sqlitedemo.activity.MainActivity"
- android:label="@string/title_activity_main" >
- <intent-filter>
- <action android:name="android.intent.action.MAIN" />
- <category android:name="android.intent.category.LAUNCHER" />
- </intent-filter>
- </activity>
- <!-- JUnit要加这句 -->
- <uses-library android:name="android.test.runner" />
- </application>
- <!-- JUnit还要加这段 (android:targetPackage测试类所在包名 ) -->
- <instrumentation
- android:name="android.test.InstrumentationTestRunner"
- android:label="Test Unit Tests"
- android:targetPackage="org.yzsoft.sqlitedemo.test" >
- </instrumentation>
- </manifest>
1、MainActivity.java(因为本项目中使用JUnit进行测试,就不需要Activity了,留着不用写它)
- package org.yzsoft.sqlitedemo.activity;
- import org.yzsoft.sqlitedemo.util.R;
- import org.yzsoft.sqlitedemo.util.R.layout;
- import org.yzsoft.sqlitedemo.util.R.menu;
- import android.os.Bundle;
- import android.app.Activity;
- import android.view.Menu;
- public class MainActivity extends Activity {
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- }
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.activity_main, menu);
- return true;
- }
- }
2、DBOpenHandler.java
- package org.yzsoft.sqlitedemo.util;
- import android.content.Context;
- import android.database.sqlite.SQLiteDatabase;
- import android.database.sqlite.SQLiteDatabase.CursorFactory;
- import android.database.sqlite.SQLiteOpenHelper;
- public class DBOpenHandler extends SQLiteOpenHelper {
- /**
- *
- * @param context
- * 上下文
- * @param name
- * 数据库名
- * @param factory
- * 可选的数据库游标工厂类,当查询(query)被提交时,该对象会被调用来实例化一个游标。默认为null。
- * @param version
- * 数据库版本号
- */
- public DBOpenHandler(Context context, String name, CursorFactory factory, int version) {
- super(context, name, factory, version);
- }
- @Override
- public void onCreate(SQLiteDatabase db) {// 覆写onCreate方法,当数据库创建时就用SQL命令创建一个表
- // 创建一个t_users表,id主键,自动增长,字符类型的username和pass;
- db.execSQL("create table t_users(id integer primary key autoincrement,username varchar(200),pass varchar(200) )");
- }
- @Override
- public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
- // TODO Auto-generated method stub
- }
- }
3、TUsers.java(实体类,习惯了WEB开发,总会加个实体类,方便)
- package org.yzsoft.sqlitedemo.vo;
- public class TUsers {
- private int id ;
- private String username;
- private String pass;
- public int getId() {
- return id;
- }
- public void setId(int id) {
- this.id = id;
- }
- public String getUsername() {
- return username;
- }
- public void setUsername(String username) {
- this.username = username;
- }
- public String getPass() {
- return pass;
- }
- public void setPass(String pass) {
- this.pass = pass;
- }
- }
4、SQLiteDAOImpl.java(数据库操作实现类)
- package org.yzsoft.sqlitedemo.util;
- import java.util.ArrayList;
- import java.util.List;
- import org.yzsoft.sqlitedemo.vo.TUsers;
- import android.content.Context;
- import android.database.Cursor;
- import android.database.sqlite.SQLiteDatabase;
- public class SQLiteDAOImpl {
- private DBOpenHandler dbOpenHandler;
- public SQLiteDAOImpl(Context context) {
- this.dbOpenHandler = new DBOpenHandler(context, "dbtest.db", null, 1);
- }
- public void save(TUsers tusers) {// 插入记录
- SQLiteDatabase db = dbOpenHandler.getWritableDatabase();// 取得数据库操作
- db.execSQL("insert into t_users (username,pass) values(?,?)", new Object[] { tusers.getUsername(), tusers.getPass() });
- db.close();// 记得关闭数据库操作
- }
- public void delete(Integer id) {// 删除纪录
- SQLiteDatabase db = dbOpenHandler.getWritableDatabase();
- db.execSQL("delete from t_users where id=?", new Object[] { id.toString() });
- db.close();
- }
- public void update(TUsers tusers) {// 修改纪录
- SQLiteDatabase db = dbOpenHandler.getWritableDatabase();
- db.execSQL("update t_users set username=?,pass=? where" + " id=?", new Object[] { tusers.getUsername(), tusers.getPass(), tusers.getId() });
- db.close();
- }
- public TUsers find(Integer id) {// 根据ID查找纪录
- TUsers tusers = null;
- SQLiteDatabase db = dbOpenHandler.getReadableDatabase();
- // 用游标Cursor接收从数据库检索到的数据
- Cursor cursor = db.rawQuery("select * from t_users where id=?", new String[] { id.toString() });
- if (cursor.moveToFirst()) {// 依次取出数据
- tusers = new TUsers();
- tusers.setId(cursor.getInt(cursor.getColumnIndex("id")));
- tusers.setUsername(cursor.getString(cursor.getColumnIndex("username")));
- tusers.setPass(cursor.getString(cursor.getColumnIndex("pass")));
- }
- db.close();
- return tusers;
- }
- public List<TUsers> findAll() {// 查询所有记录
- List<TUsers> lists = new ArrayList<TUsers>();
- TUsers tusers = null;
- SQLiteDatabase db = dbOpenHandler.getReadableDatabase();
- // Cursor cursor=db.rawQuery("select * from t_users limit ?,?", new
- // String[]{offset.toString(),maxLength.toString()});
- // //这里支持类型MYSQL的limit分页操作
- Cursor cursor = db.rawQuery("select * from t_users ", null);
- while (cursor.moveToNext()) {
- tusers = new TUsers();
- tusers.setId(cursor.getInt(cursor.getColumnIndex("id")));
- tusers.setUsername(cursor.getString(cursor.getColumnIndex("username")));
- tusers.setPass(cursor.getString(cursor.getColumnIndex("pass")));
- lists.add(tusers);
- }
- db.close();
- return lists;
- }
- public long getCount() {//统计所有记录数
- SQLiteDatabase db = dbOpenHandler.getReadableDatabase();
- Cursor cursor = db.rawQuery("select count(*) from t_users ", null);
- cursor.moveToFirst();
- db.close();
- return cursor.getLong(0);
- }
- }
5、TUsersTest.java(JUnit测试类)
- package org.yzsoft.sqlitedemo.test;
- import java.util.List;
- import org.yzsoft.sqlitedemo.util.DBOpenHandler;
- import org.yzsoft.sqlitedemo.util.SQLiteDAOImpl;
- import org.yzsoft.sqlitedemo.vo.TUsers;
- import android.test.AndroidTestCase;
- import android.util.Log;
- public class TUsersTest extends AndroidTestCase {
- private static final String TAG = "这个是测试类";// 准备好TAG标识用于LOG输出,方便我们用LogCat进行调试
- public void testCreate() {
- DBOpenHandler dbHandler = new DBOpenHandler(this.getContext(), "dbtest.db", null, 1);// 创建数据库文件
- dbHandler.getWritableDatabase();
- }
- public void testSave() throws Throwable {
- SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());
- TUsers tuser = new TUsers();
- tuser.setUsername("用户");
- tuser.setPass("密码");
- p.save(tuser);
- Log.i(TAG, "插入成功");// 用日志记录一个我们自定义的输出。可以在LogCat窗口中查看,方便调试
- }
- public void testUpate() throws Throwable {
- SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());
- TUsers tuser = p.find(1);
- tuser.setUsername("张三");
- p.update(tuser);
- Log.i(TAG, "修改成功");
- }
- public void testDelete() throws Throwable {
- SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());
- p.delete(2);
- Log.i(TAG, "删除成功");
- }
- public void testFind() throws Throwable {
- SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());
- TUsers tuser = p.find(1);
- Log.i(TAG, tuser.getUsername() + " 用户名");
- }
- public void testGetCount() throws Throwable {
- SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());
- Log.i(TAG, p.getCount() + " 总记录数");
- }
- public void testFindAll() throws Throwable {
- SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());
- List<TUsers> tusers = p.findAll();
- for (TUsers tuser : tusers) {
- Log.i(TAG, tuser.getUsername() + " 用户名");
- }
- }
- }
然后是测试中的一些截图:






最后我们把File Exploer中data/data/项目包名/databases/dbtest.db 导出来,用Navicat Premium等数据库管理工具查看里面的数据:

导出来看看:

虽然安卓平台中SQLite是个小型的本地数据库,但是有些地方使用起来会比文件存储更方便,本文只是对它作一个简单的操作实例 ,有这方面兴趣的童鞋可以自己去深入研究。也希望大家能多交流交流~~~~
最最后~附上项目源码:
- SQLiteDemo.rar (675.4 KB)
在安卓开发中使用SQLite数据库操作实例的更多相关文章
- 在Android 开发中使用 SQLite 数据库笔记
SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PH ...
- 安卓 SQLite数据库操作实例
前段时间写了个安卓平台下SQLite数据库操作的实例 ,一直没得时间总结 ,今天把它弄出来了. 在Android 运行时环境包含了完整的 SQLite. 首先介绍一下SQLite这个数据库: SQLi ...
- Android 开发中使用 SQLite 数据库
SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能. 此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PHP ...
- 我的Android六章:Android中SQLite数据库操作
今天学习的内容是Android中的SQLite数据库操作,在讲解这个内容之前小编在前面有一篇博客也是讲解了SQLite数据库的操作,而那篇博客的讲解是讲述了 如何在Window中通过DOM来操作数据库 ...
- UWP开发随笔——使用SQLite数据库
摘要 大多数的app都需要数据存储,在数据存储这方面,强大的windows把app数据分为两种:settings和files,并提供了十分简洁的api,让开发者能够轻松使用.但是在有些场景下,app的 ...
- android开发之使用SQLite数据库存储
http://blog.csdn.net/jason0539/article/details/16360835 SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且 ...
- 在 Android 应用程序中使用 SQLite 数据库以及怎么用
part one : android SQLite 简单介绍 SQLite 介绍 SQLite 一个非常流行的嵌入式数据库.它支持 SQL 语言,而且仅仅利用非常少的内存就有非常好的性能.此外它还是开 ...
- 安卓SQLite数据库操作(下)
在安卓开发中,数据库的操作无非就是增删改查.那么,这里我们通过例子来学习这四个操作. 我们先看代码吧.具体讲解后面说. 布局文件 activity_main.xml <LinearLayout ...
- windows phone 8.1开发SQlite数据库操作详解
原文出自:http://www.bcmeng.com/windows-phone-sqlite1/ 本文小梦将和大家分享WP8.1中SQlite数据库的基本操作:(最后有整个示例的源码)(希望能通过本 ...
随机推荐
- Dropping water balloons
题意: 给你k个水球n层楼(n很大) 现在做实验在楼上向下丢水球,若水球没破可以重新丢,求把所有水球弄破的最小试验次数. 分析: 开始完全没思路啊.从正面求没法做不会表示状态,做实验是只能从第一层,一 ...
- zoj3822-Domination (概率dp)
题意: 给你n*m的棋盘,每天选择的一个空的方格放一个棋子,求使棋盘的每行每列都至少有一个棋子的天数期望. 分析: 先想状态,要使每行每列都至少一个,考虑前i行j列,能放得就是i行j列里面的或第i+1 ...
- 《Python基础教程(第二版)》学习笔记 -> 第八章 异常
什么是异常 Python用 异常对象(exception object)来表示异常情况.遇到错误后,会引发异常,如果异常对象并未被处理或者捕捉,程序就会用所谓的回溯(Traceback,一种错误信息) ...
- java ant 命令大全
ANT命令总结 1 Ant是什么? Apache Ant 是一个基于 Java的生成工具.生成工具在软件开发中用来将源代码和其他输入文件转换为可执行文件的形式(也有可能转换为可安装的产品映像形式).随 ...
- QT5.3+VS2013+QCustomPlot+QwtPlot+QwtPlot3D使用环境配置
VS安装QT后运行环境所需配置 安装好QT和QT在VS下的插件之后: 1.打开VS,找到QT5→QT Option,如下: 2.配置电脑环境变量,在系统变量→Path下增加QT的动态库所在文件夹,也就 ...
- 2.1……Android中的单位简介
引用自Google API Guides Dimension A dimension value defined in XML. A dimension is specified with a num ...
- apache环境下配置服务器支持https
SSL加密的意义在于保护服务器到客户端的信息或者是客户端到服务器的信息不被监听和篡改. 现在一些主流的网站都已经是通过 https访问了,搜索引擎对此类网站的收录也不存在问题了. 具体的配置流程大概是 ...
- wuzhicms水印的设置
- 瞬间从IT屌丝变大神——注释规则
注释的主要规则如下: 公共组件和各栏目的维护者都需要在文件头部加上注释说明: /** *文件用途说明 *作者姓名 *联系方式*制作日期 **/ 大的模块注释方法: //======= //代码用途 / ...
- java集合框架复习(一)
数组类Array是java中最基本的一个存储结构,它用于存储 一组连续的对象或一组类型相同的基本类型的数据. Array特点:效率高,但容量固定且无法动态改变, 缺点:无法判断其中存有多少元素,len ...