在安卓开发中使用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

Java代码  

  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了,留着不用写它)

Java代码  

  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

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开发,总会加个实体类,方便)

Java代码  

  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(数据库操作实现类)

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测试类)

Java代码  

  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数据库操作实例

时间: 2024-12-25 12:47:09

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

安卓 SQLite数据库操作实例

前段时间写了个安卓平台下SQLite数据库操作的实例 ,一直没得时间总结 ,今天把它弄出来了. 在Android 运行时环境包含了完整的 SQLite. 首先介绍一下SQLite这个数据库: SQLite,是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了.它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tc

cocos2d-x 2.1 Win32+Android开发中的sqlite数据库加密技术探讨

注意:本博客转移自本人约一年前的ITPUB博客文章,为的是便于学员参考之用. 很显然,cocos2d-x编程中只了解基本的sqlite数据库操作技术只是一个开头,真正把此数据库数据应用于实际中不使用一定的加密及解密技术几乎是不行的. 这个问题尽早会来到我面前,这不?现在就来了.一开始,自然想使用最省工的了:但是,这样的好事并不多,极少极少...... 于是,我先搜罗了一些现成的文章拿来一阅. 1,Sqlite数据库加密解密 SRC: http://blog.sina.com.cn/s/blog_

Sqlserver 实际开发中常见的数据库操作增删改查----删

--我们就以院系,班级,学生来举例. create TABLE [dbo].YuanXi ( Id int IDENTITY(1,1) NOT NULL,--学校id 自增量 YuanXiName varchar(50) null, --院系名字 ) create TABLE [dbo].Class ( Id int IDENTITY(1,1) NOT NULL,--班级id 自增量 YuanXiID int null,--院系id ClassName varchar(50) null --班级

Sqlserver 实际开发中常见的数据库操作增删改查----增

注意我说的常见查询,可不是简单到一个表得增删改查,做过实际开发得人都知道,在实际开发中,真正牵扯到一个表得增删改查只能说占很小得一部分,大多都是好几个表的关联操作的. 下面我就说一下我在实际开发中经常用到得一些增删改查方式.(首先我还要说一下,就是我虽然能写,但是我不知道这种查询方式叫什么类型查询,毕竟数据库这块以前都没干过,做.net开发也就一年左右,大家看我写的博客也会知道,以前搞前端U3D游戏开发的,不接触数据库,取数据调后台接口就行了,其他不用管.所以没做.net前,我也就是会大学时候学

Sqlserver 实际开发中常见的数据库操作增删改查----改

--我们就以院系,班级,学生来举例. create TABLE [dbo].YuanXi ( Id int IDENTITY(1,1) NOT NULL,--学校id 自增量 YuanXiName varchar(50) null, --院系名字 ) create TABLE [dbo].Class ( Id int IDENTITY(1,1) NOT NULL,--班级id 自增量 YuanXiID int null,--院系id ClassName varchar(50) null --班级

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

part one : android SQLite 简单介绍 SQLite 介绍 SQLite 一个非常流行的嵌入式数据库.它支持 SQL 语言,而且仅仅利用非常少的内存就有非常好的性能.此外它还是开源的,不论什么人都能够使用它.很多开源项目((Mozilla, PHP, Python)都使用了 SQLite. SQLite 由下面几个组件组成:SQL 编译器.内核.后端以及附件.SQLite 通过利用虚拟机和虚拟数据库引擎(VDBE).使调试.改动和扩展 SQLite 的内核变得更加方便. 图

Android SQLite数据库操作示例

SQLite介绍 SQLite是一个非常流行的嵌入式数据库,它支持SQL语言,并且只利用很少的内存就有很好的性能.此外,它还是开源的,任何人都可以使用它. SQLite由以下几个组件组成:SQL编译器.内核.后端以及附件.SQLite通过利用虚拟机和虚拟数据库引擎(VDBE),使调试.修改和扩展SQLite的内核变得更加方便. SQLite支持的数据类型参考链接:http://blog.csdn.net/wzy_1988/article/details/36005947 Android在运行时(

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

原文出自:http://www.bcmeng.com/windows-phone-sqlite1/ 本文小梦将和大家分享WP8.1中SQlite数据库的基本操作:(最后有整个示例的源码)(希望能通过本站广告支持小梦,谢谢!) 建立数据库 增加数据 删除数据 更改数据 查询数据 (注:为了让每个操作都能及时显示在UI上,所以进行了数据绑定.数据绑定会在后面文章专门讲解,先给出数据类Note,代表一个笔记.含有Name 和content  属性.其代码如下:如果不清楚,我会在之后讲解): names

iOS 中SQLite数据库操作

在iOS中实现SQLite数据库的操作:1.导入框架(libsqlite3.0.tbd) 2.导入头文件<sqlite3.h> 3.实现数据的增删改查 实现简单 SQLite数据库操作 的 demo 具体过程: 1.创建名为 SQLite_Manage 的.h .m 文件,导入头文件 <sqlite3.h> 2.数据库在一个app中只有一个,使用单例模式:(代码如下) 1 + (SQLite_Manager *)sharedManager{ 2 static SQLite_Mana