前段时间写了个安卓平台下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

  1. <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  2. package="org.yzsoft.sqlitedemo.test"
  3. android:versionCode="1"
  4. android:versionName="1.0" >
  5. <!-- 为了方便测试,我直接把上面包位置改成我项目的测试包下 -->
  6. <uses-sdk
  7. android:minSdkVersion="8"
  8. android:targetSdkVersion="15" />
  9. <application
  10. android:icon="@drawable/ic_launcher"
  11. android:label="@string/app_name"
  12. android:theme="@style/AppTheme" >
  13. <!--
  14. 因为我们开发项目的时候,包会比较多,所以最好在下面这个activity的配置(  android:name="org.yzsoft.sqlitedemo.activity.MainActivity" )这句这里打上完整的    包名.类名
  15. ,虽然可以直接用  .类名,但是这个.类名是建立在
  16. <manifest xmlns:android="http://schemas.android.com/apk/res/android"     package="org.yzsoft.sqlitedemo.test"
  17. 之上的,用package+.类名也刚好可以组合成完整路径。但是我们保险一点写完整去。
  18. -->
  19. <activity
  20. android:name="org.yzsoft.sqlitedemo.activity.MainActivity"
  21. android:label="@string/title_activity_main" >
  22. <intent-filter>
  23. <action android:name="android.intent.action.MAIN" />
  24. <category android:name="android.intent.category.LAUNCHER" />
  25. </intent-filter>
  26. </activity>
  27. <!-- JUnit要加这句 -->
  28. <uses-library android:name="android.test.runner" />
  29. </application>
  30. <!-- JUnit还要加这段 (android:targetPackage测试类所在包名 ) -->
  31. <instrumentation
  32. android:name="android.test.InstrumentationTestRunner"
  33. android:label="Test Unit Tests"
  34. android:targetPackage="org.yzsoft.sqlitedemo.test" >
  35. </instrumentation>
  36. </manifest>

1、MainActivity.java(因为本项目中使用JUnit进行测试,就不需要Activity了,留着不用写它)

  1. package org.yzsoft.sqlitedemo.activity;
  2. import org.yzsoft.sqlitedemo.util.R;
  3. import org.yzsoft.sqlitedemo.util.R.layout;
  4. import org.yzsoft.sqlitedemo.util.R.menu;
  5. import android.os.Bundle;
  6. import android.app.Activity;
  7. import android.view.Menu;
  8. public class MainActivity extends Activity {
  9. @Override
  10. public void onCreate(Bundle savedInstanceState) {
  11. super.onCreate(savedInstanceState);
  12. setContentView(R.layout.activity_main);
  13. }
  14. @Override
  15. public boolean onCreateOptionsMenu(Menu menu) {
  16. getMenuInflater().inflate(R.menu.activity_main, menu);
  17. return true;
  18. }
  19. }

2、DBOpenHandler.java

  1. package org.yzsoft.sqlitedemo.util;
  2. import android.content.Context;
  3. import android.database.sqlite.SQLiteDatabase;
  4. import android.database.sqlite.SQLiteDatabase.CursorFactory;
  5. import android.database.sqlite.SQLiteOpenHelper;
  6. public class DBOpenHandler extends SQLiteOpenHelper {
  7. /**
  8. *
  9. * @param context
  10. *            上下文
  11. * @param name
  12. *            数据库名
  13. * @param factory
  14. *            可选的数据库游标工厂类,当查询(query)被提交时,该对象会被调用来实例化一个游标。默认为null。
  15. * @param version
  16. *            数据库版本号
  17. */
  18. public DBOpenHandler(Context context, String name, CursorFactory factory, int version) {
  19. super(context, name, factory, version);
  20. }
  21. @Override
  22. public void onCreate(SQLiteDatabase db) {// 覆写onCreate方法,当数据库创建时就用SQL命令创建一个表
  23. // 创建一个t_users表,id主键,自动增长,字符类型的username和pass;
  24. db.execSQL("create table t_users(id integer primary key autoincrement,username varchar(200),pass varchar(200) )");
  25. }
  26. @Override
  27. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
  28. // TODO Auto-generated method stub
  29. }
  30. }

