热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android开发中SQLite数据库操作(一)

最近看了网上的关于AndroidSQLite数据库的视频教程,在这里做个笔记记录一下一些常用的操作,在文章最后会给出源码。孙子兵法有言:知己知彼方能百战不殆,既然用sqlite,那我们首先先来了解一

最近看了网上的关于Android SQLite数据库的视频教程,在这里做个笔记记录一下一些常用的操作,在文章最后会给出源码。

孙子兵法有言:知己知彼方能百战不殆,既然用sqlite,那我们首先先来了解一下什么是sqlite?

首先嵌入式数据库是不需要独立运行有专门的数据库引擎的,由程序直接调用相应的API实现对数据库的存取操作,它是程序驱动式的,不同于SQLServer、DB2、MySQL、Oracle这些引擎响应式的。sqlite就是一款开源的轻量级的可嵌入的关系型数据库,特点是系统开销小(通常只需要几百KB的内存就足够了)、检索效率高、应用范围广,sqlite不仅支持标准的SQL语法,还遵循了数据库的ACID事务,保证了数据的完整性,同时也提高了运行的速度。下面先来看一些基础知识:

1.sqlite数据库的数据类型:Integer、varchar(10)、float、double、char(10)、text 

2.日常开发中较为常用的sql语句:

创建表:create table 表名(字段名称 数据类型 约束条件,字段名称 数据类型 约束条件......) 

例如:create table person(_id Integer primary key,name varchar(10),age Integer not null)

删除表:drop table 表名

例如:drop table person

插入数据:insert into 表名[字段,字段] values(值1,值2......)

例如:insert into person(_id,age) values(1,20)  表名后面指定了要插入的字段名称,则values中根据字段名对应赋值即可

      insert into person values(2,"archie",24)   表名后面没有指定具体要插入的字段名,则values中要根据表结构一一给出相应的值

修改表:update 表名 set 字段=新值 where 修改的条件

例如:update person set name="jarchie",age=23 where _id=2

删除数据:delete from 表名 where 删除的条件

例如:delete from person where _id=2

查询语句:select 字段 from 表名 where 查询条件 group by 分组的字段 having 筛选条件 order by 排序字段

例如:查询所有:select * from person 

   模糊查询:select * from person where name like "%小%"      select * from person where name like "_小%"

   排序:select * from person where age>18 order by _id

好了,了解了以上的知识点之后,我们一起来看一下sqlite数据库在android中具体该如何使用呢?

首先来看如何创建数据库?

Android底层为我们提供了一个SQLiteOpenHelper的帮助类,里面封装了创建和使用数据库的各种方法,我们只需要定义自己的类去继承SQLiteOpenHelper,实现里面的方法即可。

public class MySqliteHelper extends SQLiteOpenHelper
其中,onCreate()方法是在数据库创建时回调的函数:

/**
* 当数据库创建时回调的函数
* @param db 数据库对象
*/
@Override
public void onCreate(SQLiteDatabase db) {
Log.e(TAG, "onCreate: " + "------onCreate-----" );
}

然后,我们在我们的活动页中首先需要拿到我们的MySqliteHelper对象,然后通过调用helper.getWriteableDatabase()方法就可以创建数据库了:

helper = DbManager.getInstance(this);
/**
* getReadableDatabase()和getWritableDatabase()创建或者打开数据库
* 如果数据库不存在则创建数据库,如果数据库存在直接打开数据库
* 默认情况下两个函数都表示打开或者创建可读可写的数据库对象,如果磁盘已满或者数据库
* 本身权限等情况下getReadableDatabase()打开的是只读数据库
*/
SQLiteDatabase db = helper.getWritableDatabase();

接下来我们来看一下对数据库的一些常用操作,在本篇中先来看一下sqlite的增删改操作,对于这部分我们有两种实现方式,一种是直接通过执行sql语句进行相关的操作,另一种是通过android中的api进行操作,下面先来看一下第一种实现方式:

