SQLite简单介绍

Google为Andriod的较大的数据处理提供了SQLite,他在数据存储、管理、维护等各方面都相当出色,功能也很的强大。

袖珍型的SQLite能够支持高达2TB大小的数据库,每一个数据库都是以单个文件的形式存在。这些数据都是以B-Tree的数据结构形式存储在磁盘上。

在事务处理方面,SQLite通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程能够在同一时间从同一数据库读取数据,但仅仅有一个能够写入数据。在某个进程或线程想数据库运行写操作之前,必须获得独占锁。在获得独占锁之后,其它的读或写操作将不会再发生。

SQLite採用动态数据类型,当某个值插入到数据库时,SQLite将会检查它的类型,假设该类型与关联的列不匹配,SQLite则会尝试将该值转换成该列的类型。假设不能转换。则该值将作为本身的类型存储。SQLite称这为“弱类型”。但有一个特例,假设是INTEGER PRIMARY KEY,则其它类型不会被转换。会报一个“datatype missmatch”的错误。

概括来讲,SQLite支持NULL、INTEGER、REAL、TEXT和BLOB数据类型,分别代表空值、整型值、浮点值、字符串文本、二进制对象。

SQLite还包含下面特点:

1、SQLite3支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型。尽管它支持的类型尽管仅仅有五种。但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等数据类型,仅仅只是在运算或保存时会转成相应的五种数据类型。

2、SQLite最大的特点是你能够保存不论什么类型的数据到不论什么字段中。不管这列声明的数据类型是什么。比如:能够在Integer字段中存放字符串。或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。

3、但有一种情况例外:定义为INTEGER PRIMARY KEY的字段仅仅能存储64位整数, 当向这样的字段中保存除整数以外的数据时,将会产生错误。

4、另外, SQLite 在解析CREATE TABLE 语句时,会忽略 CREATE TABLE 语句中跟在字段名后面的数据类型信息,如以下语句会忽略 name字段的类型信息:

CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))

PersonSqliteOpenHelper类

public class PersonSqliteOpenHelper extends SQLiteOpenHelper {

    /**
* 数据库的构造方法
* 数据库查询的结果集,为null则使用默认的结果集
* 数据库的版本号。从1開始,小于1则抛异常
* @param context
*/
public PersonSqliteOpenHelper(Context context) {
super(context, "person.db", null, 1);
} /**
* 数据库在第一次被创建时调用,表结构,初始化
* 数据类型的长度是没用的。仅仅是给程序猿看的
* @param sqLiteDatabase 数据库
*/
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL("create table person (id integer primary key autoincrement, name varchar(20), number varchar(20))"); } @Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) { }
}

PersonDao类

public class PersonDao {

    private PersonSqliteOpenHelper helper;

    public PersonDao(Context context) {
helper = new PersonSqliteOpenHelper(context);
} public void add(String name, String number){
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("insert into person (name,number) values (?,?)", new Object[]{name,number});
db.close();
} public boolean find(String name){
SQLiteDatabase db = helper.getWritableDatabase();
Cursor cursor = db.rawQuery("select * from person where name=?", new String[]{name});
boolean result = cursor.moveToNext();
cursor.close();
db.close();
return result;
} public void update(String name, String newnumber){
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("update person set number=? where name=?", new Object[]{newnumber, name});
db.close();
} public void delete(String name){
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL("delete from person where name=?",new String[]{name});
db.close();
} public List<Person> findAll(){
SQLiteDatabase db = helper.getReadableDatabase();
List<Person> persons = new ArrayList<Person>();
Cursor cursor = db.rawQuery("select name,id,number from person ",null);
while (cursor.moveToNext()){
int id = cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String number = cursor.getString(cursor.getColumnIndex("number"));
Person p = new Person(id,name,number);
persons.add(p);
}
cursor.close();
db.close();
return persons;
}
}

Person类

public class Person {

    private int id;
private String name;
private String number; public Person() {
} public Person(int id, String name, String number) {
this.id = id;
this.name = name;
this.number = number;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getNumber() {
return number;
} public void setNumber(String number) {
this.number = number;
} @Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", number='" + number + '\'' +
'}';
}
}

ApplicationTest类

