前段时间写了个安卓平台下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. ajax实现md5加密

    一个asp.net ajax例子,使用jquery,实现md5加密..NET 4.0,Visual Studio 2010以上.效果体验:http://tool.keleyi.com/t/md5.ht ...

  2. seo技巧-2015/10/05

    1.每页都要有它自己的文件名,并且有它自己的上级文件夹和它自己相关关键字. 2.建议在每页上使用一个的H1标签.我也试着使用许多H2 或H3的标签在页面内辅助构成正文内容. 3. 有时花费一点钱帮助你 ...

  3. PHPCMS数据筛选功能实现

    第一步:添加模型字段,这个模型可以是官方的,也可以是你自定义的模型,以单选字段形式添加就好了; 第二步:就是添加栏目和内容: 第三步:模板如下,照着改就好了. {template "cont ...

  4. Python:列表,元组

    一.列表 和字符串一样,列表也是序列类型,因此可以通过下标或者切片操作访问一个或者多个元素.但是,不一样的,列表是容器类型,是可以进行修改.更新的,即当我们进行修改列表元素,加入元素等操作的时候,是对 ...

  5. 在适配iPhone 6 Plus屏幕的时候,模拟器上两边有很细的白边如何解决

    取消掉Constrain to margin 然后添加左右约束 版权声明:本文为博主原创文章,未经博主允许不得转载.    

  6. Django 1.6 最佳实践: django项目的服务器自动化部署(转)

    原文:http://www.weiguda.com/blog/41/ 当我们设置服务器时, 不应该每次都使用ssh登录服务器, 再按照记忆一步一步的配置. 因为这样实在是太容易忘记某些步骤了. 服务器 ...

  7. mysql创建用户两次授权

    mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost'     ->     IDENTIFIED BY 'some_pass' ...

  8. web.xml 详解

    http://xmlns.jcp.org/xml/ns/javaee 重定向为 http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javae ...

  9. opencv win7 配置

    按照官网的配置方法,结果出现了下面的错误信息F:\eclipse C++ workspace\test\Debug/../src/test.cpp:18: undefined reference to ...

  10. yii2.0 gii

    1.添加模型 ./yii-dev gii/model --tableName=tableName --generateLabelsFromComments --ns='app\models\base' ...