3、TUsers.java(实体类,习惯了WEB开发,总会加个实体类,方便)

  1. package org.yzsoft.sqlitedemo.vo;
  2. public class TUsers {
  3. private int id ;
  4. private String username;
  5. private String pass;
  6. public int getId() {
  7. return id;
  8. }
  9. public void setId(int id) {
  10. this.id = id;
  11. }
  12. public String getUsername() {
  13. return username;
  14. }
  15. public void setUsername(String username) {
  16. this.username = username;
  17. }
  18. public String getPass() {
  19. return pass;
  20. }
  21. public void setPass(String pass) {
  22. this.pass = pass;
  23. }
  24. }

4、SQLiteDAOImpl.java(数据库操作实现类)

  1. package org.yzsoft.sqlitedemo.util;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import org.yzsoft.sqlitedemo.vo.TUsers;
  5. import android.content.Context;
  6. import android.database.Cursor;
  7. import android.database.sqlite.SQLiteDatabase;
  8. public class SQLiteDAOImpl {
  9. private DBOpenHandler dbOpenHandler;
  10. public SQLiteDAOImpl(Context context) {
  11. this.dbOpenHandler = new DBOpenHandler(context, "dbtest.db", null, 1);
  12. }
  13. public void save(TUsers tusers) {// 插入记录
  14. SQLiteDatabase db = dbOpenHandler.getWritableDatabase();// 取得数据库操作
  15. db.execSQL("insert into t_users (username,pass) values(?,?)", new Object[] { tusers.getUsername(), tusers.getPass() });
  16. db.close();// 记得关闭数据库操作
  17. }
  18. public void delete(Integer id) {// 删除纪录
  19. SQLiteDatabase db = dbOpenHandler.getWritableDatabase();
  20. db.execSQL("delete from t_users where id=?", new Object[] { id.toString() });
  21. db.close();
  22. }
  23. public void update(TUsers tusers) {// 修改纪录
  24. SQLiteDatabase db = dbOpenHandler.getWritableDatabase();
  25. db.execSQL("update t_users set username=?,pass=? where" + " id=?", new Object[] { tusers.getUsername(), tusers.getPass(), tusers.getId() });
  26. db.close();
  27. }
  28. public TUsers find(Integer id) {// 根据ID查找纪录
  29. TUsers tusers = null;
  30. SQLiteDatabase db = dbOpenHandler.getReadableDatabase();
  31. // 用游标Cursor接收从数据库检索到的数据
  32. Cursor cursor = db.rawQuery("select * from t_users where id=?", new String[] { id.toString() });
  33. if (cursor.moveToFirst()) {// 依次取出数据
  34. tusers = new TUsers();
  35. tusers.setId(cursor.getInt(cursor.getColumnIndex("id")));
  36. tusers.setUsername(cursor.getString(cursor.getColumnIndex("username")));
  37. tusers.setPass(cursor.getString(cursor.getColumnIndex("pass")));
  38. }
  39. db.close();
  40. return tusers;
  41. }
  42. public List<TUsers> findAll() {// 查询所有记录
  43. List<TUsers> lists = new ArrayList<TUsers>();
  44. TUsers tusers = null;
  45. SQLiteDatabase db = dbOpenHandler.getReadableDatabase();
  46. // Cursor cursor=db.rawQuery("select * from t_users limit ?,?", new
  47. // String[]{offset.toString(),maxLength.toString()});
  48. // //这里支持类型MYSQL的limit分页操作
  49. Cursor cursor = db.rawQuery("select * from t_users ", null);
  50. while (cursor.moveToNext()) {
  51. tusers = new TUsers();
  52. tusers.setId(cursor.getInt(cursor.getColumnIndex("id")));
  53. tusers.setUsername(cursor.getString(cursor.getColumnIndex("username")));
  54. tusers.setPass(cursor.getString(cursor.getColumnIndex("pass")));
  55. lists.add(tusers);
  56. }
  57. db.close();
  58. return lists;
  59. }
  60. public long getCount() {//统计所有记录数
  61. SQLiteDatabase db = dbOpenHandler.getReadableDatabase();
  62. Cursor cursor = db.rawQuery("select count(*) from t_users ", null);
  63. cursor.moveToFirst();
  64. db.close();
  65. return cursor.getLong(0);
  66. }
  67. }