public class ApplicationTest extends ApplicationTestCase<Application> {
public ApplicationTest() {
super(Application.class);
} public void testDBHelp() throws Exception{
PersonSqliteOpenHelper perSQL = new PersonSqliteOpenHelper(getContext());
perSQL.getWritableDatabase();
} public void testAdd() throws Exception{
PersonDao dao = new PersonDao(getContext());
dao.add("小明", "18500003039");
} public void testFind(){
PersonDao dao = new PersonDao(getContext());
boolean result = dao.find("小明");
assertEquals(true, result);
} public void testUpdate(){
PersonDao dao = new PersonDao(getContext());
dao.add("大帅", "13100001423");
} public void testDelete(){
PersonDao dao = new PersonDao(getContext());
dao.delete("小明");
} public void testFindAll(){
PersonDao dao = new PersonDao(getContext());
List<Person> persons = dao.findAll();
for (Person p:persons){
System.out.println(p.toString());
}
}
}

使用Android自带API

public class PersonDao2 {

    private PersonSqliteOpenHelper helper;

    public PersonDao2(Context context) {
helper = new PersonSqliteOpenHelper(context);
} public long add(String name, String number){
SQLiteDatabase db = helper.getWritableDatabase();
//db.execSQL("insert into person (name,number) values (? ,?)", new Object[]{name,number});
ContentValues values = new ContentValues();
values.put("name",name);
values.put("number", number);
long result = db.insert("person",null,values);
db.close();
return result;
} public boolean find(String name){
SQLiteDatabase db = helper.getWritableDatabase();
//Cursor cursor = db.rawQuery("select * from person where name=?", new String[]{name});
Cursor cursor = db.query("person",null,"name=?",new String[]{name},null,null,null);
boolean result = cursor.moveToNext();
cursor.close();
db.close();
return result;
} public int update(String name, String newnumber){
SQLiteDatabase db = helper.getWritableDatabase();
//db.execSQL("update person set number=? where name=?", new Object[]{newnumber, name});
ContentValues values = new ContentValues();
values.put("number", newnumber);
int result = db.update("person",values,"name=?",new String[]{name});
db.close();
return result;
} public int delete(String name){
SQLiteDatabase db = helper.getWritableDatabase();
//db.execSQL("delete from person where name=? ", new String[]{name});
int result = db.delete("person","name=?",new String[]{name});
db.close();
return result;
} public List<Person> findAll(){
SQLiteDatabase db = helper.getReadableDatabase();
List<Person> persons = new ArrayList<Person>();
//Cursor cursor = db.rawQuery("select name,id,number from person ",null);
Cursor cursor = db.query("person",new String[]{"name","id","number"},null,null,null,null,null);
while (cursor.moveToNext()){
int id = cursor.getInt(cursor.getColumnIndex("id"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String number = cursor.getString(cursor.getColumnIndex("number"));
Person p = new Person(id,name,number);
persons.add(p);
}
cursor.close();
db.close();
return persons;
}
}

SQLite改动数据库结构。先改动数据库版本。然后再重写onUpgrade方法,运行须要的操作。注意,此方法仅仅在版本添加后首次运行时运行。

@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
Log.i(TAG,"databases is modified");
sqLiteDatabase.execSQL("alter table person add account varchar(20)");
}

SQLite的事务处理

public void testTransaction(){
SQLiteDatabase db = helper.getReadableDatabase();
db.beginTransaction();
try {
db.execSQL("update person set account=account-1000 where name=? ", new Object[]{"杨小明"});
db.execSQL("update person set account=account+1000 where name=?", new Object[]{"范大帅"});
db.setTransactionSuccessful();
}catch (Exception e){ }finally {
db.endTransaction();
db.close();
} }

先插入两条数据,初始化金额。再运行事务处理的方法,得到例如以下结果:

8:14:36.456  13235-13248/? I/TAGG﹕ Person{id=19, name='杨小明', number='18500003039', account=5000}
08-16 18:14:36.456 13235-13248/? I/TAGG﹕ Person{id=20, name='范大帅', number='13300001423', account=2000}
08-16 18:15:23.371 13435-13448/com.haier.sqlitedatabase I/TAGG﹕ Person{id=19, name='杨小明', number='18500003039', account=4000}
08-16 18:15:23.371 13435-13448/com.haier.sqlitedatabase I/TAGG﹕ Person{id=20, name='范大帅', number='13300001423', account=3000}

Android SQLite 简单使用演示样例的更多相关文章

  1. Oracle简单脚本演示样例

