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

andoridSQLite的使用详解

andoridSQLite的使用详解1、创建数据库a、编写一个类DBHelper继承SQLiteOpenHelper。b、重写SQLiteOpenHel

andorid SQLite 的使用详解

1、创建数据库
a、编写一个类 DBHelper 继承 SQLiteOpenHelper。

b、重写 SQLiteOpenHelper的三个方法:onCreate(第一次创建的时候调用此方法),onUpgrade(更新的
时候调用此方法:参数newVersion 大于 oldBersion时调用),onOpen(每次打开数据库文件时调用)。

c、在 onCreate 方法中创建一个新的数据库文件:
String sql = "create table person(pid integer primary key autoincrement,name varchar(64),address varchar(64))";
db.execSQL(sql);

2、创建数据库的管理类,封装对数据库的增删查找操作。

对数据库进行操作有两种方法:

1、通过SQLiteDatabase调用execSQL方法执行SQLite语言。
/**
* 实现对数据库的添加 删除 修改
*
* @param sql
* @param bindArgs
* @return
*/

public boolean updataBySQL(String sql, Object[] bindArgs) {
boolean falg = false;
database = dbHelper.getWritableDatabase();
try {
database.execSQL(sql, bindArgs);
falg = true;
} catch (Exception e) {
// TODO: handle exception
}
database.close();
return falg;
}

/**
* 单条记录查询
*
* @param sql
* @param selectionArgs
* @return
*/

public Map queryBySQL(String sql, String[] selectionArgs) {
database = dbHelper.getWritableDatabase();
Map map = new HashMap();
Cursor cursor = database.rawQuery(sql, selectionArgs);
int cols_len = cursor.getColumnCount();// 列的个数
while (cursor.moveToNext()) {
for (int i = 0; i String cols_name = cursor.getColumnName(i);
String cols_value = cursor.getString(cursor
.getColumnIndex(cols_name));
if (cols_value == null) {
cols_value = "";
}
map.put(cols_name, cols_value);
}
}
database.close();
return map;
}

/**
* 查找多条记录
*
* @param sql
* @param selectionArgs
* @return
*/

public List> queryMultiMaps(String sql,
String[] selectionArgs) {
database = dbHelper.getWritableDatabase();
List> list = new ArrayList>();
Cursor cursor = database.rawQuery(sql, selectionArgs);
int csls_len = cursor.getColumnCount();
while (cursor.moveToNext()) {// 游标移动到下一个,不为0
Map map = new HashMap();
for (int i = 0; i String cols_name = cursor.getColumnName(i);
String cols_value = cursor.getString(cursor
.getColumnIndex(cols_name));
if (cols_value == null) {
cols_value = "";

}
map.put(cols_name, cols_value);
}
list.add(map);
}
database.close();
return list;
}
2、通过调用SQLiteDatabase子方法实现对数据库的编辑。
/**
* 插入数据
*
* @param table
* 表名
* @param nullColumnHack
* 如果第三个参数values 为Null或者元素个数为0,
* 由于Insert()方法要求必须添加一条除了主键之外其它字段为Null值的记录,为了满足SQL语法的需要,
* insert语句必须给定一个字段名,如:insert into person(name)
* values(NULL),倘若不给定字段名 , insert语句就成了这样: insert into person()
* values(),显然这不满足标准SQL的语法。对于字段名,建议使用主键之外的字段,如果使用了INTEGER类型的主键字段,
* 执行类似insert into person(personid)
* values(NULL)的insert语句后,该主键字段值也不会为NULL。如果第三个参数values
* 不为Null并且元素的个数大于0 ,可以把第二个参数设置为null。
* @param values
* 修改后的值 new一个ContentValues中,再添加
* @return
*/

public boolean insert(String table, String nullColumnHack,
ContentValues values) {
database = dbHelper.getWritableDatabase();
boolean flag = false;
long id = database.insert(table, nullColumnHack, values);
flag = id > 0 ? true : false;
database.close();
return flag;
}

/**
* 更新数据,修改数据 update person set name = ?, address=? where pid = ?
*
* @param table
* 表名
* @param values
* 对应的值
* @param whereClause
* where条件
* @param whereArgs
* 占位符
* @return
*/

public boolean update(String table, ContentValues values,
String whereClause, String[] whereArgs) {
database = dbHelper.getWritableDatabase();
boolean flag = false;
long id = database.update(table, values, whereClause, whereArgs); // 返回值:影响了的数据库行数
flag = id > 0 ? true : false;
database.close();
return flag;
}

