详解Android轻量型数据库SQLite

数据库是Android存储方案的核心,在Andorid中SQLite非常轻量,而且执行sql语句甚至比MySQL还要快。
SQLiteDatabase 是 Android 中操作数据库的核心类之一,使用SQLiteDatabase可以打开数据库,也可以对数据库进行操作,然而,为了数据库升级以及使用更加方便,我们常用SQLiteOpenHelper的子类来完成创建,打开数据库的操作。
SQLiteOpenHelper是一个抽象类,在该类中有下面两个必须实现的方法:

public void onCreate(SQLiteDatabase db);// 该函数在数据库第一次被建立时调用 public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion);// 数据库更新升级操作

我们新建一个类DBHelper extends SQLiteOpenHelper

import java.util.Random; import android.R.bool; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; public class DBHelper extends SQLiteOpenHelper { // 设置数据库默认版本 private static final int VERSON = 1; // 自定义数据库名,可以随便取名字 private static final String DBNAME = "mydb"; // 继承SQLiteOpenHelper类的类必须有自己的构造函数 // 该构造函数4个参数,直接调用父类的构造函数。其中第一个参数为该类本身;第二个参数为数据库的名字; public DBHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } // 该构造函数有3个参数,因为它把上面函数的第3个参数固定为null了 public DBHelper(Context context, String name, int verson) { this(context, name, null, verson); } // 该构造函数只有2个参数,在上面函数 的基础上将版本号固定了 public DBHelper(Context context, String name) { this(context, name, VERSON); } // 该构造函数只有1个参数,固定默认数据库,在这里我们实现增删改查为了方便,就用它了 public DBHelper(Context context) { this(context, DBNAME, null, VERSON); } // 该函数在数据库第一次被建立时调用 public void onCreate(SQLiteDatabase db) { System.out.println("create a sqlite database"); //建表语句(注意:因为在绑定数据时,Cursor对象返回的记录集中必须包含一个"_id"字段,否则无法完成数据绑定 String sql = "CREATE TABLE [test]("+ "[_id] AUTOINC,"+ "[name] varchar(20),"+ "[age] varchar(20),"+ "PRIMARY KEY ([_id]))"; db.execSQL(sql); //向test表中插入10条数据 for (int i = 1; i <= 10; i++) { String name = "Jepson"; name+=i; String age = "age"; age+=i; db.execSQL("insert into test(name,age) values(?,?)",new Object[]{name,age}); } } // 数据库更新操作 public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) { System.out.println("update a sqlite database"); } //自定义query方法,用以执行查询语句,返回Cursor对象 public Cursor query(String sql,String[] args){ //调用 getReadableDatabase方法时,如果数据库文件不存在,会调用 onCreate方法 SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor = db.rawQuery(sql, args); return cursor; } }

这样,我们的DBHelper 类写好了,我们来实现一个查询操作。

第一步,activity_main.xml添加 listview 展示控件

activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="#FFFFFF" android:orientation="vertical" tools:context=".MainActivity" > <ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_weight="1" android:divider="#6b6f74" android:dividerHeight="1px" > </ListView> </LinearLayout>

第二步,新建一个xml布局文件,用来作为列表项使用的布局资源

user_list_cell.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:background="#FFFFFF"> <!-- 大字体TextView,用以展示 name姓名 --> <TextView android:id="@+id/tvName" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Large" android:textColor="#000000" android:textSize="20dp" /> <!-- 小字体TextView,用以展示 age年龄 --> <TextView android:id="@+id/tvAge" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Small" android:textColor="#000000" android:textSize="14dp" /> </LinearLayout>

第三步,主Activity

import android.os.Bundle; import android.app.Activity; import android.app.ListActivity; import android.database.Cursor; import android.support.v4.widget.SimpleCursorAdapter; import android.view.Menu; import android.widget.Toast; public class MainActivity extends ListActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } public void initView(){ //调用只有1个参数的构造函数,实例化dbHelper DBHelper dbHelper = new DBHelper(this); //新建Cursor对象来保存query查询方法返回的结果,查询test表中所有记录 Cursor cursor = dbHelper.query("select * from test", null); //创建SimpleCursorAdapter对象,5个参数, //第一个是context,就写当前this就行 //第二个是布局文件,我这里是自定义的布局文件user_list_cell.xml //第三个就是Cursor对象 //第四个对应就是,cursor查询后,需要显示出来的字段名,比如我要显示姓名name和年龄age //第五个就是对应列表项布局中的控件ID了 SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter(this, R.layout.user_list_cell, cursor, new String[] { "name", "age" }, new int[] { R.id.tvName, R.id.tvAge }); setListAdapter(simpleCursorAdapter); Toast.makeText(this, "查询成功", Toast.LENGTH_SHORT).show(); } }

执行一下看看,我们是不是查询成功了?

操作SQLite数据库应了解,对数据库的增删改查都有两种方法,一种是前面的使用 rawQuery方法直接执行SQL语句,另一种就是使用SQLiteDatabase类的相应方法来操作,下面举一个第二种的例子,比如我们要插入数据 name=11 age=22

import android.os.Bundle; import android.app.Activity; import android.app.ListActivity; import android.database.Cursor; import android.support.v4.widget.SimpleCursorAdapter; import android.view.Menu; import android.widget.Toast; public class MainActivity extends ListActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } public void initView(){ //执行添加操作 DBHelper dbHelper = new DBHelper(this); //获得写入权限getWritableDatabase SQLiteDatabase db = dbHelper.getWritableDatabase(); //新建contentvalues保存insert数据 ContentValues cv = new ContentValues(); cv.put("name", "11"); cv.put("age", "22"); db.insert("test", null, cv); Toast.makeText(this, "添加成功", Toast.LENGTH_SHORT).show(); ////查询操作 ////调用只有1个参数的构造函数,实例化dbHelper //DBHelper dbHelper = new DBHelper(this); ////新建Cursor对象来保存query查询方法返回的结果,查询test表中所有记录 //Cursor cursor = dbHelper.query("select * from test", null); ////创建SimpleCursorAdapter对象,5个参数, ////第一个是context,就写当前this就行 ////第二个是布局文件,我这里是自定义的布局文件user_list_cell.xml ////第三个就是Cursor对象 ////第四个对应就是,cursor查询后,需要显示出来的字段名,比如我要显示姓名name和年龄age ////第五个就是对应列表项布局中的控件ID了 //SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter(this, // R.layout.user_list_cell, cursor, // new String[] { "name", "age" }, new int[] { R.id.tvName, // R.id.tvAge }); //setListAdapter(simpleCursorAdapter); //Toast.makeText(this, "查询成功", Toast.LENGTH_SHORT).show(); } }

执行插入成功以后,再将插入语句注释,将查询语句去掉注释,重新启动,会发现最后一多了一个item,添加成功。

另外查询记录获得的Cursor对象,需要使用movetoFirst,moveToNext,movToPosition(position)等方法将指针移动相应的位置,来进行查询结果的读取。

import android.os.Bundle; import android.app.Activity; import android.app.ListActivity; import android.database.Cursor; import android.support.v4.widget.SimpleCursorAdapter; import android.view.Menu; import android.widget.Toast; public class MainActivity extends ListActivity { protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } public void initView(){ //解析Cursor对象的查询操作 DBHelper dbHelper = new DBHelper(this); SQLiteDatabase db = dbHelper.getWritableDatabase(); Cursor cursor = db.query("test", null, null, null, null, null, null, null); //定义结果字符串 String result = ""; // 判断cursor不为空 这个很重要 if (cursor != null) { while (cursor.moveToNext()) { String name = cursor.getString(cursor.getColumnIndex("name"));// 获取name列的值 String age = cursor.getString(cursor.getColumnIndex("age"));// 获取age列的值 result += "姓名:" + name + ",年龄:" + age + "\n"; } } cursor.close(); db.close(); System.out.println(result); Toast.makeText(this, result, Toast.LENGTH_SHORT).show(); // //执行添加操作 // DBHelper dbHelper = new DBHelper(this); // //获得写入权限getWritableDatabase // SQLiteDatabase db = dbHelper.getWritableDatabase(); // //新建contentvalues保存insert数据 // ContentValues cv = new ContentValues(); // cv.put("name", "11"); // cv.put("age", "22"); // db.insert("test", null, cv); // Toast.makeText(this, "添加成功", Toast.LENGTH_SHORT).show(); ////查询操作 ////调用只有1个参数的构造函数,实例化dbHelper //DBHelper dbHelper = new DBHelper(this); ////新建Cursor对象来保存query查询方法返回的结果,查询test表中所有记录 //Cursor cursor = dbHelper.query("select * from test", null); ////创建SimpleCursorAdapter对象,5个参数, ////第一个是context,就写当前this就行 ////第二个是布局文件,我这里是自定义的布局文件user_list_cell.xml ////第三个就是Cursor对象 ////第四个对应就是,cursor查询后,需要显示出来的字段名,比如我要显示姓名name和年龄age ////第五个就是对应列表项布局中的控件ID了 //SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter(this, // R.layout.user_list_cell, cursor, // new String[] { "name", "age" }, new int[] { R.id.tvName, // R.id.tvAge }); //setListAdapter(simpleCursorAdapter); //Toast.makeText(this, "查询成功", Toast.LENGTH_SHORT).show(); } }

执行以后,可以发现,name和age全都获取到了,并显示在了Toast和system.out中。是不是很有意思呢?

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

时间: 2024-10-26 11:58:56

详解Android轻量型数据库SQLite的相关文章

详解Android主流框架不可或缺的基石

探索Android软键盘的疑难杂症 深入探讨Android异步精髓Handler 详解Android主流框架不可或缺的基石 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Android多分辨率适配框架(3)- 使用指南 自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View

实例详解Android文件存储数据方式_Android

总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络.下面通过本文给大家介绍Android文件存储数据方式. 1.文件存储数据使用了Java中的IO操作来进行文件的保存和读取,只不过Android在Context类中封装好了输入流和输出流的获取方法. 创建的存储文件保存在/data/data/<package name>/files文件夹下. 2.操作. 保存文件内容:通过Context.openFileOutput获取输出流,参数分别为文件名和存储模式. 读取文件内容:通

实例详解Android文件存储数据方式

总体的来讲,数据存储方式有三种:一个是文件,一个是数据库,另一个则是网络.下面通过本文给大家介绍Android文件存储数据方式. 1.文件存储数据使用了Java中的IO操作来进行文件的保存和读取,只不过Android在Context类中封装好了输入流和输出流的获取方法. 创建的存储文件保存在/data/data/<package name>/files文件夹下. 2.操作. 保存文件内容:通过Context.openFileOutput获取输出流,参数分别为文件名和存储模式. 读取文件内容:通

详解android 通过uri获取bitmap图片并压缩

详解android 通过uri获取bitmap图片并压缩 很多人在调用图库选择图片时会在onActivityResult中用Media.getBitmap来获取返回的图片,如下: Uri mImageCaptureUri = data.getData(); Bitmap photoBmp = null; if (mImageCaptureUri != null) { photoBmp = MediaStore.Images.Media.getBitmap(ac.getContentResolve

详解Android中图片的三级缓存及实例

详解Android中图片的三级缓存及实例 为什么要使用三级缓存 如今的 Android App 经常会需要网络交互,通过网络获取图片是再正常不过的事了 假如每次启动的时候都从网络拉取图片的话,势必会消耗很多流量.在当前的状况下,对于非wifi用户来说,流量还是很贵的,一个很耗流量的应用,其用户数量级肯定要受到影响 特别是,当我们想要重复浏览一些图片时,如果每一次浏览都需要通过网络获取,流量的浪费可想而知 所以提出三级缓存策略,通过网络.本地.内存三级缓存图片,来减少不必要的网络交互,避免浪费流量

基于 SurfaceView 详解 android 幸运大转盘,附带实例app

基于 SurfaceView 详解 android 幸运大转盘,附带实例app       首先说一下,幸运大转盘,以及SurfaceView是在看了也为大神的博客,才有了比较深刻的理解,当然这里附上这位大神的博客地址:博客地址,有兴趣的话你可以去看看,里面有很多的例子.至于我为什么要写这篇博客?,原因之一:加强自己的理解,原因之二:大神的博客就是大神的博客,跳转的太快,基础不好的,很难理解.还有就是一天在实验室太无聊了,没事写写东西.这里我再来更加基础的分析一下.写的不好,原谅.有什么写的不对

详解Android中Intent对象与Intent Filter过滤匹配过程_Android

如果对Intent不是特别了解,可以参见博文<详解Android中Intent的使用方法>,该文对本文要使用的action.category以及data都进行了详细介绍.如果想了解在开发中常见Intent的使用,可以参见<Android中Intent习惯用法>. 本文内容有点长,希望大家可以耐心读完. 本文在描述组件在manifest中注册的Intent Filter过滤器时,统一用intent-filter表示. 一.概述 我们知道,Intent是分两种的:显式Intent和隐式

详解Android中Handler的内部实现原理_Android

本文主要是对Handler和消息循环的实现原理进行源码分析,如果不熟悉Handler可以参见博文<详解Android中Handler的使用方法>,里面对Android为何以引入Handler机制以及如何使用Handler做了讲解. 概括来说,Handler是Android中引入的一种让开发者参与处理线程中消息循环的机制.我们在使用Handler的时候与Message打交道最多,Message是Hanlder机制向开发人员暴露出来的相关类,可以通过Message类完成大部分操作Handler的功

利用常用的集成开发环境(IDE)和中间件设计轻量型ESB

本文介绍了实现一个自产的轻量型http://www.aliyun.com/zixun/aggregation/7921.html">企业服务总线 (ESB) 的设计蓝图,该企业服务总线利用了常用的集成开发环境 (IDE) 和中间件.本文中的场景使用了 IBM® WebSphere® Application Server V8(一个用于 Java EE 应用程序的强健的部署环境)和 IBM Rational® Software Architect(提供了工具来设计.开发.测试和打包要部署到应