    Oracle简单脚本演示样例 1.添加表 --改动日期:2014.09.21 --改动人:易小群 --改动内容:新增採购支付情况表 DECLARE VC_STR           VARCHAR2( ...

  2. android listview综合使用演示样例_结合数据库操作和listitem单击长按等事件处理

    本演示样例说明: 1.自己定义listview条目样式,自己定义listview显示列数的多少,灵活与数据库中字段绑定. 2.实现对DB的增删改查,而且操作后listview自己主动刷新. 3.响应用 ...

  3. Android - 标准VideoView播放演示样例

    标准VideoView播放演示样例 本文地址: http://blog.csdn.net/caroline_wendy 在Android SDK中的ApiDemos内, 提供标准播放视频的代码,使用V ...

  4. JavaFX 简单3D演示样例

    从Java8開始,在JavaFX中便添加了3D部分的内容,包含Camera,Material,Light,Shape3D等基础内容. 当然,JavaFX 3D应该是OpenJFX里眼下正在补充和完好的 ...

  5. Android之——流量管理程序演示样例

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47680811 眼下.市面上有非常多管理手机流量的软件,能够让用户实时获取到自己手机 ...

  6. Android之——多线程下载演示样例

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46883927 一.概述 说到Android中的文件下载.Android API中明 ...

  7. Thrift的安装和简单演示样例

    本文仅仅是简单的解说Thrift开源框架的安装和简单使用演示样例.对于具体的解说,后面在进行阐述. Thrift简述                                           ...

  8. Androidclient与服务端交互之登陆演示样例

    今天了解了一下androidclient与服务端是如何交互的,发现事实上跟web有点类似吧,然后网上找了大神的登陆演示样例.是基于IntentService的 1.后台使用简单的servlet,支持G ...

  9. 多线程本地图片载入演示样例【OpenCV】【Pthread】

    Pthread barrier的简单使用演示样例: C++代码例如以下: // ThreadingLoadImages.cpp : 定义控制台应用程序的入口点. // #include "s ...

随机推荐

  1. LoadRunner监控Window/Unix系统资源的配置

    LoadRunner监控Window/Unix系统资源需要做两件事情: 1.配置被监视的服务器,以便于LoadRunner能够获取系统资源使用情况的数据 2.在LoadRunner的Controlle ...

  2. ASP.NET-Microsoft.Management.Infrastructure错误

    错误如图所示,将MVC发布到IIS上就会出现这个错误,我用到了NPOI这个EXCEL插件,不知道是不是这个造成的,但是实在找不到解决方案,就直接将BIN目录下的这个Microsoft.Manageme ...

  3. 2 怎样解析XML文件或字符串

    1 引用XML文件 2 使用XMLReader解析文本字符串 3 使用XMLReader方法读取XML数据 详细代码实现例如以下: //初始化一个XML字符串 String xmlString = @ ...

  4. Android 6.0 开发人员对系统权限的使用与练习(Permissions Best Practices)

    Permissions Best Practices 在安装的过程中,用户非常easy忽略权限请求. 假设一个用户相应用感觉沮丧或者操心泄漏个人信息,那么这些用户就会不用他或者卸载它. 怎样规避这个问 ...

  5. Handler.post与View.post的区别

    Android的线程分UI线程与非UI线程两类.而Handler是非UI线程向UI线程传递消息的桥梁. 除了非常常用sendMessage之外,Handler也提供了post(Runnable...) ...

  6. VBA 第一天

    公司实习第一天,excel搞不定啊,学点VBA留着用: 录制宏: 点击录制宏按钮以后,在这段期间你做的每一个操作都会被记录下来,直到你点击停止录制按钮才能够停下,停下来后在此期间每一个操作都会以宏代码 ...

  7. [hihocoder #1384] Genius ACM 解题报告(倍增)

    题目链接:http://hihocoder.com/problemset/problem/1384 题目大意: 给定一个整数 M,对于任意一个整数集合 S,定义“校验值”如下: 从集合 S 中取出 M ...

  8. Caffe 激励层(Activation)分析

    Caffe_Activation 一般来说,激励层的输入输出尺寸一致,为非线性函数,完成非线性映射,从而能够拟合更为复杂的函数表达式激励层都派生于NeuronLayer: class XXXlayer ...

  9. servlet中Cookie的编码问题

    a.什么是Cookie的编码问题?      Cookie只能存放合法的ascii字符,如果是非asicc字符(比如中文),     需要转换成合法的ascii字符的形式.  b.如何处理?     ...

  10. sass的用法小结(二)

    3. 导入SASS文件; css有一个特别不常用的特性,即@import规则,它允许在一个css文件中导入其他css文件.然而,后果是只有执行到@import时,浏览器才会去下载其他css文件,这导致 ...