/**
* 删除 delete from person where pid = ?
*
* @param table
* 表名
* @param whereClause
* where条件
* @param whereArgs
* 占位符
* @return
*/

public boolean delete(String table, String whereClause, String[] whereArgs) {
boolean flag = false;
database = dbHelper.getWritableDatabase();
long id = database.delete(table, whereClause, whereArgs);
flag = id > 0 ? true : false;
database.close();
return flag;
}

/**
* 数据库查询 SQL标准写法: select [distinct] [columnName],...from tableName
* [where][selection][selectionArgs
* ][selectionArgs][groupBy][having][orderBy][limit];
*
* @param distinct
* 去掉重复的记录
* @param table
* 表名
* @param columns
* 列名
* @param selection
* 查询的过滤条件
* @param selectionArgs
* 过滤条件的值
* @param groupBy
* 分组
* @param having
* 对分组进行过滤的条件
* @param orderBy
* 排序
* @param limit
* 分页
* @return
*/

public Cursor query(boolean distinct, String table, String[] columns,
String selection, String[] selectionArgs, String groupBy,
String having, String orderBy, String limit) {
database = dbHelper.getWritableDatabase();
Cursor cursor = null;
cursor = database.query(distinct, table, columns, selection,
selectionArgs, groupBy, having, orderBy, limit);
return cursor;
}
两种方法对数据库的操作是一样的,第一种方法适合熟悉SQLite语言的人使用,第二种对SQLite语言不熟悉的人也可以使用。

对数据库操作结束后应当关闭数据库:
/**
* 关闭数据库
*/

public void close_SQLite() {
if (database != null) {
database.close();
}
}

将数据库操作封装后,以后操作数据库只要调用该包就可以,方便快捷。

目录结构:
这里写图片描述

MainActivity类代码:

import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

}

DBHelper类代码:

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

public class DBHelper extends SQLiteOpenHelper {// 创建,打开,管理数据库
private static final String DB_NAME = "mydb.db"; // 数据库名字
private static final int VERSION = 1; // 数据库版本

public DBHelper(Context context) {
super(context, DB_NAME, null, VERSION);
// TODO Auto-generated constructor stub
}

@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
// 数据库建表语句
String sql = "create table person(pid integer primary key autoincrement,name varchar(64),address varchar(64))";
db.execSQL(sql);
}

// 更新
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub

}
//打开数据库
@Override
public void onOpen(SQLiteDatabase db) {
// TODO Auto-generated method stub
super.onOpen(db);
}
}

