Android开发之利用SQLite进行数据存储

1.SQLite数据库简单介绍

SQLite。是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包括在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,并且眼下已经在非常多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中。可能仅仅须要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同一时候能够跟非常多程序语言相结合,比方 Tcl、C#、PHP、Java等,还有ODBC接口,相同比起M

ysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。

SQLite第一个Alpha版本号诞生于2000年5月。

至2015年已经有15个年头,SQLite也迎来了一个版本号 SQLite 3已经公布。

总结 : SQLite作为移动终端的数据库是非常合适的。占用内存小轻量级处理速度快

2.Android中怎样使用SQLite

2.1 创建SQLiteOpenHelper对象。并创建表

新建一个类,命名为MySQLiteOpenHelper,并将其继承自SQLiteOpenHelper:

新建后会报错,由于没有加入构造方法,加入构造方法:

    package com.example.sqllitetest;

    import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper; public class MySQLOpenHelper extends SQLiteOpenHelper { public MySQLOpenHelper(Context context, String name, CursorFactory factory,
int version) {
super(context, name, factory, version);
// TODO Auto-generated constructor stub
} /**
* 数据库创建时会调用,在这里运行创建表的语句
*/
@Override
public void onCreate(SQLiteDatabase db) {
// TODO Auto-generated method stub
} /**
* 数据库升级时,此方法会调用,在这里运行数据库更新操作
*/
@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);
} }

在上面的onCreate()。方法中运行一条创建表名为person的语句

    db.execSQL("create table person (_id integer primary key autoincrement, name char(10), age integer(3), phone integer(20))");

注意:事实上在sqlite中除了id主键以外。全部的字段都没有明白的类型限制,举个列子,我们向integer类型的字段中插入char类型的数据也是能够的

那么既然这样,我们创建数据库时,指定的数据类型意图何在?

这些是为了。让我们程序猿了解某个字段的类型限制。实际编码时,还是要指定字段明白类型的,方便日后维护和理解。

新建一个測试类SqliteTestCase.java:

    package com.example.sqllitetest;

    import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.test.AndroidTestCase; public class SqlliteTestCase extends AndroidTestCase { private MySQLOpenHelper oh;
private SQLiteDatabase db; public void test() {
System.out.println("This is test method!");
} /**
* 測试框架初始化完成过后,在測试方法调用之前调用此方法
*/
@Override
protected void setUp() throws Exception {
super.setUp(); // 获得可写的数据库对象(若数据库不存在。先创建数据库。再获取可读可写的数据库对象;假设数据库存在,就直接打开)
// *********************** 參数说明 ***********************
// 參数1 : 获取Context对象,AndroidTestCase中为了方便測试,提供了getContext()方法
// 參数2 : 数据库文件名称
// 參数3 : 游标工厂对象,被用来创建游标对象。默觉得空
// 參数4 : 用来标识数据库的版本号,用来与之前创建的时候做对照,当版本号大于,则调用onUpgrade()
oh = new MySQLOpenHelper(getContext(), "person.db", null, 1); /**
* ************** 第一种方法:获取数据库 **************
* 1.被用来创建或打开一个可读写的数据库。
* 当它被第一次调用的时候,会依据new SQLOpenHelper()中的数据库名和版本号号
* 当已存在相同数据库文件。并且版本号号相同。则直接打开,
* 反之,则调用创建或更新方法。
*
* 2.数据一旦打开成功。将被缓存起来,当我们在须要录入数据时,能够在不论什么地方去调用返回
* 的对象去操作数据库。注意:但不须要使用数据库时。须要关闭数据库
*
* 3.但没有权限时。抑或磁盘满了的时候,这种方法将会被调用失败,可是,若问题得到解决。就可以成功调用
*
* 4.调用这种方法,若触发更新操作,你就须要警觉了:
* 由于数据库的更新是个耗时的操作。我们不应该在应用的主线程中去调用它。包括ContentProvider.onCreate()
*
*/
db = oh.getWritableDatabase(); /**
* ************** 另外一种方法:获取数据库 **************
* 不要被名字误导。这种方法相同可获得可读写的数据库对象。
* 它与上面方法的差别是,当遇到一些问题:(列如:磁盘满了。这个时候调用不会失败,而是将会返回一个仅仅读的数据库对象)
*/
db = oh.getReadableDatabase();
} /**
* 測试方法运行完成过后,调用此方法
*/
@Override
protected void tearDown() throws Exception {
// TODO Auto-generated method stub
super.tearDown();
// 关闭数据库
db.close();
} }

注意:当我们new SQLiteOpenHelper()打开某个数据库时。传入的版本号号不应比之前创建这个数据库的时候绑定的版本号号低。否则会出现以下的错误,版本号号仅仅能递增

运行test()方法,显示为绿色,说明没有错误

通过DDMS–>File Explore,查看data/data/项目包名/databases文件夹下:

