在安卓开发中使用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数据库的基本操作:(最后有整个示例的源码)(希望能通过本 ...
随机推荐
- 通过js检测到iframe,使父窗口重定向到index -----------???----------------------
通过js检测到iframe,使父窗口重定向到index -----------???---------------------- 如果本身已将在iframe中,那么重定向的页面应该直接添加到父级ifr ...
- 用命令行(CMD)中启动和关闭ORACLE服务
lsnrctl start开启监听 lsnrctl stop停止监听 net start oracleserviceoracle开启oracle服务 net stop oracleserviceora ...
- 【九度OJ】题目1096-二分查找
题目1069:查找学生信息 这篇文章中提到的问题主要是由于调试平台Visual Studio和测试平台Online Judge的一些小差异,造成在Visual Studio中调试通过的代码,在输入OJ ...
- 【跟我一起学Python吧】python学习摘要
开始靖,怒推一篇文章:码农平时应该注意的办公室礼节 学习一门脚本语言是很有必要的,当我们在开发一些简单,快速程序时,脚本语言便有了用武之地,而且还很給力.根据python的介绍,python是一门很简 ...
- motan解读:添加spring 支持
代码位置: motan-core的目录下 motan中使用spring管理配置对象.motan利用Spring的spi机制创建了自定义标签和相应的标签处理代码.具体使用方法见这篇.本文以m ...
- android判断当前网络状态及跳转到设置界面
今天,想做这个跳转到网络设置界面, 刚开始用 intent = new Intent(Settings.ACTION_WIRELESS_SETTINGS); 不料老是出现settings.Wirele ...
- 自定义Camera综述(一般步骤、注意事项、遇到的难题<【内存溢出问题】>、像素参考)
一般步骤: 1. 检查和访问Camera:创建代码来检查Camera和所申请访问的存在性: 2. 创建一个预览类:继承SurfaceView来创建一个Camera的预览类,并实现SurfaceHold ...
- 单词计数WordCountApp.class
public class WordCountApp { // 可以指定目录,目录下如果有二级目录的话,是不会执行的,只会执行一级目录. private static final String INPU ...
- PyBayes的安装和使用
PyBayes 主页 文档 PyBayes is an object-oriented Python library for recursive Bayesian estimation (Bayesi ...
- SRM 509 DIV1 500pt(DP)
题目简述 给定一个字符串,可以对其进行修改,删除,增加操作,相应的操作有对应的花费,要求你用最小的花费把字符串变为回文串 题目做法 先搞一遍floyed把各种操作的最小花费求出来,然后就是类似编辑距离 ...