Android数据存储之SQLite
SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,占用资源非常少,只有几百KB内存。支持Windows/Linux/Unix等等主流的操作系统,同时能够跟其他程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite是当前使用最广泛的数据库,基于以上优点,Android系统采用SQLite数据库。
SQLiteOpenHelper介绍
Android应用程序为了对数据库进行管理,提供了一个抽象类SQLiteOpenHelper,SQLiteOpenHelper类提供了两个重要的方法,分别是 onCreate()和 onUpgrade(),onCreate用于初次使用软件时生成数据库表,onUpgrade用于升级软件时更新数据库表结构。
当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候,如果数据库不存在,Android系统会自动生成一个数据库,接着调用onCreate()方法。onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里可以生成数据库表结构及添加一些应用使用到的初始化数据。
onUpgrade()方法在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号,而数据库的版本是由程序员控制的。
假设现在的版本是1,升级软件时希望更新用户手机里的数据库表结构,为了实现这一目的,可以把原来的数据库版本设置为2,并且在onUpgrade()方法里面实现表结构的更新。当软件的版本升级次数比较多,这时在onUpgrade()方法里面可以根据原版号和目标版本号进行判断,然后做出相应的表结构及数据更新。
Demo的实现
先来看一个页面:
布局就不用写了,就是四个按钮,实现的目的就是在生成Person数据库,同时生成一个表,然后操作Person中的数据:
首先需要重写一下抽象类SQLiteOpenHelper中的方法
public class MySQLDBHelper extends SQLiteOpenHelper { private static final String DBname="Person.db";
private static final int version=1;
private String tag="MySQLDBHelper"; public MySQLDBHelper(Context context) {
super(context, DBname, null, version);
Log.i(tag, "测试");
} @Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
Log.i(tag, "Person数据库中Person创建前");
String sqlString="create table Person (id integer primary key autoincrement,Name nvarchar(200),Address nvarchar(200))";
db.execSQL(sqlString);
Log.i(tag, "Person数据库中Person创建成功");
} @Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO Auto-generated method stub
Log.i(tag, "更新数据库,暂时不需要使用");
} }
构造函数中的数据库名称和版本号都是自己可以固定一下,测试就没有传那么多参数,,多说一下这个@Override:
@Override是伪代码,表示重写(当然不写也可以),不过写上有两点好处:
1、可以当注释用,方便阅读;
2、编译器可以给你验证@Override下面的方法名是否是你父类中所有的,如果没有则报错。例如,你如果没写@Override,而你下面的方法名写错了,这时你的编译器是可以编译通过的,因为编译器以为这个方法是你的子类中自己增加的方法。
插入数据调用,这里获取SQLiteDatabase,让后把拼接好的sql直接传入执行就OK了:
public void insert(View view) {
SQLiteDatabase database = dbhelper.getWritableDatabase();
String sql = "insert into Person values(NULL,?,?)";
database.execSQL(sql, new Object[] { "FlyElephant", "北京" });
Log.i(tag, "插入成功");
}
更新数据,这里注意一下ContentValues的使用,键值对的顺序:
public void update(View view) {
SQLiteDatabase database = dbhelper.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put("Address", "深圳");
database.update("Person", contentValues, "Name=?",
new String[] { "FlyElephant" });
Log.i(tag, "更新成功");
}
查询数据,这里用到了游标,类似于C#中SqlDataReader的使用,moveToNext可以满足基本需求:
public void query(View view) {
SQLiteDatabase database = dbhelper.getReadableDatabase();
Cursor cursor = database.rawQuery("select * from Person", null);
if (cursor.getCount()>0) {
while (cursor.moveToNext()) {
String nameString = cursor.getString(cursor.getColumnIndex("Name"));
String addreString = cursor.getString(cursor
.getColumnIndex("Address"));
Log.i(tag, "Name:" + nameString + "--Address:" + addreString);
}
}else {
Log.i(tag, "没有数据");
}
cursor.close();
}
如果你觉得moveToNext()不能满足需求,我就从网上找了一下别人贴的代码,如下:
c.move(int offset); //以当前位置为参考,移动到指定行
c.moveToFirst(); //移动到第一行
c.moveToLast(); //移动到最后一行
c.moveToPosition(int position); //移动到指定行
c.moveToPrevious(); //移动到前一行
c.moveToNext(); //移动到下一行
c.isFirst(); //是否指向第一条
c.isLast(); //是否指向最后一条
c.isBeforeFirst(); //是否指向第一条之前
c.isAfterLast(); //是否指向最后一条之后
c.isNull(int columnIndex); //指定列是否为空(列基数为0)
c.isClosed(); //游标是否已关闭
c.getCount(); //总数据项数
c.getPosition(); //返回当前游标所指向的行数
c.getColumnIndex(String columnName);//返回某列名对应的列索引值
c.getString(int columnIndex); //返回当前行指定列的值
删除数据:
public void delete(View v) {
SQLiteDatabase database = dbhelper.getReadableDatabase();
database.delete("Person", "Name=?", new String[] { "FlyElephant" });
Log.i(tag, "删除成功");
}
可以看下结果:
周末又过完了,希望大家明天上班都精精神神的,开开心心的,醉在周末~
Android数据存储之SQLite的更多相关文章
- Android数据存储:SQLite
Android数据存储之SQLite SQLite:Android提供的一个标准的数据库,支持SQL语句.用来处理数据量较大的数据.△ SQLite特征:1.轻量性2.独立性3.隔离性4.跨平台性5. ...
- Android数据存储之SQLite数据库
Android数据存储 之SQLite数据库简介 SQLite的相关知识,并结合Java实现对SQLite数据库的操作. SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎. ...
- 【转载】Android数据存储之SQLite
SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎.它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行. 在Android中创建的SQLite数据库存储在:/d ...
- Android数据存储之SQLite的操作
Android作为一个应用在移动设备上的操作系统,自然也就少不了数据的存储.然而SQLite作为一个轻型的关系型数据库,基于其轻量.跨平台.多语言接口及安全性等诸多因数考虑,因而Android较大的数 ...
- Android数据存储之SQLite使用
SQLite是D.Richard Hipp用C语言编写的开源嵌入式数据库引擎.它支持大多数的SQL92标准,并且可以在所有主要的操作系统上运行. 在Android中创建的SQLite数据库存储在:/d ...
- android数据存储之Sqlite(二)
SQLite学习笔记 前言:上一章我们介绍了sqlite的一些基本知识以及在dos命令下对sqlite进行的增删改查的操作,这一章我们将在android项目中实际来操作sqlite. 1. SQLit ...
- Android数据存储之Sqlite的介绍及使用
前言: 本来没有打算整理有关Sqlite数据库文章的,最近一直在研究ContentProvider的使用,所有觉得还是先对Sqlite进行一个简单的回顾,也方便研究学习ContentProvider. ...
- Android 数据存储之 SQLite数据库存储
----------------------------------------SQLite数据库---------------------------------------------- SQLi ...
- android数据存储之Sqlite(一)
SQLite学习笔记 1. Sqlite简介 SQLite是一款轻型的数据库,是遵守ACID的关联式数据库管理系统,它的设计目标是嵌入 式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低 ...
- 【Android 应用开发】Android 数据存储 之 SQLite数据库详解
. 作者 :万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/19028665 . SQLiteDataBase示例程序下 ...
随机推荐
- 线段树-最小逆序数hdu1394
title: 线段树-最小逆序数 date: 2018-10-12 17:19:16 tags: acm 算法 刷题 categories: ACM-线段树 概述 这是一道简单的线段树的题,,,当然还 ...
- JAVAEE——宜立方商城05:前台系统搭建、首页展示、Cms系统的实现
1. 学习计划 1.前台系统搭建 2.商城首页展示 3.Cms系统的实现 a) 内容分类管理 b) 内容管理 4.前台内容动态展示 2. 商城首页展示 系统架构: 页面位置: 2.1. 工程搭建 可以 ...
- odoo打包下载
view 视图中下载按钮的编辑 <record id="action_download_zip" model="ir.actions.server"> ...
- iOS Sprite Kit教程之申请和下载证书
iOS Sprite Kit教程之申请和下载证书 模拟器虽然可以实现真机上的一些功能,但是它是有局限的.例如,在模拟器上没有重力感应.相机机等.如果想要进行此方面的游戏的开发,进行程序测试时,模拟器显 ...
- 订单超时、活动过期解决方案:php监听redis key失效触发回调事件
Redis 的 2.8.0 版本之后可用,键空间消息(Redis Keyspace Notifications),配合 2.0.0 版本之后的 SUBSCRIBE 就能完成这个定时任务的操作了,定时的 ...
- ubuntu搭建php运行环境
sudo apt-get install apache2sudo apt-get install php7.0php -v 查看PHP是否安装成功sudo apt-get install libapa ...
- LOJ P3952 时间复杂度 noip 暴力 模拟
https://www.luogu.org/problemnew/show/P3952 模拟,日常认识到自己zz. #include<iostream> #include<cstdi ...
- ACM需要掌握算法
数据结构 栈,队列,链表 哈希表,哈希数组 堆,优先队列 双端队列 可并堆 左偏堆 二叉查找树 Treap 伸展树 并查集 集合计数问题 二分图的识别 平衡二叉树 二叉排序树 线段树 一维线段树 二维 ...
- centos7 下出现 yum list 报错 还有yum groupolist 查询软件组列表报错
之前学到yum在线安装 不晓得那里出错了 跟着老师的教程走的 配置文件也看了 没有错误的 但还报错 这下面是报错的图 在这里说明一下带“#”的都是注释 可以不写的 这个 ...
- CentOS使用chkconfig增加开机服务提示service xxx does not support chkconfig的问题解决
在shell文件的第二行增加如下内容即可: # chkconfig: 2345 10 90 #服务必须在运行级2,3,4,5下被启动或关闭,启动的优先级是90,关闭的优先级是10. # descrip ...