首先定义一个数据库的操作类,在该类中我们定义一个数据库的公共的执行方法,便于调用:

/**
* 根据sql语句在数据库中执行语句
* @param db 数据库对象
* @param sql sql语句
*/
public static void execSql(SQLiteDatabase db,String sql){
if (db != null){
if (!TextUtils.isEmpty(sql)){
db.execSQL(sql);
}
}
}

然后在我们的页面中开始进行相关的操作,分别是插入数据,修改数据,删除数据等操作:

插入操作:

db = helper.getWritableDatabase();
String sql = "insert into "+ Constant.TABLE_NAME+" values(1,'Archie',24)";
DbManager.execSql(db,sql);
String sql1 = "insert into "+ Constant.TABLE_NAME+" values(2,'Jackson',25)";
DbManager.execSql(db,sql1);
db.close();

修改数据:

db = helper.getWritableDatabase();
String sql2 = "update "+Constant.TABLE_NAME+" set "+Constant.NAME
+"='angel' where "+Constant._ID+"=1";
DbManager.execSql(db,sql2);
db.close();

删除数据:

db = helper.getWritableDatabase();
String sql3 = "delete from "+Constant.TABLE_NAME+" where "+Constant._ID+"=2";
DbManager.execSql(db,sql3);
db.close();

通过这些操作我们就可以完成数据的增删改功能,但是这种方式有个前提条件是我们得熟练的去运用sql语句。所以,下面我们来看看使用第二种方式该如何实现?

插入数据:

db = helper.getWritableDatabase();
/**
* insert(String table, String nullColumnHack, ContentValues values)
* table:表名 nullColumnHack:一般指定为null values:键为String的HashMap集合
* return long 表示插入数据的列数
*/
ContentValues values = new ContentValues();
values.put(Constant._ID,3); //put(字段名,字段值)
values.put(Constant.NAME,"安奇");
values.put(Constant.AGE,24);
long result = db.insert(Constant.TABLE_NAME, null, values);
if (result > 0){
DbManager.toastMessage(this,"插入数据成功!");
}else {
DbManager.toastMessage(this,"插入数据失败!");
}
db.close();
修改数据:

db = helper.getWritableDatabase();
/**
* update(String table, ContentValues values, String whereClause, String[] whereArgs)
* table:表名 values:键为String的HashMap集合
* whereClause:表示当前修改的条件 whereArgs:修改条件的占位符
* return int 修改的条数
*/
ContentValues values1 = new ContentValues();
values1.put(Constant.NAME,"哈哈"); //put(需要修改的字段名,修改后的字段值)
int count = db.update(Constant.TABLE_NAME, values1, Constant._ID + "=?",
new String[]{"3"});
if (count > 0){
DbManager.toastMessage(this,"修改数据成功!");
}else {
DbManager.toastMessage(this,"修改数据失败!");
}
db.close();

删除数据:

db = helper.getWritableDatabase();
/**
* delete(String table, String whereClause, String[] whereArgs)
* table:删除的表名 whereClause:删除的条件 whereArgs:删除条件的占位符
* return int 删除条数
*/
int size = db.delete(Constant.TABLE_NAME, Constant._ID + "=?", new String[]{"1"});
if (size > 0){
DbManager.toastMessage(this,"删除数据成功!");
}else {
DbManager.toastMessage(this,"删除数据失败!");
}
db.close();
附项目源码如下:

activity_main.xml


android:id="@+id/activity_main"
android:layout_
android:layout_
android:orientation="vertical">

android:id="@+id/create_db"
android:layout_
android:layout_
android:text="创建数据库"
android:textColor="#fff"
android:background="#f37400"
android:layout_marginTop="10dp"
android:layout_marginLeft="14dp"/>

android:id="@+id/insert_db"
android:layout_
android:layout_
android:text="插入数据"
android:textColor="#fff"
android:background="#f37400"
android:layout_marginLeft="14dp"
android:layout_marginTop="10dp"/>

