Android——采用SQLiteDatabase操作SQLite数据库
比如:能够在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。
但有一种情况例外:定义为INTEGER
PRIMARY KEY的字段仅仅能存储64位整数, 当向这样的字段保存除整数以外的数据时,将会产生错误。
另外。 SQLite 在解析CREATE
TABLE 语句时,会忽略 CREATE
TABLE 语句中跟在字段名后面的数据类型信息,如以下语句会忽略 name字段的类型信息:
by 分组字句 having ... order by 排序子句
* from Account limit 3,5
values(值列表)。
如: insert
into person(name, age) values(‘传智’,3)
person set name=‘传智‘
where id=10
from person where id=10
那么。我们怎样才干实如今用户初次使用或升级软件时自己主动在用户的手机上创建出应用须要的数据库表呢?总不能让我们在每一个须要安装此软件的手机上通过手工方式创建数据库表吧?由于这种需求是每一个数据库应用都要面临的。所以在Android系统,为我们提供了一个名为SQLiteOpenHelper的抽象类。必须继承它才干使用,它是通过对数据库版本号进行管理来实现前面提出的需求。
db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),前者用于初次使用软件时生成数据库表,后者用于升级软件时更新数据库表结构。
当调用SQLiteOpenHelper的getWritableDatabase()或者getReadableDatabase()方法获取用于操作数据库的SQLiteDatabase实例的时候。假设数据库不存在,Android系统会自己主动生成一个数据库。接着调用onCreate()方法。onCreate()方法在初次生成数据库时才会被调用,在onCreate()方法里能够生成数据库表结构及加入一些应用使用到的初始化数据。
onUpgrade()方法在数据库的版本号发生变化时会被调用,一般在软件升级时才需改变版本号号,而数据库的版本号是由程序猿控制的,假设数据库如今的版本号是1,因为业务的变更,改动了数据库表结构,这时候就须要升级软件,升级软件时希望更新用户手机里的数据库表结构。为了实现这一目的。能够把原来的数据库版本号设置为2(有同学问设置为3行不行?当然能够,假设你愿意,设置为100也行),而且在onUpgrade()方法里面实现表结构的更新。当软件的版本号升级次数比較多。这时在onUpgrade()方法里面能够依据原版号和目标版本号进行推断,然后作出对应的表结构及数据更新。
但getWritableDatabase() 方法以读写方式打开数据库。一旦数据库的磁盘空间满了,数据库就仅仅能读而不能写,倘若使用的是getWritableDatabase() 方法就会出错。
getReadableDatabase()方法先以读写方式打开数据库,假设数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以仅仅读方式打开数据库。
//数据库版本号
INTEGER)");
* @author Administrator yangchao
*为了实现对数据库版本号进行管理,SQLiteOpenHelper类提供了两个重要的方法。
*各自是onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int 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, DatabaseName, null, DatabaseVersion);
}
/*
* 用于初次使用软件时生成数据库表
*/
@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数据库的更多相关文章
- Android——使用SQLiteDatabase操作SQLite数据库
除了可以使用文件或SharedPreferences存储数据,还可以选择使用SQLite数据库存储数据. 在Android平台上,集成了一个嵌入式关系型数据库-SQLite,SQLite3支持 NUL ...
- 赵雅智_使用SQLiteDatabase操作SQLite数据库及事务
知识点具体解释:http://blog.csdn.net/zhaoyazhi2129/article/details/9025995 详细代码: MainActivity.java package c ...
- android之存储篇——SQLite数据库
转载:android之存储篇_SQLite数据库_让你彻底学会SQLite的使用 SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么. 例如:可以在In ...
- android开发之使用SQLite数据库存储
http://blog.csdn.net/jason0539/article/details/16360835 SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且 ...
- 在Android 开发中使用 SQLite 数据库笔记
SQLite 介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它.许多开源项目((Mozilla, PH ...
- 无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)
1.android下junit测试框架配置 单元测试需要在手机中进行安装测试 (1).在清单文件中manifest节点下配置如下节点 <instrumentation android:name= ...
- Android中操作SQLite数据库
我又回到了安卓的学习当中,忙来忙去终于忙的差不多有时间做自己的事情了,这感觉实在是太棒了!!本来想写android的控件以及他们的监视器的,但是我查了查android的手册,基本上都能查到,但是查有些 ...
- 通过adb shell操作android真机的SQLite数据库
要通过命令行直接操作android真机上的SQLite数据库,可以直接通过adb shell来完成,不过,前提是必须获得root权限. 另外,android系统其实就是linux的shell,这个应该 ...
- android:Android中用文件初始化sqlite数据库(zz)
很多时候在应用安装初始化时,需要创建本地数据库,同时为数据库添加数据,之后再从数据库中读取数据. 这里有2个思路 1.先在本地创建一个能支持android使用的sqlite数据库文件,启动时, ...
随机推荐
- UVA 489-- Hangman Judge(暴力串处理)
Hangman Judge In ``Hangman Judge,'' you are to write a program that judges a series of Hangman gam ...
- 卓尼斯ZT-180评測
卓尼斯ZT-180评測 ——正在出差途中,用10”上网本发帖,没有拍照,且写得冲忙,不妥之处见谅. 一.採购 1.因外出旅游,不想带那台14"笔记本,所以想买一台平板电脑.当时,选择的 ...
- C#委托 Lamda表达式
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- UVA 1601 The Morning after Halloween
题意: 给出一个最大为16×16的迷宫图和至多3个ghost的起始位置和目标位置,求最少经过几轮移动可以使三个ghost都到达目标位置.每轮移动中,每个ghost可以走一步,也可以原地不动,需要注意的 ...
- 关于ASP.NET中的负载均衡
ASP.NET站点中做负载均衡: 基于HTTP协议我们可能发现我们要解决两点问题: 第一做到负载均衡,我们需要一个负载均衡器. 可以通过DNS轮询来做,在DNS服务器上配置为每次对我们做负载均衡的同一 ...
- 在Activity中动态设置TextView的隐藏属性
if (true) { //显示 viewHolder.tvLine.setVisibility(View.INVISIBLE);} else { //不显示 viewHolder.tvLine.se ...
- mac 桌面美化
官网:Übersicht 先来大图: 当然,,,我自己的这个还不成型,去官网看看吧,有大神们做好的各种主题可选哦~ 像这样1: 这样2: 甚至这样3:(酷毙了有木有..) Downlo ...
- Photoshop CS6 基础知识
Photoshop CS6 基础知识 新建 练习 宽度72, 像素厘米 ...
- hdu1281棋盘游戏
Problem Description 小希和Gardon在玩一个游戏:对一个N*M的棋盘,在格子里放尽量多的一些国际象棋里面的“车”,并且使得他们不能互相攻击,这当然很简单,但是Gardon限制了只 ...
- Vijos 1121 马拦过河卒
首先要看清题目,卒只能向右或者向下走.而不是四周转.这样的话就无解了. 定义f[i][j],表示走到(i,j)这个点时的总步数.这样就写出了一个递推公式f[i][j]=f[i-1]+f[i][j-1] ...