您的位置:首页 > 移动开发 > Android开发

3.1Android中,Sqlite轻量级数据库的使用

2015-08-18 08:27 513 查看
SQLite是轻量级的数据库,是遵循ACID(原子性、一致性、隔离性、持久性)的关联式数据库管理系统,多用于嵌入式开发,值得注意的是 integer primary key只能存储64位整数。

在Android中,提供了一个SQLiteOpenHelper的抽象类(此类已经加载驱动,实现了 连接数据库.),该类用于数据库版本进行管理,常用方法有:



onCreate 数据库创建时执行(第一次连接获取数据库对象时执行)

onUpgrade 数据库更新时执行(版本号改变时执行)

onOpen 数据库每次打开时执行(打开数据库时调用,在前两个方法之后)

第1步:创建一个PersonSQLiteOpenHelper继承SQLiteOpenHelper,数据库帮助类,用于创建和管理数据库的

package com.example.zhansy.myapplication.db;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
* Created by ZHANSY on 2015/8/18.
* 数据库帮助类,用于创建和管理数据库的
*/
public class PersonSQLiteOpenHelper extends SQLiteOpenHelper{

/**
* 数据库的构造函数
* @param context
* name 数据库名称
* factory 游标工程
* version 数据库的版本号 不可以小于1
*/
public PersonSQLiteOpenHelper(Context context) {
super(context, "zhansy.db", null, 1);
}

@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
//操作数据库
String sql = "create table person(_id integer primary key, name varchar(20),age integer)";
sqLiteDatabase.execSQL(sql);//创建person表

}

/**
* 数据库的版本号更新时回调此方法,
* 更新数据库的内容(删除表, 添加表, 修改表)
* @param sqLiteDatabase
* @param i 旧版本号
* @param i1 新版本号
*/
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
if(i == 1 && i1 == 2) {
//数据库更新啦,在person表中添加一个余额列balance
sqLiteDatabase.execSQL("alter table person add balance integer;");
}
}
}


第2步:创建一个person实体类,便于操作数据库的增删改查

package com.example.zhansy.myapplication.bean;

/**
* Created by ZHANSY on 2015/8/18.
* 实体类Person
*/
public class Person {
private int id;
private String name;
private int age;

public Person(int id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}

public Person() {
}

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 int getAge() {
return age;
}

public void setAge(int age) {
this.age = age;
}

@Override
public String toString() {
return "Person{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}


第3步:对“人”的表的数据库进行增删改查的操作

获得数据库的读写对象,判断数据库是否打开,执行增删改查操作,最后一定要关闭数据库

package com.example.zhansy.myapplication.dao;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import com.example.zhansy.myapplication.bean.Person;
import com.example.zhansy.myapplication.db.PersonSQLiteOpenHelper;

import java.util.ArrayList;
import java.util.List;

/**
* Created by ZHANSY on 2015/8/18.
*/
public class PersonDao {
private PersonSQLiteOpenHelper mOpenHelper;//数据库帮助类

public PersonDao(Context context) {
mOpenHelper = new PersonSQLiteOpenHelper(context);
}

/**
* 添加person表一条数据
* @param person
*/
public void insert(Person person) {
//执行这一步时,数据库对象才被真正创建
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
if (db.isOpen()) {
//如果数据库打开,则执行添加数据操作
db.execSQL("insert into person(name,age) values(?,?);", new Object[]{person.getName(), person.getAge()});
db.close();//关闭数据库
}
}

/**
* 根据ID删除记录
*
* @param id
*/
public void delete(int id) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
if (db.isOpen()) {
//如果数据库打开,则执行添加数据操作
db.execSQL("delete from person where _id = ?", new Integer[]{id});
db.close();//关闭数据库
}
}

/**
* 根据id找到记录,并且修改姓名
*
* @param id
* @param name
*/
public void update(int id, String name) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
if (db.isOpen()) {
//如果数据库打开,则执行添加数据操作
db.execSQL("update person set name = ? where _id = ?;", new Object[]{name, id});
db.close();//关闭数据库
}
}

/**
* 取数据库中的所有人
* @return 全部人的信息person
*/
public List<Person> queryAll() {
SQLiteDatabase db = mOpenHelper.getReadableDatabase();
if (db.isOpen()) {
//默认cursor值为-1
Cursor cursor = db.rawQuery("select _id,name,age from person;", null);//等价于select * from person
if (cursor !=null && cursor.getCount()>0) {
List<Person> personsList = new ArrayList<Person>();
int id;
String name;
int age;
while (cursor.moveToNext()) {
id = cursor.getInt(0);//取第0列的数据 id
name = cursor.getString(1);//取姓名
age = cursor.getInt(2);//取年龄
personsList.add(new Person(id, name, age));
}
db.close();
return personsList;
}
db.close();
}
return null;
}

/**
* 根据id查询人
* @param id
* @return
*/
public Person queryItem(int id){
SQLiteDatabase db = mOpenHelper.getReadableDatabase();
if(db.isOpen()) {
Cursor cursor = db.rawQuery("select _id,name,age from person where _id = ?", new String[]{id + ""});
if(cursor != null && cursor.moveToFirst()) {
int _id = cursor.getInt(0);
String name = cursor.getString(1);
int age = cursor.getInt(2);
db.close();
return new Person(_id, name, age);
}
db.close();
}
return null;
}
}


