除了能够使用文件或SharedPreferences存储数据。还能够选择使用SQLite数据库存储数据。
在Android平台上,集成了一个嵌入式关系型数据库—SQLite,SQLite3支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,尽管它支持的类型仅仅有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等数据类型。仅仅只是在运算或保存时会转成相应的五种数据类型。 SQLite最大的特点是你能够把各种类型的数据保存到不论什么字段中,而不用关心字段声明的数据类型是什么。

比如:能够在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。

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

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

CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))
SQLite能够解析大部分标准SQL语句,如:
查询语句:select * from 表名 where 条件子句 group
by 分组字句 having ... order by 排序子句
如:select * from person
        select * from person order by id desc
        select name from person group by name having count(*)>1
分页SQL与mysql类似,以下SQL语句获取5条记录,跳过前面3条记录
select * from Account limit 5 offset 3 或者 select
* from Account limit 3,5
插入语句:insert into 表名(字段列表)
values(值列表)。

如: insert
into person(name, age) values(‘传智’,3)

更新语句:update 表名 set 字段名=值 where 条件子句。如:update
person set name=‘传智‘
where id=10
删除语句:delete from 表名 where 条件子句。如:delete
from person  where id=10
l
我们在编写数据库应用软件时。须要考虑这种问题:由于我们开发的软件可能会安装在非常多用户的手机上,假设应用使用到了SQLite数据库,我们必须在用户初次使用软件时创建出应用使用到的数据库表结构及加入一些初始化记录。另外在软件升级的时候。也须要对数据表结构进行更新。

那么。我们怎样才干实如今用户初次使用或升级软件时自己主动在用户的手机上创建出应用须要的数据库表呢?总不能让我们在每一个须要安装此软件的手机上通过手工方式创建数据库表吧?由于这种需求是每一个数据库应用都要面临的。所以在Android系统,为我们提供了一个名为SQLiteOpenHelper的抽象类。必须继承它才干使用,它是通过对数据库版本号进行管理来实现前面提出的需求。

为了实现对数据库版本号进行管理,SQLiteOpenHelper类提供了两个重要的方法。各自是onCreate(SQLiteDatabase
db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),前者用于初次使用软件时生成数据库表,后者用于升级软件时更新数据库表结构。

当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候。假设数据库不存在,Android系统会自己主动生成一个数据库。接着调用onCreate()方法。onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里能够生成数据库表结构及加入一些应用使用到的初始化数据。

onUpgrade()方法在数据库的版本号发生变化时会被调用,一般在软件升级时才需改变版本号号,而数据库的版本号是由程序猿控制的,假设数据库如今的版本号是1,因为业务的变更,改动了数据库表结构,这时候就须要升级软件,升级软件时希望更新用户手机里的数据库表结构。为了实现这一目的。能够把原来的数据库版本号设置为2(有同学问设置为3行不行?当然能够,假设你愿意,设置为100也行),而且在onUpgrade()方法里面实现表结构的更新。当软件的版本号升级次数比較多。这时在onUpgrade()方法里面能够依据原版号和目标版本号进行推断,然后作出对应的表结构及数据更新。

getWritableDatabase()和getReadableDatabase()方法都能够获取一个用于操作数据库的SQLiteDatabase实例。

但getWritableDatabase() 方法以读写方式打开数据库。一旦数据库的磁盘空间满了,数据库就仅仅能读而不能写,倘若使用的是getWritableDatabase() 方法就会出错。

getReadableDatabase()方法先以读写方式打开数据库,假设数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以仅仅读方式打开数据库。

l
public class DatabaseHelper extends SQLiteOpenHelper {
    //类没有实例化,是不能用作父类构造器的參数,必须声明为静态
         private static final String name = "itcast"; //数据库名称
         private static final int version = 1;
//数据库版本号
         public DatabaseHelper(Context context) {
//第三个參数CursorFactory指定在运行查询时获得一个游标实例的工厂类,设置为null,代表使用系统默认的工厂类
                super(context, name, null, version);
         }
        @Override public void onCreate(SQLiteDatabase db) {
              db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement, name varchar(20), age
INTEGER)");  
         }
        @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
               db.execSQL("DROP TABLE IF EXISTS person");
               onCreate(db);
         }
}
上面onUpgrade()方法在数据库版本号每次发生变化时都会把用户手机上的数据库表删除,然后再又一次创建。一般在实际项目中是不能这样做的。正确的做法是在更新数据库表结构时,还要考虑用户存放于数据库中的数据不会丢失。