android:id="@+id/update_db"
android:layout_
android:layout_
android:text="修改数据"
android:textColor="#fff"
android:background="#f37400"
android:layout_marginLeft="14dp"
android:layout_marginTop="10dp"/>

android:id="@+id/delete_db"
android:layout_
android:layout_
android:text="删除数据"
android:textColor="#fff"
android:background="#f37400"
android:layout_marginLeft="14dp"
android:layout_marginTop="10dp"/>

android:id="@+id/insertapi_db"
android:layout_
android:layout_
android:text="api插入数据"
android:textColor="#fff"
android:background="#f37400"
android:layout_marginLeft="14dp"
android:layout_marginTop="10dp"/>

android:id="@+id/updateapi_db"
android:layout_
android:layout_
android:text="api修改数据"
android:textColor="#fff"
android:background="#f37400"
android:layout_marginLeft="14dp"
android:layout_marginTop="10dp"/>

android:id="@+id/deleteapi_db"
android:layout_
android:layout_
android:text="api删除数据"
android:textColor="#fff"
android:background="#f37400"
android:layout_marginLeft="14dp"
android:layout_marginTop="10dp"/>


Constant.java

package com.jarchie.sqliteproject.db;

/**
* Created by Jarchie on 17/1/7.
* 创建数据库参数的常量类
*/

public class Constant {
public static final String DATABASE_NAME = "info.db"; //数据库名称
public static final int DATABASE_VERSION = 1; //数据库的版本号
public static final String TABLE_NAME = "person"; //表名
public static final String _ID = "_id";
public static final String NAME = "name";
public static final String AGE = "age";
}
MySqliteHelper.java

package com.jarchie.sqliteproject.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

/**
* Created by Jarchie on 17/1/7.
* 本类提供了创建数据库和更新数据库的方法
* 提供了获取数据库对象的函数
*/

public class MySqliteHelper extends SQLiteOpenHelper{
private static final String TAG = "MySqliteHelper";

/**
* 构造函数
* @param context 上下文对象
* @param name 表示创建的数据库的名称
* @param factory 游标工厂
* @param version 当前创建数据库的版本,要求>=1
*/
public MySqliteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}

public MySqliteHelper(Context context){
super(context,Constant.DATABASE_NAME,null,Constant.DATABASE_VERSION);
}

/**
* 当数据库创建时回调的函数
* @param db 数据库对象
*/
@Override
public void onCreate(SQLiteDatabase db) {
Log.e(TAG, "onCreate: " + "------onCreate-----" );
String sql = "create table "+Constant.TABLE_NAME+"("+
Constant._ID+" Integer primary key,"+Constant.NAME+
" varchar(10),"+Constant.AGE+" Integer)";
db.execSQL(sql); //执行sql语句
}

/**
* 当数据库版本更新时回调的函数
* @param db 数据库对象
* @param oldVersion 数据库旧版本
* @param newVersion 数据库新版本
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.e(TAG, "onUpgrade: " + "------onUpgrade-----" );
}

/**
* 当数据库打开时回调的函数
* @param db 数据库对象
*/
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
Log.e(TAG, "onOpen: " + "------onOpen-----" );
}

}
DbManager.java

package com.jarchie.sqliteproject.utils;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.text.TextUtils;
import android.widget.Toast;
import com.jarchie.sqliteproject.db.MySqliteHelper;

/**
* Created by Jarchie on 17/1/7.
* 对数据库操作的工具类,降低代码的耦合度
*/

public class DbManager {
/**
* 采用单例模式构建helper对象
*/
private static MySqliteHelper helper;
public static MySqliteHelper getInstance(Context context){
if (helper == null){
helper = new MySqliteHelper(context);
}
return helper;
}

/**
* 根据sql语句在数据库中执行语句
* @param db 数据库对象
* @param sql sql语句
*/
public static void execSql(SQLiteDatabase db,String sql){
if (db != null){
if (!TextUtils.isEmpty(sql)){
db.execSQL(sql);
}
}
}

/**
* 定义公共的吐司方法
* @param context 上下文对象
* @param message 吐司信息
*/
public static void toastMessage(Context context,String message){
Toast.makeText(context,message,Toast.LENGTH_SHORT).show();
}

}
MainActivity.java