DBManager 类代码:

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class DBManager {
private DBHelper dbHelper;
private SQLiteDatabase database;

public DBManager(Context context) {
// TODO Auto-generated constructor stub
dbHelper = new DBHelper(context);

}

/**
* 实现对数据库的添加 删除 修改
*
* @param sql
* @param bindArgs
* @return
*/

public boolean updataBySQL(String sql, Object[] bindArgs) {
boolean falg = false;
database = dbHelper.getWritableDatabase();
try {
database.execSQL(sql, bindArgs);
falg = true;
} catch (Exception e) {
// TODO: handle exception
}
database.close();
return falg;
}

/**
* 单条记录查询
*
* @param sql
* @param selectionArgs
* @return
*/

public Map queryBySQL(String sql, String[] selectionArgs) {
database = dbHelper.getWritableDatabase();
Map map = new HashMap();
Cursor cursor = database.rawQuery(sql, selectionArgs);
int cols_len = cursor.getColumnCount();// 列的个数
while (cursor.moveToNext()) {
for (int i = 0; i String cols_name = cursor.getColumnName(i);
String cols_value = cursor.getString(cursor
.getColumnIndex(cols_name));
if (cols_value == null) {
cols_value = "";
}
map.put(cols_name, cols_value);
}
}
database.close();
return map;
}

/**
* 查找多条记录
*
* @param sql
* @param selectionArgs
* @return
*/

public List> queryMultiMaps(String sql,
String[] selectionArgs) {
database = dbHelper.getWritableDatabase();
List> list = new ArrayList>();
Cursor cursor = database.rawQuery(sql, selectionArgs);
int csls_len = cursor.getColumnCount();
while (cursor.moveToNext()) {// 游标移动到下一个,不为0
Map map = new HashMap();
for (int i = 0; i String cols_name = cursor.getColumnName(i);
String cols_value = cursor.getString(cursor
.getColumnIndex(cols_name));
if (cols_value == null) {
cols_value = "";

}
map.put(cols_name, cols_value);
}
list.add(map);
}
database.close();
return list;
}

// -----------使用SQLiteDatabase中方法对数据库进行操作----------
/**
* 插入数据
*
* @param table
* 表名
* @param nullColumnHack
* 如果第三个参数values 为Null或者元素个数为0,
* 由于Insert()方法要求必须添加一条除了主键之外其它字段为Null值的记录,为了满足SQL语法的需要,
* insert语句必须给定一个字段名,如:insert into person(name)
* values(NULL),倘若不给定字段名 , insert语句就成了这样: insert into person()
* values(),显然这不满足标准SQL的语法。对于字段名,建议使用主键之外的字段,如果使用了INTEGER类型的主键字段,
* 执行类似insert into person(personid)
* values(NULL)的insert语句后,该主键字段值也不会为NULL。如果第三个参数values
* 不为Null并且元素的个数大于0 ,可以把第二个参数设置为null。
* @param values
* 修改后的值 new一个ContentValues中,再添加
* @return
*/

public boolean insert(String table, String nullColumnHack,
ContentValues values) {
database = dbHelper.getWritableDatabase();
boolean flag = false;
long id = database.insert(table, nullColumnHack, values);
flag = id > 0 ? true : false;
database.close();
return flag;
}

/**
* 更新数据,修改数据 update person set name = ?, address=? where pid = ?
*
* @param table
* 表名
* @param values
* 对应的值
* @param whereClause
* where条件
* @param whereArgs
* 占位符
* @return
*/

public boolean update(String table, ContentValues values,
String whereClause, String[] whereArgs) {
database = dbHelper.getWritableDatabase();
boolean flag = false;
long id = database.update(table, values, whereClause, whereArgs); // 返回值:影响了的数据库行数
flag = id > 0 ? true : false;
database.close();
return flag;
}

/**
* 删除 delete from person where pid = ?
*
* @param table
* 表名
* @param whereClause
* where条件
* @param whereArgs
* 占位符
* @return
*/

public boolean delete(String table, String whereClause, String[] whereArgs) {
boolean flag = false;
database = dbHelper.getWritableDatabase();
long id = database.delete(table, whereClause, whereArgs);
flag = id > 0 ? true : false;
database.close();
return flag;
}

/**
* 数据库查询 SQL标准写法: select [distinct] [columnName],...from tableName
* [where][selection][selectionArgs
* ][selectionArgs][groupBy][having][orderBy][limit];
*
* @param distinct
* 去掉重复的记录
* @param table
* 表名
* @param columns
* 列名
* @param selection
* 查询的过滤条件
* @param selectionArgs
* 过滤条件的值
* @param groupBy
* 分组
* @param having
* 对分组进行过滤的条件
* @param orderBy
* 排序
* @param limit
* 分页
* @return
*/

public Cursor query(boolean distinct, String table, String[] columns,
String selection, String[] selectionArgs, String groupBy,
String having, String orderBy, String limit) {
database = dbHelper.getWritableDatabase();
Cursor cursor = null;
cursor = database.query(distinct, table, columns, selection,
selectionArgs, groupBy, having, orderBy, limit);
return cursor;
}

/**
* 关闭数据库
*/

public void close_SQLite() {
if (database != null) {
database.close();
}
}
}

使用单元测试的测试代码(使用单元测试前不要忘记在清单文件中添加单元测试):

import java.util.List;
import java.util.Map;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.test.AndroidTestCase;