l




==================================================================================
 /**

@author Administrator yangchao

*为了实现对数据库版本号进行管理,SQLiteOpenHelper类提供了两个重要的方法。

*各自是onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase dbint oldVersion, int newVersion)

*/

public class DBOpenHelper extends SQLiteOpenHelper

{

private static final String DatabaseName = "test.db";//数据库的名称

private static final int DatabaseVersion =
1;//数据库的版本

public DBOpenHelper(Context
context)

{

super(context, DatabaseNamenullDatabaseVersion);

}

/*

* 用于初次使用软件时生成数据库表

*/

@Override

public void onCreate(SQLiteDatabase
db)

{

db.execSQL("CREATE TABLE person (personId
integer primary key autoincrement, name varchar(20))");

}

/*

* 用于升级软件时更新数据库表结构。

* 仅仅有在数据库版本号发生改变时 才会被调用

*/

@Override

public void onUpgrade(SQLiteDatabase
db, int oldVersion, int newVersion)

{

}

}

------------------------------------------------------------------------------------------------------------------------------------

public class PersonService

{

DBOpenHelper dbOpenHelper;

public PersonService(){}

public PersonService(Context
context)

{

this.dbOpenHelper = new DBOpenHelper(context);

}

/**

* 保存方法

@param person

*/

public void save(Person
person)

{

SQLiteDatabase database = dbOpenHelper.getWritableDatabase();

String sql = "insert
into person(personId, name) values(?, ?

)";

database.execSQL(sql, new Object[]{person.getPersonId(),
person.getName()});

}

/**

* 更改方法

@param person

*/

public void update(Person
person)

{

SQLiteDatabase database = dbOpenHelper.getWritableDatabase();

String sql = "update
person set name=? where personId=?";

database.execSQL(sql, new Object[]{person.getName(),
person.getPersonId()});

}

/**

* 删除方法

@param person

*/

public void delete(Person
person)

{

SQLiteDatabase database = dbOpenHelper.getWritableDatabase();

String sql = "delete
from person where personId=?";

database.execSQL(sql, new Object[]{person.getPersonId()});

}

/**

* 查找单个记录

@param id

@return

*/

public Person
find(Integer id)

{

SQLiteDatabase database = dbOpenHelper.getReadableDatabase();

String sql = "select
* from person where personId = ?

";

Cursor cursor = database.rawQuery(sql, new String[]{id.toString()});

if(cursor.moveToFirst())

{

String name = cursor.getString(cursor.getColumnIndex("name"));

int personId
= cursor.getInt(cursor.getColumnIndex("personId"));

return new Person(personId,
name);

}

return null;

}

/**

* 分页查找

@param offset

@param maxResult

@return

*/

public List<Person>
getScrollData(Integer offset, Integer maxResult)

{

List<Person> persons = new ArrayList<Person>();

SQLiteDatabase database = dbOpenHelper.getReadableDatabase();

String sql = "select
* from person limit ?

, ?";

Cursor cursor = database.rawQuery(sql, new String[]{offset.toString(),
maxResult.toString()});

while(cursor.moveToNext())

{

int personId
= cursor.getInt(cursor.getColumnIndex("personId"));

String name = cursor.getString(cursor.getColumnIndex("name"));

persons.add(new Person(personId,
name) );

}

return persons;

}

/**

* 获取总记录数

@return

*/

public long getCount()

{

SQLiteDatabase database = dbOpenHelper.getReadableDatabase();

String sql = "select
count(*) from person";

Cursor cursor = database.rawQuery(sql, null);

cursor.moveToFirst();

return cursor.getLong(0);

}

}

====================================測试======================================

public class DBTest extends AndroidTestCase

{

private static final String TAG = "DBTest";

public void testCreateDB()

{

DBOpenHelper helper = new DBOpenHelper(this.getContext());

/*

* 当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取

* 用于操作数据库的SQLiteDatabase实例的时候,假设数据库不存在,Android系统会自己主动生成一个数据库。

* 接着调用onCreate()方法

*/

helper.getWritableDatabase();

}

public void testSava() throws Exception

{

PersonService service = new PersonService(this.getContext());

service.save(new Person(1, "杨超"));

service.save(new Person(2, "杨超1"));

service.save(new Person(3, "杨超2"));

}

public void testDelete()

{

}

public void testFind()

{

PersonService service = new PersonService(this.getContext());

Person person = service.find(4);

Log.i(TAG,
person.toString());

}

public void testFenye()

{

}

public void testCount()

{

}

}