导出文件。在SQLite Expert软件中打开:

能够看到,数据库和表都被正确创建。

2.2 通过SQLiteDatabase对象运行增删改查操作

2.2.1加入数据操作

加入数据有两种方法:

  • 第一种方法 : 通过手写sql语句,运行execSQL();方法;

在SqliteTestCase.java中加入insert()方法

 public void insert() {
db.execSQL("insert into person (name, age, phone) values(?, ? , ?)", new Object[]{"张三", 18, "180199678455"});
db.execSQL("insert into person (name, age, phone) values(? , ? , ?)", new Object[]{"赵四", 16, "180199678455"});
db.execSQL("insert into person (name, age, phone) values(? , ? , ?)", new Object[]{"Android", 15, "180199678455"});
}

运行结果,数据成功插入表中:

  • 另外一种方法 : 通过Android API,将数据封装到contentValues中。

在SqliteTestCase.java中加入insertByApi()方法:

public void insertApi() {
// 把全部的数据封装到contentValues中
ContentValues values = new ContentValues();
values.put("name", "zhangsan");
values.put("age", 78);
values.put("phone", "13812235689"); // 參数说明:
// 第一个參数table : 表名
// 第二个參数nullColumnHack :能够指定为null,若为null,当你values中无值。则不会插入行
// 若你指定了nullColumnHack的值,即便你的values中无值,也会
// 插入null值到你的字段下
// 第三个參数values : ContentValues对象
db.insert("person", null, values);
}

导出db文件,刷新:

2.2.1删除数据操作

删除数据相同有两种方法:

  • 第一种方法 : 通过手写sql语句,运行execSQL();方法。
 public void delete() {
// 删除id为1的行
db.execSQL("delete from person where _id = ?", new Object[]{1});
}
  • 另外一种方法 : 通过Android API;
public void deleteApi() {
// 删除表中age = 78, id = 4的记录
// 返回值为受影响的行,删除了多少行
int i = db.delete("person", "age = ? and _id = ? ", new String[]{"78", "4"});
}

2.2.1改动数据操作

改动数据相同有两种方法:

  • 第一种方法 : 通过手写sql语句。运行execSQL()方法:
public void update() {
// 改动id为2的phone值为110
db.execSQL("update person set phone = ? where _id = ?", new Object[]{"110", 2});
}

查看结果:

  • 另外一种方法 : 通过Android API;
public void updateApi() {
// 通过ContentValues来指定改动后的值
ContentValues values = new ContentValues();
values.put("phone", "120");
// 返回值为受影响的行
int i = db.update("person", values, "_id = ? and age = ?", new String[]{"3", "15"});
}

查看结果:

2.2.1查询数据操作

查询数据相同有两种方法:

  • 第一种方法 : rawQuery()方法:
public void query() {
Cursor cursor = db.rawQuery("select name, age, phone from person ", null); while (cursor.moveToNext()) {
// 不推荐用这样的下标的方式来获取值,一旦后期字段的位置有所改动,维护起来比較麻烦
// String name = cursor.getString(0);
// int age = cursor.getInt(1);
// String phone = cursor.getString(2); // 推荐使用
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
String phone = cursor.getString(cursor.getColumnIndex("phone"));
System.out.println("name : " + name + "; age = " + age + ";" + " phone = " + phone);
}
}

logcat输出结果:

  • 另外一种方法 : 通过Android API。
public void queryApi() {
Cursor cursor = db.query("person", null, null, null, null, null, null);
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex("name"));
int age = cursor.getInt(cursor.getColumnIndex("age"));
String phone = cursor.getString(cursor.getColumnIndex("phone"));
System.out.println("name : " + name + "; age = " + age + ";" + " phone = " + phone);
}
}

2.3 SQLiteDatabase之事务transaction

应用场景:当须要保证多条语句同一时候运行成功,否则。回滚

这里。我们简单的模拟一下。假设我们须要id为2的age加1岁,同一时候又要保证id为3的age减1岁

原本数据在数据库中是这样:

假设事务运行成功后。name为赵四的age将变为17,而name为Android的age变为14。反之,两条数据的全部属性值不变。

首先。我们人为的导致运行失败:

加入方法:

public void transaction() {
try {
// 开启事务
db.beginTransaction();
ContentValues values = new ContentValues();
values.put("age", 17);
db.update("person", values, "_id = ?", new String[]{"2"}); values.clear(); values.put("age", 14);
db.update("person", values, "_id = ?", new String[]{"3"}); int i = 1 / 0; // 这里有错,将导致事务运行失败 // 设置事务运行成功
db.setTransactionSuccessful();
} catch (Exception e) {
// TODO: handle exception
} finally {
// 结束事务,同一时候提交。假设已经设置事务运行成功,则sql语句生效。反之,则回滚
db.endTransaction();
}
}

导出db文件,刷新,看到数据无不论什么变化:

