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
原创粉丝点击