热门标签 | 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


推荐阅读
  • 本文介绍了在使用Laravel和sqlsrv连接到SQL Server 2016时,如何在插入查询中使用输出子句,并返回所需的值。同时讨论了使用CreatedOn字段返回最近创建的行的解决方法以及使用Eloquent模型创建后,值正确插入数据库但没有返回uniqueidentifier字段的问题。最后给出了一个示例代码。 ... [详细]
  • JDK源码学习之HashTable(附带面试题)的学习笔记
    本文介绍了JDK源码学习之HashTable(附带面试题)的学习笔记,包括HashTable的定义、数据类型、与HashMap的关系和区别。文章提供了干货,并附带了其他相关主题的学习笔记。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了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。 ... [详细]
  • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
    本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Whatsthedifferencebetweento_aandto_ary?to_a和to_ary有什么区别? ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 本文主要复习了数据库的一些知识点,包括环境变量设置、表之间的引用关系等。同时介绍了一些常用的数据库命令及其使用方法,如创建数据库、查看已存在的数据库、切换数据库、创建表等操作。通过本文的学习,可以加深对数据库的理解和应用能力。 ... [详细]
  • 在Oracle11g以前版本中的的DataGuard物理备用数据库,可以以只读的方式打开数据库,但此时MediaRecovery利用日志进行数据同步的过 ... [详细]
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社区 版权所有