5、TUsersTest.java(JUnit测试类)

  1. package org.yzsoft.sqlitedemo.test;
  2. import java.util.List;
  3. import org.yzsoft.sqlitedemo.util.DBOpenHandler;
  4. import org.yzsoft.sqlitedemo.util.SQLiteDAOImpl;
  5. import org.yzsoft.sqlitedemo.vo.TUsers;
  6. import android.test.AndroidTestCase;
  7. import android.util.Log;
  8. public class TUsersTest extends AndroidTestCase {
  9. private static final String TAG = "这个是测试类";// 准备好TAG标识用于LOG输出,方便我们用LogCat进行调试
  10. public void testCreate() {
  11. DBOpenHandler dbHandler = new DBOpenHandler(this.getContext(), "dbtest.db", null, 1);// 创建数据库文件
  12. dbHandler.getWritableDatabase();
  13. }
  14. public void testSave() throws Throwable {
  15. SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());
  16. TUsers tuser = new TUsers();
  17. tuser.setUsername("用户");
  18. tuser.setPass("密码");
  19. p.save(tuser);
  20. Log.i(TAG, "插入成功");// 用日志记录一个我们自定义的输出。可以在LogCat窗口中查看,方便调试
  21. }
  22. public void testUpate() throws Throwable {
  23. SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());
  24. TUsers tuser = p.find(1);
  25. tuser.setUsername("张三");
  26. p.update(tuser);
  27. Log.i(TAG, "修改成功");
  28. }
  29. public void testDelete() throws Throwable {
  30. SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());
  31. p.delete(2);
  32. Log.i(TAG, "删除成功");
  33. }
  34. public void testFind() throws Throwable {
  35. SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());
  36. TUsers tuser = p.find(1);
  37. Log.i(TAG, tuser.getUsername() + "   用户名");
  38. }
  39. public void testGetCount() throws Throwable {
  40. SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());
  41. Log.i(TAG, p.getCount() + "   总记录数");
  42. }
  43. public void testFindAll() throws Throwable {
  44. SQLiteDAOImpl p = new SQLiteDAOImpl(this.getContext());
  45. List<TUsers> tusers = p.findAll();
  46. for (TUsers tuser : tusers) {
  47. Log.i(TAG, tuser.getUsername() + "   用户名");
  48. }
  49. }
  50. }

然后是测试中的一些截图:


 

 

 

 

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

导出来看看:

虽然安卓平台中SQLite是个小型的本地数据库,但是有些地方使用起来会比文件存储更方便,本文只是对它作一个简单的操作实例 ,有这方面兴趣的童鞋可以自己去深入研究。也希望大家能多交流交流~~~~

最最后~附上项目源码:

