前段时间写了个安卓平台下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. 在安卓开发中使用SQLite数据库操作实例

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

  2. 安卓SQLite数据库操作,半小时开发新闻管理系统,纯干货

    本教程致力于可以快速的学习安卓软件开发,希望能通过一系列自己手写的教程,帮助正在学习或想要学习安卓开发的同仁. 本教程由今日头条-全栈攻城狮号首发,都是一个字一个字码的.请尊重劳动成果,转载请注明出处 ...

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

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

  4. 安卓SQLite数据库操作(上)

    安卓系统自带数据库,名为SQLite.这篇文章我们用一个Demo来讲解安卓操作数据库的例子. By the way, 安卓创建的数据库文件存放在/data/data/<包名>/databa ...

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

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

  6. sqlite数据库操作详细介绍 增删改查,游标

    sqlite数据库操作详细介绍 增删改查,游标     本文来源于www.ifyao.com禁止转载!www.ifyao.com Source code     package com.example ...

  7. php读取sqlite数据库入门实例

    php读取sqlite数据库的例子,php编程中操作sqlite入门实例.原文参考:http://www.jbxue.com/article/php/22383.html在使用SQLite前,要确保p ...

  8. 实验8 SQLite数据库操作

    实验报告 课程名称 实验8  SQLite数据库操作 实验日期 2016.5.6 实验项目名称 多媒体应用开发 实验地点 S30010 实验类型 □验证型    √设计型    □综合型 学  时 一 ...

  9. [python]用Python进行SQLite数据库操作

    用Python进行SQLite数据库操作 1.导入Python SQLITE数据库模块 Python2.5之后,内置了SQLite3,成为了内置模块,这给我们省了安装的功夫,只需导入即可~  ]: u ...

随机推荐

  1. IIS 工作原理之非托管代码旅程(一)

    IIS6改变 IIS6可以为每个不同的虚拟目录创建不同的程序池,这样缩小了IIS的Application Pool的颗粒度,不同的虚拟目录之间是互不影响的. IIS6(和IIS7经典模式)与IIS7集 ...

  2. 自定义模板语言之simple_tag和自定义过滤器

    扩展你的模板系统 一般是扩展模板的tag和filter两个功能.可以用来创建你自己的tag和filter功能库. 创建模板库 分为两步: 1. 首先决定由模板库在哪一个注册的app下放置,你可以放在一 ...

  3. 常用SQL整理

    整理了日常用到的一些sqls 1.插入表 insert into table_B select * from table_A 2.清空表 truncate table test #清空表,结构还存在d ...

  4. pyqt4制作透明无边框窗体

    用PyQt做了一个无边框登陆窗口,效果如下: 下面是代码: # -*- coding: utf-8 -*- from PyQt4 import QtGui ,Qt ,QtCore image=QtGu ...

  5. 实现单例模式C++版本

    还是先看最简单的C++单例模式 class CSingleton { private: CSingleton(){} static CSingleton *pInstance; public: sta ...

  6. ASP.NET MVC 5 学习教程:修改视图和布局页

    原文 ASP.NET MVC 5 学习教程:修改视图和布局页 起飞网 ASP.NET MVC 5 学习教程目录: 添加控制器 添加视图 修改视图和布局页 控制器传递数据给视图 添加模型 创建连接字符串 ...

  7. Trie树(字典树)

    传送门:http://hihocoder.com/problemset/problem/1014 #1014 : Trie树 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描 ...

  8. css基本介绍

    目录 CSS初识 构造规则 注意 样式表的定义和使用 行内式(内联样式) 内部样式表 外部样式表(外链式) 选择器 标签选择器(元素选择器) 类选择器 id选择器 通配符选择器 伪类选择器 链接伪类选 ...

  9. maven repository pom

    场景: 如果maven setting.xml 中没指定国内的镜像 可以通过在项目中的pom中指定 指定repository : <properties> <java.version ...

  10. mysql命令行使用

    连接数据库   mysql -P 端口号 -h 远程机地址/ip -u 用户名 -p mysql -uroot -p123456 修改数据库密码 mysqladmin -uroot -p123456 ...