用SQLite自带的API进行增删改查:

/**
* 添加到person表一条数据
* @param person
*/
public void insert(Person person) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
if(db.isOpen()) {   // 如果数据库打开, 执行添加的操作

ContentValues values = new ContentValues();
values.put("name", person.getName());       // key作为要存储的列名, value对象列的值
values.put("age", person.getAge());
long id = db.insert("person", "name", values);
Log.i(TAG, "id: " + id);

db.close(); // 数据库关闭
}
}

/**
* 更据id删除记录
* @param id
*/
public void delete(int id) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();  // 获得可写的数据库对象
if(db.isOpen()) {   // 如果数据库打开, 执行添加的操作

String whereClause = "_id = ?";
String[] whereArgs = {id + ""};
int count = db.delete("person", whereClause, whereArgs);
Log.i(TAG, "删除了: " + count + "行");
db.close(); // 数据库关闭
}
}

/**
* 根据id找到记录, 并且修改姓名
* @param id
* @param name
*/
public void update(int id, String name) {
SQLiteDatabase db = mOpenHelper.getWritableDatabase();
if(db.isOpen()) {   // 如果数据库打开, 执行添加的操作
ContentValues values = new ContentValues();
values.put("name", name);

int count  = db.update("person", values, "_id = ?", new String[]{id + ""});

Log.i(TAG, "修改了: " + count + "行");

db.close(); // 数据库关闭
}
}

public List<Person> queryAll() {
SQLiteDatabase db = mOpenHelper.getReadableDatabase();  // 获得一个只读的数据库对象
if(db.isOpen()) {
String[] columns = {"_id", "name", "age"};  // 需要的列
String selection = null;    // 选择条件, 给null查询所有
String[] selectionArgs = null;  // 选择条件的参数, 会把选择条件中的? 替换成数据中的值
String groupBy = null;  // 分组语句  group by name
String having = null;   // 过滤语句
String orderBy = null;  // 排序

Cursor cursor = db.query("person", columns, selection, selectionArgs, groupBy, having, orderBy);

int id;
String name;
int age;
if(cursor != null && cursor.getCount() > 0) {
List<Person> personList = new ArrayList<Person>();

while(cursor.moveToNext()) {    // 向下移一位, 知道最后一位, 不可以往下移动了, 停止.
id = cursor.getInt(0);
name = cursor.getString(1);
age = cursor.getInt(2);

personList.add(new Person(id, name, age));
}

db.close();
return personList;
}
db.close();
}
return null;
}

/**
* 根据id查询人
* @param id
* @return
*/
public Person queryItem(int id) {
SQLiteDatabase db = mOpenHelper.getReadableDatabase();  // 获得一个只读的数据库对象
if(db.isOpen()) {
String[] columns = {"_id", "name", "age"};  // 需要的列
String selection = "_id = ?";   // 选择条件, 给null查询所有
String[] selectionArgs = {id + ""}; // 选择条件的参数, 会把选择条件中的? 替换成数据中的值
String groupBy = null;  // 分组语句  group by name
String having = null;   // 过滤语句
String orderBy = null;  // 排序

Cursor cursor = db.query("person", columns, selection, selectionArgs, groupBy, having, orderBy);

if(cursor != null && cursor.moveToFirst()) {        // cursor对象不为null, 并且可以移动到第一行
int _id = cursor.getInt(0);
String name = cursor.getString(1);
int age = cursor.getInt(2);

db.close();
return new Person(_id, name, age);
}
db.close();
}
return null;
}


最后就是在main函数中,要进行哪个操作就调用哪个的方法。

总结的语句为:

创建表:
create table person(
_id integer primary key autoincrement,
name varchar(20),
age integer
);

添加: insert into person(name, age) values('lisi', 19);

删除: delete from person where _id = 1;

修改: update person set name = '李四' where name = '王五';

查询所有: select * from person;

查询单条: select * from person where name = 'zhangsan';

事务的作用是:标记需要运行的操作代码,全部成功执行才算成功,否则回滚到开启事务之前。
事务:
update person set balance = balance - 100 where name = 'lisi';
update person set balance = balance + 100 where name = 'zhangsan';

// 开启事务
db.beginTransaction();

// 标记事务成功
db.setTransactionSuccessful();

// 停止事务
db.endTransaction();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: