前段时间写了个安卓平台下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. STL六大组件之——算法小小小小的解析

    参考自侯捷的<stl源码剖析> stl算法主要分为非可变序列算法(指不直接修改其所操作的容器内容的算法),可变序列算法(指可以修改它们所操作的容器内容的算法),排序算法(包括对序列进行排序 ...

  2. char型指针与其它指针或数组的细节

    一道常见题 char * str7="abc"; char * str8="abc"; cout<<(str7==str8)<<endl ...

  3. cdh5.4、cm5.4 安装详细步骤

    安装准备: 1.centos6.5 64位 虚拟机,内存分配4G.硬盘位20G 2.cm5.4 cdh5.4 包 安装步骤 一.centos安装完后,进行系统配置 1.关闭防火墙 service ip ...

  4. Spring Boot 学习笔记 - 认识Spring Boot框架

    因各种原因,.NET前端工程师重新接触JAVA,真是向全栈的路上又迈出了无奈的一步. 下面正文: Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初 ...

  5. Pig Run on Hadoop, V1.0

    ——安装hadoop参考这篇blog: http://www.cnblogs.com/lanxuezaipiao/p/3525554.html?__=1a36 后面产生的问题,slave和master ...

  6. 创建被访问的swf文件

    首先创建一个fla文件,名字叫movie.fla,在该文件库中放一个mc, 并将其拖放到舞台上,然后 命名为test_mc, 然后在库中给该mc绑定一个类,类名随意. 创建访问swf文件的swf文件 ...

  7. 原生JS默认设置默认值的写法

    json=json||{};json.type=json.type||'get';json.data=json.data||{};json.time=json.time||2000;

  8. 转】Maven学习总结(九)——使用Nexus搭建Maven私服

    原博文出自于:http://www.cnblogs.com/xdp-gacl/p/4068967.html 感谢! 一.搭建nexus私服的目的 为什么要搭建nexus私服,原因很简单,有些公司都不提 ...

  9. hdu 1044 Collect More Jewels(bfs+状态压缩)

    Collect More Jewels Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  10. oracle学习 九 游标的使用(持续更)

    为什么要使用? 笔者查阅了一些资料之后得到的结论是, 关系型数据库是面向集合的,而游标是面向行的,游标可对取出来的集合(结果集)中每一行进行相同或不同的操作,还提供对基于游标位置而对表中数据进行删除或 ...