版权声明:本文博主原创文章。博客,未经同意不得转载。

Android——采用SQLiteDatabase操作SQLite数据库的更多相关文章

  1. Android——使用SQLiteDatabase操作SQLite数据库

    除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据. 在Android平台上,集成了一个嵌入式关系型数据库-SQLite,SQLite3支持 NUL ...

  2. 赵雅智_使用SQLiteDatabase操作SQLite数据库及事务

    知识点具体解释:http://blog.csdn.net/zhaoyazhi2129/article/details/9025995 详细代码: MainActivity.java package c ...

  3. android之存储篇——SQLite数据库

    转载:android之存储篇_SQLite数据库_让你彻底学会SQLite的使用 SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么. 例如:可以在In ...

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

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

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

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

  6. 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)

    1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...

  7. Android中操作SQLite数据库

    我又回到了安卓的学习当中,忙来忙去终于忙的差不多有时间做自己的事情了,这感觉实在是太棒了!!本来想写android的控件以及他们的监视器的,但是我查了查android的手册,基本上都能查到,但是查有些 ...

  8. 通过adb shell操作android真机的SQLite数据库

    要通过命令行直接操作android真机上的SQLite数据库,可以直接通过adb shell来完成,不过,前提是必须获得root权限. 另外,android系统其实就是linux的shell,这个应该 ...

  9. android:Android中用文件初始化sqlite数据库(zz)

        很多时候在应用安装初始化时,需要创建本地数据库,同时为数据库添加数据,之后再从数据库中读取数据. 这里有2个思路 1.先在本地创建一个能支持android使用的sqlite数据库文件,启动时, ...

随机推荐

  1. 如何让ios app支持32位和64位?

    将ios app转换为兼容32位和64位步骤:  1. 安装 Xcode 5.  2. 打开你的项目.Xcode会提示你更新你的项目,其中的警告和错误信息对于转换到64位相当重要.  3. 将你的项目 ...

  2. [转]linux下IPTABLES配置详解

    如果你的IPTABLES基础知识还不了解,建议先去看看.开始配置我们来配置一个filter表的防火墙.(1)查看本机关于IPTABLES的设置情况[root@tp ~]# iptables -L -n ...

  3. Scrapy URLError

    错误信息如下: 2015-12-03 16:05:08 [scrapy] INFO: Scrapy 1.0.3 started (bot: LabelCrawler) 2015-12-03 16:05 ...

  4. svm中的数学和算法

    支持向量机(Support Vector Machine)是Cortes和Vapnik于1995年首先提出的,它在解决小样本.非线性及高维模式识别中表现出很多特有的优势,并可以推广应用到函数拟合等其它 ...

  5. jquery第三期:js与jquery对象转换

    我们开始进入jquery的学习了,jquery的学习就不那么中规中矩了,我们来看一个和javascript有所区别的地方. <!DOCTYPE html PUBLIC "-//W3C/ ...

  6. Java Collection 集合类大小调整带来的性能消耗

    Java Collection类的某些详细实现因为底层数据存储基于数组,随着元素数量的添加,调整大小的代价非常大.随着Collection元素增长到某个上限,调整其大小可能出现性能问题. 当Colle ...

  7. iOS开发-使用Storyboard进行界面跳转及传值

    前言:苹果官方是推荐我们将所有的UI都使用Storyboard去搭建,Storyboard也是一个很成熟的工具了.使用Storyboard 去搭建所有界面,我们可以很迅捷地搭建出复杂的界面,也就是说能 ...

  8. 【稳定婚姻问题】【HDU1435】【Stable Match】

    2015/7/1 19:48 题意:给一个带权二分图  求稳定匹配 稳定的意义是对于某2个匹配,比如,( a ---- 1) ,(b----2) , 如果 (a,2)<(a,1) 且(2,a)& ...

  9. 《JavaScript 闯关记》

    为何写作此课程 stone 主要负责基于 Web 的企业内部管理系统的开发,虽然能够熟练地使用 JavaScript,但随着对 JavaScript 的理解越来越深,才发现自己尚未掌握其精髓. 201 ...

  10. iOS学习心得——UINavigationController

            UINavigationController和UItableviewController一样也是iOS开发中常用的控件之一,今天就来学习一下它的常见用法.         有人说tab ...