再将错误去掉。运行方法:

结果例如以下,运行成功:

Android开发之利用SQLite进行数据存储的更多相关文章

  1. android开发 解析服务器端xml文件数据存储到android客户端SQLite数据库

    以下面xml文件为例对其解析(假设此xml就在服务器端Server项目下的servlet包下的MenuServlet文件的输出流中): <?xml version="1.0" ...

  2. Android开发7:简单的数据存储(使用SharedPreferences)和文件操作

    前言 啦啦啦~大家好,又见面啦~ 本篇博文讲和大家一起完成一个需要注册.登录的备忘录的,一起学习 SharedPreferences 的基本使用,学习 Android 中常见的文件操作方法,复习 An ...

  3. android开发之使用SQLite数据库存储

    http://blog.csdn.net/jason0539/article/details/16360835 SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且 ...

  4. Android编程中的5种数据存储方式

    Android编程中的5种数据存储方式 作者:牛奶.不加糖 字体:[增加 减小] 类型:转载 时间:2015-12-03我要评论 这篇文章主要介绍了Android编程中的5种数据存储方式,结合实例形式 ...

  5. 在Android 开发中使用 SQLite 数据库笔记

    SQLite 介绍   SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PH ...

  6. iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist)

    iOS开发UI篇—ios应用数据存储方式(XML属性列表-plist) 一.ios应用常用的数据存储方式 1.plist(XML属性列表归档) 2.偏好设置 3.NSKeydeArchiver归档(存 ...

  7. iOS开发UI篇—ios应用数据存储方式(偏好设置)

    iOS开发UI篇—ios应用数据存储方式(偏好设置) 一.简单介绍 很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能 每个应用 ...

  8. 使用.NET 6开发TodoList应用(4)——引入数据存储

    需求 作为后端CRUD程序员(bushi,数据存储是开发后端服务一个非常重要的组件.对我们的TodoList项目来说,自然也需要配置数据存储.目前的需求很简单: 需要能持久化TodoList对象并对其 ...

  9. iOS开发UI篇—ios应用数据存储方式(归档)

    iOS开发UI篇—ios应用数据存储方式(归档)  一.简单说明 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦: 偏好设置(将所有的东西都保存在同 ...

随机推荐

  1. python--12、数据库进阶

    SQL语句关键词: #再次不做过多介绍 使用INSERT实现数据的插入 UPDATE实现数据的更新 使用DELETE实现数据的删除 使用SELECT查询数据以及. #示例中department为部门表 ...

  2. 求助:可以使用任何编程工具做成一个控件或组件,使得在VB中能调用并得到摄像头的参数及图片。

    请看下网址上的这个问题,看是否有解决的方式http://www.educity.cn/wenda/338634.html

  3. CPU位数、操作系统位数、机器字长、C/C++基本数据类型长度

    1.CPU位数=CPU中寄存器的位数=CPU能够一次并行处理的数据宽度(位数)=数据总线宽度: //现在的计算机处理器一般都是64位,这是硬件的事. 2.CPU为了实现其功能设计了指令集,即是CPU的 ...

  4. vue项目中添加百度地图功能及解决遇到的问题详解

    第一步,在百度地图开放平台 申请密钥 (如果有密钥可以省略此步骤,朋友有也可以借) 地址:http://lbsyun.baidu.com/ 第二步,创建应用并填写表单(下面链接可参考) http:// ...

  5. vue学习总结(简单介绍)

    声明式渲染 Vue.js 的核心是一个允许采用简洁的模板语法来声明式地将数据渲染进 DOM 的系统: <div id="app"> {{ message }} < ...

  6. 个人总结的常用java,anroid网站

    http://blog.csdn.net/wanghao200906/article/details/49334987

  7. 参考KOA,5步手写一款粗糙的web框架

    我经常在网上看到类似于KOA VS express的文章,大家都在讨论哪一个好,哪一个更好.作为小白,我真心看不出他两who更胜一筹.我只知道,我只会跟着官方文档的start做一个DEMO,然后我就会 ...

  8. 电子笔记本的思考(1)(ver0.2)

    章节:电子笔记本的思考(1)   陶哲轩在<解题·成长·快乐——陶哲轩教你学数学>中着重强调,用纸笔来“缓存”思维对于数学解题的重要性: 用选定的符号表达你所知道的信息,并画一个示意图.把 ...

  9. Spring Boot之简单的MVC

    最近开始看Spring Boot,发现其开发起来真是方便.今天就来实现一个简单的Spring MVC 请求,纯Java代码的哦. 1.Maven必不可少,先看看都加载了那些依赖: <?xml v ...

  10. 10 Minutes to pandas中文版

    本文是对pandas官方网站上<10 Minutes to pandas>的一个简单的翻译,原文在这里.这篇文章是对pandas的一个简单的介绍,详细的介绍请参考:Cookbook .习惯 ...