android开发 - SQLite
来源:互联网 发布:sqlserver 2008 个人版 编辑:程序博客网 时间:2024/06/06 07:11
嵌入式关系型SQLite数据库存储数据
在android平台上,集成了一个嵌入式关系型数据库-SQLite,SQLite3
支持
NULL
INTEGER
REAL(浮点数字)
TEXT(字符串文本)
BLOB(二进制对象)
五种数据类型,但实际上sqlite3也接受varchar(n),char(n),decimal(p,s)等数据类型,只不过在运算或保存时会转成对应的五种数据类型,SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的类型字段是什么,
例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中村存放浮点数,或者在字符型字段中存放日期型值,但有一种情况例外,定义为INTEGER PRIMARY KEY的字段只能存储64位整数,当向这种字段保存除整数意外的数据时,将会产生错误,另外,在编写CREATE TABLE语句时,你可以省略跟在字段名称后面的数据类型信息
可以写我们标准的SQL语句给SQLite数据库执行
在创建数据库时,给定字段加入varchar(10)那么我们使用时,可以给它值超过varchar(10)的值,所以我们也称为无数据类型的数据库
SQLite可以解析大部分标准的SQL语句
比如:
1. SQL SERVER
select top 10 * from User
top不属于标准SQL语句
2. MY SQL
select * from User limit 10
limit属于标准SQL语句
SQLite数据分页
select * from User limit 5 offset 3
或者
select * from User limit 3,5
插入语句
1. 获取刚插入的数据的ID
SELECT last_insert_rowid()
2. insert into 表名(字段列表) value(值列表)
更新语句
update 表名 set 字段名=值 where 条件语句
删除语句
delete from 表名 where 条件语句
创建表
create table person(
personid integer primary key autoincrement name varchar(20)
)
SQLite语句和MY SQL语句差不多使用
1.创建数据库
SQLiteOpenHelper 类
.getReadableDatabase() 或 .getwritableDatabase()
使用SQLiteExport工具,就像SQL SERVER一样的操作工具
这是创建SQLiteOpenHelper的操作
public class DBOpenHelper extends SQLiteOpenHelper {
public DBOpenHelper(
Context context ) {
super(context, "mydb.db", null, 2);
}
/**
* 是在数据库每一次被创建时调用
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table person(personid integer primary key autoincrement ,name varchar(20)) ");
}
/**
* 是在数据库(SQLite)版本更新的时候调用
*/
@Override
public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
db.execSQL(" alter table person add phone varchar(12) null ");
}
}
这是操作数据库
package com.example.service;
import java.util.ArrayList;
import java.util.List;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
public class PersonService {
private DBOpenHelper dbOpen;
public PersonService(Context context){
this.dbOpen = new DBOpenHelper(context);
}
public void insert(Person person){
//SQLiteDatabase是带有缓存功能的
SQLiteDatabase db = dbOpen.getWritableDatabase();
//第一种方式
db.execSQL("insert into person(name,phone)values(?,?)",
new Object[]{person.getName(), person.getPhone()});
db.close();
//第二种方式
ContentValues values = new ContentValues();
values.put("name", "另一种插入方式的姓名");
values.put("phone", "另一中方式的手机号码");
db.insert("Person", null, values);
}
public void update(Person person){
SQLiteDatabase db = dbOpen.getWritableDatabase();
db.execSQL("update person set name=?,phone=?",
new Object[]{ person.getName(),person.getPhone()});
}
public void delete(Integer id){
SQLiteDatabase db = dbOpen.getWritableDatabase();
db.u
db.execSQL("delete from person where personid=?",
new Object[]{ id });
}
public Person find(Integer id){
SQLiteDatabase db = dbOpen.getReadableDatabase();
Cursor cursor = db.rawQuery("select * from person where personid=?",
new String[]{id.toString()});
Person person = null;
if(cursor.moveToFirst()){
int personid = cursor.getInt(cursor.getColumnIndex("personid"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String phone = cursor.getString(cursor.getColumnIndex("phone"));
person = new Person(personid,name,phone);
}
cursor.close();
db.close();
return person;
}
public List<Person> getPageData(int offset,int maxResult){
List<Person> list = new ArrayList<Person>();
SQLiteDatabase db = dbOpen.getReadableDatabase();
Cursor cursor = db.rawQuery("select * from person order by personid asc limit ?,?",
new String[]{String.valueOf(offset),String.valueOf(maxResult)});
while(cursor.moveToNext()){
int personid = cursor.getInt(cursor.getColumnIndex("personid"));
String name = cursor.getString(cursor.getColumnIndex("name"));
String phone = cursor.getString(cursor.getColumnIndex("phone"));
list.add(new Person(personid,name,phone));
}
cursor.close();
db.close();
return list;
}
public long getCount(){
SQLiteDatabase db = dbOpen.getWritableDatabase();
Cursor cursor = db.rawQuery("select count(*) from person",null);
int result=0;
if(cursor.moveToFirst()){
result = cursor.getInt(0);
}
cursor.close();
db.close();
return result;
}
}
这是测试
public class PersonServiceTest extends AndroidTestCase {
public void testCreateDB(){
DBOpenHelper dbopen = new DBOpenHelper(getContext());
dbopen.getWritableDatabase();
}
public void testInsert() throws Exception{
PersonService ps = new PersonService(this.getContext());
for(int i=0;i<100;i++){
ps.insert(new Person(2,"zhangsan"+i,"1367890987"+i));
}
}
public void testUpdate() throws Exception{
PersonService ps = new PersonService(this.getContext());
ps.update(new Person(1,"张三","13822220000"));
}
public void testDelete() throws Exception{
}
public void testFind() throws Exception{
PersonService ps = new PersonService(this.getContext());
Person p = ps.find(1);
Log.i("Person","id:"+p.getId().toString()+",name:"+p.getName()+",phone:"+p.getPhone());
}
public void testPageData() throws Exception{
PersonService ps = new PersonService(this.getContext());
List<Person> list = ps.getPageData(5, 5);
for(Person p : list){
Log.i("PersonPAGE","id:"+p.getId().toString()+",name:"+p.getName()+",phone:"+p.getPhone());
}
}
public void testGetCount() throws Exception{
PersonService ps = new PersonService(this.getContext());
Log.i("PersonCount",ps.getCount()+"");
}
}
使用事务 ,就像转账,为了保证账户数据的唯一性,
将几条SQL语句一次执行,如果其中有一个数据出错,将回滚,
public void payment(){
SQLiteDatabase db = dbOpen.getWritableDatabase();
db.beginTransaction();//开启事务
try{
db.execSQL("update person set amount=amount-10 where personid=1");
db.execSQL("update person set amount=amount+10 where personid=2");
db.setTransactionSuccessful();//设置事务的标志为true
}finally{
db.endTransaction();
}
//结束事务,有两种情况:commit rollback
//事务的提交或回滚有事务的标志决定的,如果事务的表示为true,事务就会提交,否则回滚,默认情况下事务的表示为false
}
1 0
- android sqlite开发笔记
- Android开发:SQLite应用
- android开发 - SQLite
- Android 开发 SQLite数据库
- ANDROID 开发之 SQLite
- Android开发之SQLite
- Android开发之sqlite
- Android开发-SQLite数据库
- Android开发11:SQLite数据库
- Android开发之Sqlite数据库
- Android手机开发:SQLite数据库
- ANDROID开发之SQLite详解
- Android开发之SQLite数据库
- Android开发查看Sqlite数据库
- ANDROID开发之SQLite详解
- ANDROID开发之SQLite详解
- ANDROID开发之SQLite详解
- ANDROID开发之SQLite详解
- LightOJ 1004 Monkey Banana Problem (线性dp 数字菱形)
- android开发 - 传感器
- Java IO一般使用原则
- 带头结点的线性链表的编写与实现
- 第三章作业3.22
- android开发 - SQLite
- hdu1059 Dividing (多重背包)
- 容量有上下界的可行流
- jhead命令详解
- Memcache与Memcached介绍及安装配置
- Java学习笔记之接口Interface
- D. Arthur and Walls(Codeforces Round #297 (Div. 2) 搜索(BFS))
- android开发 - 电话拨号器
- UIBezierPath使用方法