package com.jarchie.sqliteproject;

import android.app.Activity;
import android.content.ContentValues;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import com.jarchie.sqliteproject.db.Constant;
import com.jarchie.sqliteproject.db.MySqliteHelper;
import com.jarchie.sqliteproject.utils.DbManager;

public class MainActivity extends Activity implements View.OnClickListener{
private Button createBtn,insertBtn,updateBtn,deleteBtn,apiinsertBtn,apiupdateBtn,apideleteBtn;
private MySqliteHelper helper;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
helper = DbManager.getInstance(this);
initView();
initWidgetListener();
}

/**
* 初始化控件
*/
private void initView(){
createBtn = (Button) findViewById(R.id.create_db);
insertBtn = (Button) findViewById(R.id.insert_db);
updateBtn = (Button) findViewById(R.id.update_db);
deleteBtn = (Button) findViewById(R.id.delete_db);
apiinsertBtn = (Button) findViewById(R.id.insertapi_db);
apiupdateBtn = (Button) findViewById(R.id.updateapi_db);
apideleteBtn = (Button) findViewById(R.id.deleteapi_db);
}

/**
* 初始化监听事件
*/
private void initWidgetListener(){
createBtn.setOnClickListener(this);
insertBtn.setOnClickListener(this);
updateBtn.setOnClickListener(this);
deleteBtn.setOnClickListener(this);
apiinsertBtn.setOnClickListener(this);
apiupdateBtn.setOnClickListener(this);
apideleteBtn.setOnClickListener(this);
}

@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.create_db:
createDb();
break;
case R.id.insert_db:
insertData();
break;
case R.id.update_db:
updateData();
break;
case R.id.delete_db:
deleteData();
break;
case R.id.insertapi_db:
apiInsertData();
break;
case R.id.updateapi_db:
apiUpdateData();
break;
case R.id.deleteapi_db:
apiDeleteData();
break;
}
}

//创建数据库
private void createDb(){
/**
* getReadableDatabase()和getWritableDatabase()创建或者打开数据库
* 如果数据库不存在则创建数据库,如果数据库存在直接打开数据库
* 默认情况下两个函数都表示打开或者创建可读可写的数据库对象,如果磁盘已满或者数据库
* 本身权限等情况下getReadableDatabase()打开的是只读数据库
*/
SQLiteDatabase db = helper.getWritableDatabase();
}

//sql语句插入数据
private void insertData(){
SQLiteDatabase db = helper.getWritableDatabase();
String sql = "insert into "+ Constant.TABLE_NAME+" values(1,'Archie',24)";
DbManager.execSql(db,sql);
String sql1 = "insert into "+ Constant.TABLE_NAME+" values(2,'Jackson',25)";
DbManager.execSql(db,sql1);
db.close();
}

//sql语句修改数据
private void updateData(){
SQLiteDatabase db = helper.getWritableDatabase();
String sql2 = "update "+Constant.TABLE_NAME+" set "+Constant.NAME
+"='angel' where "+Constant._ID+"=1";
DbManager.execSql(db,sql2);
db.close();
}

//sql语句删除数据
private void deleteData(){
SQLiteDatabase db = helper.getWritableDatabase();
String sql3 = "delete from "+Constant.TABLE_NAME+" where "+Constant._ID+"=2";
DbManager.execSql(db,sql3);
db.close();
}