在安卓开发中使用SQLite数据库操作实例的更多相关文章

  1. 在Android 开发中使用 SQLite 数据库笔记

    SQLite 介绍   SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PH ...

  2. 安卓 SQLite数据库操作实例

    前段时间写了个安卓平台下SQLite数据库操作的实例 ,一直没得时间总结 ,今天把它弄出来了. 在Android 运行时环境包含了完整的 SQLite. 首先介绍一下SQLite这个数据库: SQLi ...

  3. Android 开发中使用 SQLite 数据库

    SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能. 此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PHP ...

  4. 我的Android六章:Android中SQLite数据库操作

    今天学习的内容是Android中的SQLite数据库操作,在讲解这个内容之前小编在前面有一篇博客也是讲解了SQLite数据库的操作,而那篇博客的讲解是讲述了 如何在Window中通过DOM来操作数据库 ...

  5. UWP开发随笔——使用SQLite数据库

    摘要 大多数的app都需要数据存储,在数据存储这方面,强大的windows把app数据分为两种:settings和files,并提供了十分简洁的api,让开发者能够轻松使用.但是在有些场景下,app的 ...

  6. android开发之使用SQLite数据库存储

    http://blog.csdn.net/jason0539/article/details/16360835 SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且 ...

  7. 在 Android 应用程序中使用 SQLite 数据库以及怎么用

    part one : android SQLite 简单介绍 SQLite 介绍 SQLite 一个非常流行的嵌入式数据库.它支持 SQL 语言,而且仅仅利用非常少的内存就有非常好的性能.此外它还是开 ...

  8. 安卓SQLite数据库操作(下)

    在安卓开发中,数据库的操作无非就是增删改查.那么,这里我们通过例子来学习这四个操作. 我们先看代码吧.具体讲解后面说. 布局文件 activity_main.xml <LinearLayout ...

  9. windows phone 8.1开发SQlite数据库操作详解

    原文出自:http://www.bcmeng.com/windows-phone-sqlite1/ 本文小梦将和大家分享WP8.1中SQlite数据库的基本操作:(最后有整个示例的源码)(希望能通过本 ...

随机推荐

  1. POJ 1173 Find them, Catch them

    题意:有两个帮派,每个人只属于一个帮派,m次操作,一种操作告诉你两个人不是一个帮派的,另一种操作问两个人是不是在一个帮派. 解法:并查集+向量偏移.偏移量表示和根节点是不是同一帮派,是为0,不是为1. ...

  2. 解决32位plsql客户端连接不64位Oracle11g上数据库

    一.解决方案 因为本人安装的是64位的Oracle,plsql 是32位的故连接不上.网上有方法能连接. 1. 文件下载 下载PLSQL_Developer地址 http://pan.baidu.co ...

  3. java制作证书的工具keytool用法

    一.keytool的概念 keytool 是个密钥和证书管理工具.它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务.在 ...

  4. Android http协议实现文件下载

    用http协议下载文件,主要用到的是httpURLConnection对象,主要的步骤如下: 1. 创建HttpURLConnection对象 2.获得一个InputStream对象 3.修改权限:访 ...

  5. 利用HTML 5中的Menu和Menuitem元素快速创建菜单

    原文:Introducing the HTML5 “Menu” and “Menuitem” Elements 译文:HTML 5中Menu和Menuitem的元素介绍 译者:dwqs 今天向你介绍H ...

  6. Backbone.js developer 武汉 年薪8w-10w

    1.   精通Backbone.js 2.   熟练Ajax.NoSQL.RESTful APIs 3.   了解Pusher.com和 Parse.com 4.   具有良好的沟通能力,学习能力,敬 ...

  7. CSS基础(背景、文本、列表、表格、轮廓)

    CSS 背景属性 属性 描述 background 简写属性,作用是将背景属性设置在一个声明中. background-attachment 背景图像是否固定或者随着页面的其余部分滚动. backgr ...

  8. C#调用dll(C++(Win32))时的类型转换总结(转)

    http://www.cnblogs.com/lidabo/archive/2012/06/05/2536737.html     C++(Win 32) C# char** 作为输入参数转为char ...

  9. 【转】Maven实战(五)---两个war包的调用

    原博文出自于: http://blog.csdn.net/liutengteng130/article/details/42879803    感谢! 开篇前提   1.为什么要用两个war包的调用? ...

  10. [现代程序设计]homework-03

    Homework-03 队员: 11061193 薛亚杰 11061192 周敏轩    11061190 李孟 材料阅读 我们三个人将以下材料仔细阅读,觉得十分受益.下面是我们的总结和分享: 1)代 ...