Android之SqlLite数据库使用

每个应用程序都要使用数据,Android应用程序也不例外,Android使用开源的、与操作系统无关的SQL数据库—SQLite。SQLite第一个Alpha版本诞生于2000年5月,它是一款轻量级数据库,它的设计目标是嵌入式的,占用资源非常的低,只需要几百K的内存就够了。SQLite已经被多种软件和产品使用,Mozilla FireFox就是使用SQLite来存储配置数据的,Android和iPhone都是使用SQLite来存储数据的。
SQLite数据库是D.Richard Hipp用C语言编写的开源嵌入式数据库,支持的数据库大小为2TB。它具有如下特征:
1、轻量级
SQLite和C\S模式的数据库软件不同,它是进程内的数据库引擎,因此不存在数据库的客户端和服务器。使用SQLite一般只需要带上它的一个动态库,就可以享受它的全部功能。而且那个动态库的尺寸也相当小。
2、独立性
SQLite数据库的核心引擎本身不依赖第三方软件,使用它也不需要“安装”,所以在使用的时候能够省去不少麻烦。
3、隔离性
SQLite数据库中的所有信息(比如表、视图、触发器)都包含在一个文件内,方便管理和维护。
4、跨平台
SQLite数据库支持大部分操作系统,除了我们在电脑上使用的操作系统之外,很多手机操作系统同样可以运行,比如Android、Windows Mobile、Symbian、Palm等。
5、多语言接口
SQLite数据库支持很多语言编程接口,比如C\C++、Java、Python、dotNet、Ruby、Perl等,得到更多开发者的喜爱。
6、安全性
SQLite数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程可以在同一时间从同一数据库读取数据,但只有一个可以写入数据。在某个进程或线程向数据库执行写操作之前,必须获得独占锁定。在发出独占锁定后,其他的读或写操作将不会再发生。
下面介绍一下如何在Android平台创建SQLite数据库,方法很简单,我们需要继承这个接口类SQLiteOpenHelper,并实现其中的onCreate与onUpgrade方法:
public class MyDatabaseHelper extends SQLiteOpenHelper {
private static final String db_name = "SQLite_db.db";//数据文件的名字
private static int NUMBER = 1;//当前数据库版本,用于升级
private static final String table_name = "students";//表名
private static String sql = null;//sql语句
public MyDatabaseHelper(Context context) {
super(context, db_name, null, NUMBER);//数据库文件保存在当前应用所在包名:<包>/database/
}
@Override
public void onCreate(SQLiteDatabase db) {
sql = "CREATE TABLE " + table_name + " (" +
"id INTEGER PRIMARY KEY ," +
"name VARCHAR(50) NOT NULL)";//创建数据库的SQL语句
db.execSQL(sql);//执行SQL语句
}
/**
* 当数据库进行升级是调用,这里通过NUMBER值来进行判断,数据库是否升级
*/
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//第一种写法
sql = "ALTER TABLE " + table_name + " ADD sex VARCHAR(2) NULL";
Log.i("sql", sql);
db.execSQL(sql);
//第二种写法
//db.execSQL("ALTER TABLE students ADD sex VARCHAR(10) NULL");
}
}
下面我们在主Activity中创建这个类,然后进行数据的生成:
public class Activityone extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_one);
//创建SqlLite数据库
SQLiteOpenHelper helper = new MyDatabaseHelper(this);
helper.getWritableDatabase();
}
}
到这里我们关于SQLite的创建就为大家分享完毕,需要提示的就是onUpgrade()方法,这个方法一般不执行,当我们的数据库版本发生变化时,才会被执行。
下面我们来一起学习一下如何在Android中来使用SQLite数据库,来完成对数据的增、删、改、查、统计。
我们通过创建一个管理学生信息的数据库来完成对SQLite功能的介绍展示,首先为了方便对学生类进行管理,我们先创建一个学生类:
public class tab_students {
public Integer id;//学生Id
public String name;//学生姓名
public String password;//学生密码
public String school;//学生学校
public tab_students(){
}
public tab_students(int _id,String _name,String _password){
id=_id;
name=_name;
password=_password;
}
public Integer getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String _name) {
name = _name;
}
public String getPassword() {
return password;
}
public void setPassword(String _password) {
password = _password;
}
public String getSchool() {
return school;
}
public void setSchool(String _school) {
school = _school;
}
@Override
public String toString() {
return "id:"+this.getId()+" name:"+this.getName()+" password:"+this.getPassword();
}
}
有了学生类,下面我们创建数据库配置文件:
public class MyTabOpen extends SQLiteOpenHelper{
private static final String db_sql = "SQLiter.db";
private static int NUMBER = 1;
private static final String tab_name = "students";
private static String sql = null;
public MyTabOpen(Context context) {
super(context, db_sql, null, NUMBER);
}
@Override
public void onCreate(SQLiteDatabase db) {
sql = "CREATE TABLE " + tab_name + " (" +
"id INTEGER PRIMARY KEY ," +
"name VARCHAR(20) NOT NULL ," +
"password VARCHAR(20) NOT NULL)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//在更新数据库时,因原先数据库表中已有数据,所以新增加的列属性只能设置为“可以为空”
db.execSQL("ALTER TABLE students ADD school VARCHAR(10) NULL");
}
}
对于这个文件,大家有什么疑问请看上面的SQLite数据库创建讲解。
这里我们的主Activity的代码如下,对于主Activity的布局文件,就不在粘代码了,布局文件全是Button按钮:
public class Activityone extends Activity {
private static tab_students stu = null;
private static tab_service ser = null;
private static int conn = 1;
private TextView mytext = null;
private Button mybutton1 = null;//添加数据
private Button mybutton2 = null;//删除数据
private Button mybutton3 = null;//修改数据
private Button mybutton4 = null;//查询数据
private Button mybutton5 = null;//分页获取数据
private Button mybutton6 = null;//获取数据总数
private Button mybutton7 = null;//普通页面跳转
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_one);
mytext = (TextView)findViewById(R.id.textview);
mytext.setText("增删改查序"+"("+"sql语句"+")");
mybutton1 = (Button)findViewById(R.id.button1);
mybutton2 = (Button)findViewById(R.id.button2);
mybutton3 = (Button)findViewById(R.id.button3);
mybutton4 = (Button)findViewById(R.id.button4);
mybutton5 = (Button)findViewById(R.id.button5);
mybutton6 = (Button)findViewById(R.id.button6);
mybutton7 = (Button)findViewById(R.id.button7);
mybutton1.setOnClickListener(new mybuttonlistener());
mybutton2.setOnClickListener(new mybuttonlistener());
mybutton3.setOnClickListener(new mybuttonlistener());
mybutton4.setOnClickListener(new mybuttonlistener());
mybutton5.setOnClickListener(new mybuttonlistener());
mybutton6.setOnClickListener(new mybuttonlistener());
mybutton7.setOnClickListener(new mybuttonlistener());
}
class mybuttonlistener implements OnClickListener{
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1://添加数据
ser =new tab_service(getApplicationContext());
stu = new tab_students(conn++,"小米","abc123");
ser.save(stu);
break;
case R.id.button2://删除数据
ser =new tab_service(getApplicationContext());
ser.del(1);
break;
case R.id.button3://修改数据
ser =new tab_service(getApplicationContext());
stu = new tab_students(1,"HTC","acm123");
ser.update(stu);
break;
case R.id.button4://查询数据
ser =new tab_service(getApplicationContext());
stu=ser.find(1);
System.out.println(stu.toString());
break;
case R.id.button5://分页获取数据
ser =new tab_service(getApplicationContext());
List<tab_students> list = ser.getScrollDate(0,5);
for(tab_students stu : list){
System.out.println(stu.toString());
}
break;
case R.id.button6://获取数据总数
long number = 0;
ser =new tab_service(getApplicationContext());
number=ser.gettab();
System.out.println("数据库中共有:"+number+"条记录.");
break;
default:
Activityone.this.startActivity(new Intent(Activityone.this,Activitytwo.class));//普通跳转
break;
}
}
}
}
大家可能已经看到了,这里我们对SQLite的操作,都是通过tab_service.java类完成了,下面就为大家揭晓如何对SQLite进行操作:
public class tab_service {
private MyTabOpen mytabopen = null;
private static SQLiteDatabase db = null;
private static String sql = null;
private static final String tab_name = "students";
public tab_service(Context context) {
this.mytabopen = new MyTabOpen(context);//获得数据库操作实例
}
//添加数据
public void save(tab_students students){
db = mytabopen.getWritableDatabase();
sql = "insert into "+tab_name+"(id,name,password) values(?,?,?)";
db.execSQL(sql, new Object[]{students.getId(),students.getName(),students.getPassword()});
db.close(); //为了提高性能sqliter数据库可以不关闭
}
//删除数据
public void del(Integer id){
db = mytabopen.getWritableDatabase();
sql = "delete from "+tab_name+" where id = ?";
db.execSQL(sql, new Object[]{id});
db.close();
}
//更新数据
public void update(tab_students students){
db = mytabopen.getWritableDatabase();
sql = "update "+tab_name+" set name=?,password=? where id=?";
db.execSQL(sql, new Object[]{students.getName(), students.getPassword(), students.getId()});
db.close();
}
//查询数据
public tab_students find(Integer id){
//getReadableDatabase()与getWritableDatabase()通过查看源代码知道,getReadableDatabase()方法在磁盘空间满的时候,仍能返回数据库操作实例,不过此时的实例只能用于读不能写
db = mytabopen.getReadableDatabase();
sql = "select * from "+tab_name+ " where id=?";
Cursor cur = db.rawQuery(sql, new String[]{id.toString()});
if(cur.moveToFirst()){
String name = cur.getString(cur.getColumnIndex("name"));
String password = cur.getString(cur.getColumnIndex("password"));
return new tab_students(id,name,password);
}
cur.close();
db.close();
return null;
}
//分页获取数据
public List<tab_students> getScrollDate(int again,int last){
List<tab_students> list = new ArrayList<tab_students>();
db = mytabopen.getReadableDatabase();
sql = "select * from "+tab_name+ "limit ?,? order by id asc";//根据查询结果的id对数据进行升序排列
//sql = "select * from " +tab_name+ " limit ?,?";
Cursor cur = db.rawQuery(sql, new String[]{String.valueOf(again), String.valueOf(last)});
while (cur.moveToNext()) {
int id = cur.getInt(cur.getColumnIndex("id"));
String name = cur.getString(cur.getColumnIndex("name"));
String password = cur.getString(cur.getColumnIndex("password"));
tab_students stu = new tab_students(id, name, password);
list.add(stu);
}
cur.close();
db.close();
return list;
}
//获取数据总数目
public long gettab(){
db = mytabopen.getReadableDatabase();
sql = "select count(*) from "+tab_name;
Cursor cur = db.rawQuery(sql, null);
cur.moveToFirst();
long result = cur.getLong(0);
return result;
}
}
是不是感觉和我们的SQL数据库操作一样,sql语句没有什么区别,是的,他们完全一致。没学过数据库的小朋友是不是已经抓狂啦,不要担心,Android工程师想到了你们,Android为我们封装好了一套对SQLite数据库进行操作的规范,下面我们就一起来学习一下,如何通过Android提供的规范晚场上面的操作。
这里我们只需要修改一下,我们上面对数据库操作的类:
public class tab_service_two {
private MyTabOpen mytabopen = null;
private static SQLiteDatabase db = null;
private static final String tab_name = "students";
public tab_service_two(Context context) {
this.mytabopen = new MyTabOpen(context);//获得数据库操作实例
}
//添加数据
public void save(tab_students students){
db = mytabopen.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("id", students.getId());
values.put("name", students.getName());
values.put("password", students.getPassword());
db.insert(tab_name, null, values);
db.close();
}
//删除数据
public void del(Integer id){
db = mytabopen.getWritableDatabase();
db.delete(tab_name, "id=?", new String[]{id.toString()});
db.close();
}
//修改数据
public void update(tab_students students){
db = mytabopen.getWritableDatabase();
ContentValues values = new ContentValues();
values.put("name", students.getName());
values.put("password", students.getPassword());
db.update(tab_name, values, "id=?", new String[]{students.getId().toString()});
db.close();
}
//查询数据
public tab_students find(Integer id){
//getReadableDatabase()与getWritableDatabase()通过查看源代码知道,getReadableDatabase()方法在磁盘空间满的时候,仍能返回数据库操作实例,不过此时的实例只能用于读不能写
db = mytabopen.getReadableDatabase();
//当要查询数据库表中的所以信息时,第二个参数可以使用设置为空来代替数组
Cursor cur = db.query(tab_name, new String[]{"name","password"}, "id=?", new String[]{id.toString()}, null, null, null);
if(cur.moveToFirst()){
String name = cur.getString(cur.getColumnIndex("name"));
String password = cur.getString(cur.getColumnIndex("password"));
return new tab_students(id,name,password);
}
cur.close();
db.close();
return null;
}
//分页获取数据
public List<tab_students> getScrollDate(int again,int last){
List<tab_students> list = new ArrayList<tab_students>();
db = mytabopen.getReadableDatabase();
Cursor cur = db.query(tab_name, null, null, null, null, null, "id asc", again+","+last);
while (cur.moveToNext()) {
int id = cur.getInt(cur.getColumnIndex("id"));
String name = cur.getString(cur.getColumnIndex("name"));
String password = cur.getString(cur.getColumnIndex("password"));
tab_students stu = new tab_students(id, name, password);
list.add(stu);
}
cur.close();
db.close();
return list;
}
//获取数据总数
public long gettab(){
db = mytabopen.getReadableDatabase();
Cursor cur = db.query(tab_name, new String[]{"count(*)"}, null, null, null, null, null);
cur.moveToFirst();
long result = cur.getLong(0);
return result;
}
}
好了关于SQLite在Android平台的使用,就为大家介绍完毕,内容很简单,没有太大的难度,相信小伙伴一定能理解。新手学习,高手交流。
Android之SqlLite数据库使用的更多相关文章
- Android:SQLiteOpenHelper类(SQLlite数据库操作)详细解析
前言 SQLite数据库操作在Android开发中非常常用 今天我将带大家全面了解关于SQLite数据库的操作(增.删.查.改) 目录 1. SQLite数据库介绍 SQLite是Android内置的 ...
- Android如何使用SQLlite数据库
先写一个类,继承自SQLiteOpenHelper public class MyDatabaseHelper extends SQLiteOpenHelper { //声明一个Context pri ...
- 07_Android操作sqllite数据库(包括2中方式操作数据的方式),单元测试,BaseAdapter的使用,自定义view的综合使用案例
1 目标从sqllite中读取数据并显示如下: MainActivity对应的界面 MainActivity2对应的界面 2 配置Android的清单文件 <?xml ...
- Android基础------SQLite数据库(一)
1.SQLite介绍 SQLite是一款非常流行的嵌入式数据库,它支持SQL操作,并且只用很少的内存. Android在运行时集成了SQLite,所有每个Android应用程序都可以使用SQLLite ...
- Android 数据库管理— — —创建数据库
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" ...
- Android高性能ORM数据库DBFlow入门
DBFlow,综合了 ActiveAndroid, Schematic, Ollie,Sprinkles 等库的优点.同时不是基于反射,所以性能也是非常高,效率紧跟greenDAO其后.基于注解,使用 ...
- Qt for Android 打包 SQLite 数据库
Qt for Android 调用 SQLite 数据库时, 怎样将已经存在的数据库附加到 APK 中? 直接在你项目里面的Android源码的根目录下新建一个文件夹assets, 数据库就可以放里面 ...
- android SQLite(安卓数据库的插入显示删除)
1.利用android自带数据库实现增加.删除.显示用户等操作 只是一个基本模型,为即将的与 复利计算apk整合做牺牲. 就不上传百度云供大家下载了 等整合了复利计算再上传. 数据的插入和显示: ...
- 21.Android之SQLite数据库学习
Google为Andriod的较大的数据处理提供了SQLite,他在数据存储.管理.维护等各方面都相当出色,功能也非常的强大.SQLite具备下列特点: 1.轻量级 使用 SQLite 只需要带一个动 ...
随机推荐
- 51Nod 1010 只包含因子2 3 5的数 Label:None
K的因子中只包含2 3 5.满足条件的前10个数是:2,3,4,5,6,8,9,10,12,15. 所有这样的K组成了一个序列S,现在给出一个数n,求S中 >= 给定数的最小的数. 例如:n = ...
- clientX .offsetX .screenX x 的区别
clientX 设置或获取鼠标指针位置相对于当前窗口的 x 坐标,其中客户区域不包括窗口自身的控件和滚动条. clientY 设置或获取鼠标指针位置相对于当前窗口的 y 坐标,其中客户区域不包括窗口自 ...
- 【转载】64 位 Windows 内核虚拟地址空间布局(基于 X64 CPU)
原文链接:http://shayi1983.blog.51cto.com/4681835/1734822 本文为原创翻译,原文出处为 http://www.codemachine.com/articl ...
- Linux 环境变量 设置 etc profile
一.Linux的变量种类 按变量的生存周期来划分,Linux变量可分为两类: 1.永久的:需要修改配置文件,变量永久生效. 2.临时的:使用export命令声明即可,变量在关闭shell时失效. 二. ...
- 误删/usr文件夹解决办法
http://blog.chinaunix.net/uid-2623904-id-3044156.html http://www.centoscn.com/CentOS/Intermediate/20 ...
- 关于ajax为什么会返回php整个源码
ajax 程序:返回的是php文件输出的代码. 1. 注意:如果你的php文件包含了html代码或者说是输出了HTML代码,它都会返回给 AJAX. 2. 注意:是整个php文件.这意味着如果你的aj ...
- CI生成查询记录集result(),row(),row_array().....
result() 该方法执行成功返回一个对象数组,失败则返回一个空数组. 一般情况下,我们使用下面的方法遍历结果,代码就像这样: $query = $this->db->query(&qu ...
- SQL基本语句汇总
语句:CREATE TABLE 作用:创建表格 格式:CREATE TABLE tableName (columnName1 columnDataType1, columnName2 columnDa ...
- 配置Spark on YARN集群内存
参考原文:http://blog.javachen.com/2015/06/09/memory-in-spark-on-yarn.html?utm_source=tuicool 运行文件有几个G大,默 ...
- 关于兼容IE的一些策略
--css 盒子模型下的 box-sizing 属性,只兼容到ie8: -moz-box-sizing: border-box; -webkit-box-sizing: border-box; -o- ...