Android使用SQLite数据库的示例
作者:这个杀手不太累 发布时间:2023-09-17 07:36:58
一. 简介
SQLite数据库是一个轻量级的DBMS(数据库管理系统)。SQLite使用单个文件存储数据,Android标准库包含SQLite库以及配套使用的一些Java辅助类。主要特点:轻量级,单一文件,跨平台,开源。
二. Android中SQLite数据库的使用
1、创建SQLite数据库
SQLiteDatabase db=
SQLiteDatabase.openOrCreateDatabase(
"/data/data/" + getPackageName() + "/test.db",
null);
执行完这条语句,可以在adb shell下进入/data/data/package-name/下看到刚才创建的数据库文件
在Android中使用SQLiteDatabase的静态方法
openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory)打开或者创建一个数据库。
它会自动去检测是否存在这个数据库,如果存在则打开,反之不存在就创建一个数据库;创建成功则返回一个SQLiteDatabase对象,失败抛出FileNotFoundException异常。
除了以上方法,Android还提供了SQLiteOpenHelper这个类来创建数据库,首先继承SQLiteOpenHelper,重写onCreate和onUpgrade方法及构造方法
public class MySqliteHelper extends SQLiteOpenHelper{
public MySqliteHelper(Context context) {
super(context, "mysqlite.db", null, 1);
//传入四个参数
//第一个参数context 上下文对象
//第二个参数mysqlite.db 数据库名称(文件名)
//第三个参数一般为null
//第四个参数数据库版本号,这里写1
}
@Override
public void onCreate(SQLiteDatabase db) {
/* 数据库创建的时候会回调此方法,可以用db对象执行SQL语
* 句,创建所需要的表
*/
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//当数据库升级时调用此方法
}
}
接着在需要创建数据库的时候调用
SQLiteOpenHelper dbHelper = new MySqliteHelper(this);
SQLiteDatabase db = dbHelper.getWritableDatabase();
使用SQLiteOpenHelper创建的数据库,保存在/data/data/package-name/databases/目录下,通过adb shell可以看到创建的数据库文件
2、创建数据库中的数据表
数据库创建完成后,要创建保存数据的表,表是存放在数据库中的。示例代码入下
private void createTable(SQLiteDatabase db){
//SQL语句
String sql =
"create table stutable(_id integer primary key autoincrement,name text,age integer)";
db.execSQL(sql);
}
这里附上SQLite数据类型
NULL: 这个值可为空值
VARCHAR(n):长度不固定且其最大长度为 n 的字串,n不能超过 4000。
CHAR(n):长度固定为n的字串,n不能超过 254。
INTEGER: 值被标识为整数,依据值的大小可以依次被存储为1,2,3,4,5,6,7,8….
REAL: 所有值都是浮动的数值,被存储为8字节的IEEE浮动标记序号.
TEXT: 值为文本字符串,使用数据库编码存储(TUTF-8, UTF-16BE or UTF-16-LE).
BLOB: 值是BLOB数据块,以输入的数据格式进行存储。如何输入就如何存储,不改变格式。
DATA :包含了 年份、月份、日期
执行完上述语句,可以通过ADM将数据库文件导出到电脑上
通过可视化工具打开数据库文件可以看到之前创建的表,以及定义的表字段
除了执行定义创建表的方法外,还可以在继承SQLiteOpenHelper类中的onCreate方法来初始化表结构,在后面的例子使用继承SQLiteOpenHelper方式创建表。
3、对表进行操作(数据表的增删改查)
增:在表中增加数据,可以使用SQLiteDatabase类中提供的execSQL(String sql)执行一条插入数据的SQL语句来插入数据,不过,AndroidSQLiteDatabase类提供了更为简单的方法来执行插入数据操作
//SQLiteDatabase类中提供的方法
public long insert(
String table,//要操作表名
String nullColumnHack,//空列的默认值
ContentValues values
//ContentValues封装了列名称和列值的Map
);
private void insertToTable(SQLiteDatabase db){
ContentValues cv = new ContentValues();
cv.put("name","wxq");
cv.put("age",11);
db.insert("stutable",null,cv);
}
执行insertTable方法,再次导出数据库可以看到stutable表中增加了一条数据
删:好吧,刚插入一条数据。。。
同样Android提供了delete方法
//SQLiteDatabase类中提供的方法
public int delete(
String table,//表名称
String whereClause,//删除条件
String[] whereArgs); //删除条件值数组
private void deleteToTable(SQLiteDatabase db){
//删除条件,这里以name为条件,也可以是age = ?
String whereClasuse = "name = ?";
//删除条件参数,
String[] whereArgs = new String[]{"wxq"};
//执行删除
db.delete("stutable",whereClasuse,whereArgs);
}
执行上述语句,将会删除stutable表中刚才插入的数据。
改:
//SQLiteDatabase类中提供的方法
public int update(
//表名称
String table,
//和行列ContentValues键值对应的key-value
ContentValues values,
//更新条件
String whereClause,
//更新条件数组
String[] whereArgs
);
private void updateToTable(SQLiteDatabase db){
//实例化ContentValues
ContentValues cv= new ContentValues();
cv.put("age",23);
//更新条件
String whereClause = "name = ?";
//更新条件数组
String[] whereArgs = new String[]{"wxq"};
db.update("stutable",cv,whereClause,whereArgs);
}
执行完更新语句,导出数据库文件,在可视化工具中查看
查:在Android中查询数据是通过Cursor类来实现的,可以使用SQLiteDatabase.query()方法时,这里使用别一个方法rawQuery
public Cursor rawQuery(
String sql,//查询的SQL语句
String[] selectionArgs//当SQL语句中含有?,这里代表值
);
public void queryToTable(SQLiteDatabase db){
String sql = "select * from stutable";//全查
Cursor c = db.rawQuery(sql,null);//这里会返回一个Cursor(游标)对象
}
使用SQLite的一个Demo(英雄管理系统)
主要操作数据库的代码
public class HeroSqliteManager {
private SQLiteOpenHelper dbHelper;
private SQLiteDatabase db;
private static HeroSqliteManager instance;
private static final String TABLE_NAME = "hero";
private static final String NAME_FIELD = "name";
private static final String ICOID_FIELD = "icoId";
private static final String ATTACK_FIELD = "attack";
private static final String DEFENSE_FIELD = "defense";
public static HeroSqliteManager getInstance() {
if (instance == null) {
synchronized (HeroSqliteManager.class) {
if (instance == null) {
instance = new HeroSqliteManager();
}
}
}
return instance;
}
private HeroSqliteManager() {
dbHelper = new HeroSqliteHelper(HeroApplication.getContext());
db = dbHelper.getWritableDatabase();
}
/**
* 插入记录
* @param hero
*/
public void insertData(Hero hero) {
ContentValues cv = new ContentValues();
cv.put(NAME_FIELD, hero.name);
cv.put(ICOID_FIELD, hero.icoId);
cv.put(ATTACK_FIELD, hero.attack);
cv.put(DEFENSE_FIELD, hero.defense);
db.insert(TABLE_NAME, null, cv);
}
/**
* 删除记录
* @param
*/
public void deleteData(int id) {
String whereClasuse = "_id = ?";
String[] whereArgs = new String[]{String.valueOf(id)};
db.delete(TABLE_NAME, whereClasuse, whereArgs);
}
/**
* 修改记录
* @param hero
*/
public void updateData(Hero hero) {
ContentValues cv = new ContentValues();
cv.put(NAME_FIELD, hero.name);
cv.put(ICOID_FIELD, hero.icoId);
cv.put(ATTACK_FIELD, hero.attack);
cv.put(DEFENSE_FIELD, hero.defense);
String whereClasuse = "_id = ?";
String[] whereArgs = new String[]{String.valueOf(hero.id)};
db.update(TABLE_NAME, cv, whereClasuse, whereArgs);
}
/**
* 查询所有的英雄
* @return
*/
public List<Hero> selectData() {
List<Hero> heroList = new ArrayList<>();
Cursor c = db.rawQuery("select * from " + TABLE_NAME, null);
while (c.moveToNext()) {
Hero hero = new Hero();
hero.id = c.getInt(c.getColumnIndex("_id"));
hero.name = c.getString(c.getColumnIndex(NAME_FIELD));
hero.icoId = c.getInt(c.getColumnIndex(ICOID_FIELD));
hero.attack = c.getInt(c.getColumnIndex(ATTACK_FIELD));
hero.defense = c.getInt(c.getColumnIndex(DEFENSE_FIELD));
heroList.add(hero);
}
c.close();
return heroList;
}
/**
* 按name查询
* @param name
* @return
*/
public Hero selectForName(String name) {
Cursor c = db.rawQuery("select * from " + TABLE_NAME + " where name = ?", new String[]{name});
Hero hero = null;
if (c.moveToNext()) {
hero = new Hero();
hero.id = c.getInt(c.getColumnIndex("_id"));
hero.name = c.getString(c.getColumnIndex(NAME_FIELD));
hero.icoId = c.getInt(c.getColumnIndex(ICOID_FIELD));
hero.attack = c.getInt(c.getColumnIndex(ATTACK_FIELD));
hero.defense = c.getInt(c.getColumnIndex(DEFENSE_FIELD));
}
c.close();
return hero;
}
public void destroy() {
// if (db != null) {
// db.close();
// }
// db = null;
}
}
SQLiteDemo
来源:http://blog.csdn.net/zhe_ge_sha_shou/article/details/54566123