//api插入数据
private void apiInsertData(){
SQLiteDatabase db = helper.getWritableDatabase();
/**
* insert(String table, String nullColumnHack, ContentValues values)
* table:表名 nullColumnHack:一般指定为null values:键为String的HashMap集合
* return long 表示插入数据的列数
*/
ContentValues values = new ContentValues();
values.put(Constant._ID,3); //put(字段名,字段值)
values.put(Constant.NAME,"安奇");
values.put(Constant.AGE,24);
long result = db.insert(Constant.TABLE_NAME, null, values);
if (result > 0){
DbManager.toastMessage(this,"插入数据成功!");
}else {
DbManager.toastMessage(this,"插入数据失败!");
}
db.close();
}

//api修改数据
private void apiUpdateData(){
SQLiteDatabase db = helper.getWritableDatabase();
/**
* update(String table, ContentValues values, String whereClause, String[] whereArgs)
* table:表名 values:键为String的HashMap集合
* whereClause:表示当前修改的条件 whereArgs:修改条件的占位符
* return int 修改的条数
*/
ContentValues values1 = new ContentValues();
values1.put(Constant.NAME,"哈哈"); //put(需要修改的字段名,修改后的字段值)
// int count = db.update(Constant.TABLE_NAME, values1,
// Constant._ID + "=3", null);
int count = db.update(Constant.TABLE_NAME, values1, Constant._ID + "=?",
new String[]{"3"});
if (count > 0){
DbManager.toastMessage(this,"修改数据成功!");
}else {
DbManager.toastMessage(this,"修改数据失败!");
}
db.close();
}

//api删除数据
private void apiDeleteData(){
SQLiteDatabase db = helper.getWritableDatabase();
/**
* delete(String table, String whereClause, String[] whereArgs)
* table:删除的表名 whereClause:删除的条件 whereArgs:删除条件的占位符
* return int 删除条数
*/
int size = db.delete(Constant.TABLE_NAME, Constant._ID + "=?", new String[]{"1"});
if (size > 0){
DbManager.toastMessage(this,"删除数据成功!");
}else {
DbManager.toastMessage(this,"删除数据失败!");
}
db.close();
}

}
好了,本篇就先写到这里,未完待续哦!


推荐阅读
  • eclipse学习(第三章:ssh中的Hibernate)——11.Hibernate的缓存(2级缓存,get和load)
    本文介绍了eclipse学习中的第三章内容,主要讲解了ssh中的Hibernate的缓存,包括2级缓存和get方法、load方法的区别。文章还涉及了项目实践和相关知识点的讲解。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • 本文主要复习了数据库的一些知识点,包括环境变量设置、表之间的引用关系等。同时介绍了一些常用的数据库命令及其使用方法,如创建数据库、查看已存在的数据库、切换数据库、创建表等操作。通过本文的学习,可以加深对数据库的理解和应用能力。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • Python实现变声器功能(萝莉音御姐音)的方法及步骤
    本文介绍了使用Python实现变声器功能(萝莉音御姐音)的方法及步骤。首先登录百度AL开发平台,选择语音合成,创建应用并填写应用信息,获取Appid、API Key和Secret Key。然后安装pythonsdk,可以通过pip install baidu-aip或python setup.py install进行安装。最后,书写代码实现变声器功能,使用AipSpeech库进行语音合成,可以设置音量等参数。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 本文介绍了游标的使用方法,并以一个水果供应商数据库为例进行了说明。首先创建了一个名为fruits的表,包含了水果的id、供应商id、名称和价格等字段。然后使用游标查询了水果的名称和价格,并将结果输出。最后对游标进行了关闭操作。通过本文可以了解到游标在数据库操作中的应用。 ... [详细]
  • mysql-cluster集群sql节点高可用keepalived的故障处理过程
    本文描述了mysql-cluster集群sql节点高可用keepalived的故障处理过程,包括故障发生时间、故障描述、故障分析等内容。根据keepalived的日志分析,发现bogus VRRP packet received on eth0 !!!等错误信息,进而导致vip地址失效,使得mysql-cluster的api无法访问。针对这个问题,本文提供了相应的解决方案。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
author-avatar
手机用户2502903761
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有