public class myTset extends AndroidTestCase {
// 创建数据库
public void initTable() {
DBHelper manage_SQLite = new DBHelper(getContext());
SQLiteDatabase sqLiteDatabase = manage_SQLite.getReadableDatabase();// manage_SQLite.getWritableDatabase();
// 调用这两个方法之一数据库才会创建
}

public void insert() { // 添加
String sql = "insert into person(name,address) values(?,?)";
Object[] bin = { "光电科技股份有限公司", "长沙" };
DBManager manager = new DBManager(getContext());
manager.updataBySQL(sql, bin);
}

public void update() { // 修改 更新 把 pid等于4的行,name 更新成 "郭jian凯",address修改成"长沙"
String sql = "update person set name = ?, address=? where pid = ?";
Object[] bin = { "郭凯", "长沙", 4 };
DBManager manager = new DBManager(getContext());
manager.updataBySQL(sql, bin);
}

public void delete() { // 删除 删除 pid等于4的行
String sql = "delete from person where pid = ?";
Object[] bin = { 4 };
DBManager manager = new DBManager(getContext());
manager.updataBySQL(sql, bin);
}

public void query1() {// 查询单条记录
String sql = "select * from person where pid = ?";
DBManager manager = new DBManager(getContext());
Map map = manager.queryBySQL(sql, new String[] { "2" });
System.out.println("-->>" + map.get("name"));
System.out.println("-->>" + map.get("address"));
}

public void query2() {// 查询多条记录 查找出 name 列包含 “郭”的行
String sql = "select * from person where name like ?";
DBManager manager = new DBManager(getContext());
List> list = manager.queryMultiMaps(sql,
new String[] { "%郭%" });
for (Map map2 : list) {
System.out.println("-->>" + map2.get("name"));
System.out.println("-->>" + map2.get("address"));
}

}

// -----------使用SQLiteDatabase 的方法操作数据库--------
public void insert1() { // 添加
// 添加数据 使用SQLiteDatabase带的方法
DBManager manager = new DBManager(getContext());
ContentValues cOntentValues= new ContentValues();
contentValues.put("name", "ss");
contentValues.put("address", "sss沙");
manager.insert("person", null, contentValues);
}

public void update2() { // 修改 更新 将表“person”中pid = 4的行,中内容修改成 contentValues的值
DBManager manager = new DBManager(getContext());
ContentValues cOntentValues= new ContentValues();
contentValues.put("name", "修改");
contentValues.put("address", "修改");
manager.update("person", contentValues, "pid = ?", new String[] { "5" });
}

public void delete2() { // 删除 删除 pid等于2 的行
DBManager manager = new DBManager(getContext());
manager.delete("person", "pid = ?", new String[] { "2" });
}

public void query() { // 查找
DBManager manager = new DBManager(getContext());
Cursor cursor = manager.query(false, "person", null, null, null, null,
null, null, null);
while (cursor.moveToNext()) {
System.out.println("--query->>"
+ cursor.getString(cursor.getColumnIndex("name")));
}
manager.close_SQLite();// 关闭数据库
}
}

http://blog.csdn.net/q296264785/article/details/53172873


推荐阅读
  • 如何在Java中使用DButils类
    这期内容当中小编将会给大家带来有关如何在Java中使用DButils类,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。D ... [详细]
  • 属性类 `Properties` 是 `Hashtable` 类的子类,用于存储键值对形式的数据。该类在 Java 中广泛应用于配置文件的读取与写入,支持字符串类型的键和值。通过 `Properties` 类,开发者可以方便地进行配置信息的管理,确保应用程序的灵活性和可维护性。此外,`Properties` 类还提供了加载和保存属性文件的方法,使其在实际开发中具有较高的实用价值。 ... [详细]
  • SQL 查询实体优化与实战技巧分享 ... [详细]
  • 本教程详细介绍了如何使用 Spring Boot 创建一个简单的 Hello World 应用程序。适合初学者快速上手。 ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 在 Ubuntu 中遇到 Samba 服务器故障时,尝试卸载并重新安装 Samba 发现配置文件未重新生成。本文介绍了解决该问题的方法。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 如何在Linux服务器上配置MySQL和Tomcat的开机自动启动
    在Linux服务器上部署Web项目时,通常需要确保MySQL和Tomcat服务能够随系统启动而自动运行。本文将详细介绍如何在Linux环境中配置MySQL和Tomcat的开机自启动,以确保服务的稳定性和可靠性。通过合理的配置,可以有效避免因服务未启动而导致的项目故障。 ... [详细]
  • C# 中 SQLite 报错:在 "\\s\\" 附近出现语法错误,如何解决? ... [详细]
  • 大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式
    大类|电阻器_使用Requests、Etree、BeautifulSoup、Pandas和Path库进行数据抓取与处理 | 将指定区域内容保存为HTML和Excel格式 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • 您的数据库配置是否安全?DBSAT工具助您一臂之力!
    本文探讨了Oracle提供的免费工具DBSAT,该工具能够有效协助用户检测和优化数据库配置的安全性。通过全面的分析和报告,DBSAT帮助用户识别潜在的安全漏洞,并提供针对性的改进建议,确保数据库系统的稳定性和安全性。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 在使用 Qt 进行 YUV420 图像渲染时,由于 Qt 本身不支持直接绘制 YUV 数据,因此需要借助 QOpenGLWidget 和 OpenGL 技术来实现。通过继承 QOpenGLWidget 类并重写其绘图方法,可以利用 GPU 的高效渲染能力,实现高质量的 YUV420 图像显示。此外,这种方法还能显著提高图像处理的性能和流畅性。 ... [详细]
author-avatar
手机用户2502855107
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有