猜你喜欢
- 在测试过程中,我们有时候需要一个唯一不重复的值(比如order_id)。我之前一直用的时间戳+计数器/随机函数拼接,但是有时候效果不太好,今
- AlarmManager通常用来开发手机闹钟,并且它是一个全局定时器,可在指定时间或指定周期启动其他组件(包括Activity,Servic
- Springboot添加server.servlet.context-pathserver.servlet.context-path配置的作
- 本文涉及3个基本点:1、因为很多公司的内网都设有代理,浏览器通过ip与port上网,而java代码模拟http get方式同样需要外网代理;
- 本文实例为大家分享了java音乐播放器的具体代码,供大家参考,具体内容如下源码:package baidu;import java.awt.
- 本文演示android中图片加载到内存首先设计界面:代码如下:<LinearLayout xmlns:android="ht
- App 启动方式冷启动App 没有启动过或 App 进程被杀,系统中不存在该 App 进程,此时启动即为冷启动。需要创建 App 进程,加载
- public class OracleJdbcTest { &nbs
- 继承什么是继承呢?继承(Inheritance)是一种联结类与类的层次模型。指的是一个类(称为子类、子接口)继承另外的一个类(称为父类、父接
- 本文实例为大家分享了Android实现折线图小工具的具体代码,供大家参考,具体内容如下1.LineChart类public class Li
- 写在前面:使用springboot作为web框架,方便开发许多,做分布式开发,dubbo又不可少,那么怎么整合在一起呢,跟我学一遍,至少会用
- 一种方法是可以在窗体的属性面板将窗体的 ControlBox属性设置为false,或者在窗体的构造函数中这样写:public F
- Android开发中有时需要在应用中或进程间传递对象,下面详细介绍Intent使用Bundle传递对象的方法。被传递的对象需要先实现序列化,
- 参考答案java.sql.Date 是 java.util.Date 的子类java.util.Date 是 JDK 中的日期类,精确到时、
- 前言有时,我们可能需要从 PDF 文档中提取表格数据,例如,当PDF发票的表格中存储了一些有用的信息,需要提取数据以进行进一步分析时。在这篇
- 从java14开始, switch语句有了一个很大的调整, 这就让swicth语句有了更多的操作和选择,在代码上,更加的简便灵活.switc
- Android 自定义标题栏的实例详解开发 Android APP 经常会用到自定义标题栏,而有多级页面的情况下还需要给自定义标
- 在Android Studio 2.1 Preview 3之后,官方开始支持双向绑定了。可惜目前Google并没有在Data Binding
- 本文实例为大家分享了Android百度地图定位、显示用户当前位置的工具类,供大家参考,具体内容如下1、构建定位Option的工具类impor
- 使用java语言用集合存储数据实现学生信息管理系统,在控制台上编译执行可以实现基本的学生信息增加、删除、修改、查询功能IO版可以参考我的另外