安卓内部存储数据有多种方式,其中就有利用SQLite数据库存储的,今日这篇文章就来说说如何实现数据库存储?
一般我们实现数据库存储,主要做两件事情,
第一件事情是创建一个数据库,并且定义好我们想要的表结构,
第二件事情就是我们需要定义好实现对数据库增删改查的函数,以供外部调用.
在实现代码之前,我们需要先来说明一下SQLITE数据库是什么东东?
一般写代码的人都知道数据库,也知道数据库管理系统有ORACLE ,SQL SERVER ,和MYSQL 等等.
那么sqlite这是个什么玩意就容易比较理解了.简单来说,它也是一个数据库,它支持大多数的标准sql语言,你可以把它看作是跟oracle sql server 等价的数据库也可以,只不过sqlite是在安卓手机内部存储数据而已.
另外,有件事情我也不太确定,那就是sqlite是弱类型的数据库,这个我是见过有一些材料这么说的,但是具体由于我没有验证过,所以不太确定,有兴趣的朋友不妨可以去验证验证.
下面是代码实现:
①首先是创建一个数据库,并定义好我们需要的表结构.这里我定义的表就是一张课程表,里面只有两个字段,分别是课程id 和 课程名字.
这里我们需要创建一个类并且继承于sqliteopenhelper
`
package com.example.service;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DataBaseHelper extends SQLiteOpenHelper {
/**
* 该方法用于创建数据库, 其中name参数是数据库的名字,这里设置为Course,
* factory 是游标工厂,用来创建游标,我们可以设为null,意思就是使用系统默认的游标工厂
* ,最后一个参数version是指数据库的版本号,必须是大于0,不可以等于0,
* 这里为了方便,我就将参数写死,只保留一个context参数
*
* @param context
* @param name
* @param factory
* @param version
*/
public DataBaseHelper(Context context) {
super(context, "Course.db", null, 1);
// TODO 自动生成的构造函数存根
//当版本号码变为2的时候,就会调用onUpgrade方法
// super(context, "Course.db", null, 2);
}
/**
* 该方法在数据库第一次被创建时候被调用,用于定义好表结构,
*/
@Override
public void onCreate(SQLiteDatabase db) {
// TODO 自动生成的方法存根
db.execSQL("create table courses (course_id Integer primary key autoincrement)");
}
/**
* 该方法是当数据库的版本号发生改变时被调用,比如我现在版本号码是1,当我版本号码变为2的时候,就会调用该方法,该方法一般用于改变表结构
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO 自动生成的方法存根
db.execSQL("alter table courses add course_name varchar(10)");
}
}
package com.example.service;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DataBaseHelper extends SQLiteOpenHelper {
/**
* 该方法用于创建数据库, 其中name参数是数据库的名字,这里设置为Course,
* factory 是游标工厂,用来创建游标,我们可以设为null,意思就是使用系统默认的游标工厂
* ,最后一个参数version是指数据库的版本号,必须是大于0,不可以等于0,
* 这里为了方便,我就将参数写死,只保留一个context参数
*
* @param context
* @param name
* @param factory
* @param version
*/
public DataBaseHelper(Context context) {
super(context, "Course.db", null, 1);
// TODO 自动生成的构造函数存根
//当版本号码变为2的时候,就会调用onUpgrade方法
// super(context, "Course.db", null, 2);
}
/**
* 该方法在数据库第一次被创建时候被调用,用于定义好表结构,
*/
@Override
public void onCreate(SQLiteDatabase db) {
// TODO 自动生成的方法存根
db.execSQL("create table courses (course_id Integer primary key autoincrement)");
}
/**
* 该方法是当数据库的版本号发生改变时被调用,比如我现在版本号码是1,当我版本号码变为2的时候,就会调用该方法,该方法一般用于改变表结构
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// TODO 自动生成的方法存根
db.execSQL("alter table courses add course_name varchar(10)");
}
}
`
②创建增删改查等方法,以供调用
下面是另外创建一个类,名字为CourseService,并实现增删改查等等方法.
为了方便,我们还需要创建一个JAVABEAN ,即是课程两个属性的类文件.
首先是JAVABEAN
`
package com.example.bean;
import android.R.integer;
public class Course {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Course [id=" + id + ", name=" + name + "]";
}
public Course(Integer id,String name) {
// TODO 自动生成的构造函数存根
this.id=id;
this.name=name;
}
public Course() {
// TODO 自动生成的构造函数存根
}
}
package com.example.bean;
import android.R.integer;
public class Course {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Course [id=" + id + ", name=" + name + "]";
}
public Course(Integer id,String name) {
// TODO 自动生成的构造函数存根
this.id=id;
this.name=name;
}
public Course() {
// TODO 自动生成的构造函数存根
}
}
`
然后是增删改查等等方法代码:
`
package com.example.service;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.example.bean.Course;
public class CourseService {
private DataBaseHelper helper;
public CourseService(Context context) {
// TODO 自动生成的构造函数存根
helper=new DataBaseHelper(context);
}
/**
* 插入数据
* @param course_name
* @throws Exception
*/
public void insert(String course_name) throws Exception{
SQLiteDatabase db=helper.getWritableDatabase();
db.execSQL("insert into courses(course_name) values(?)",new Object[]{course_name});
db.close();
}
/**
* 删除数据
* @param id
* @throws Exception
*/
public void delete(Integer id) throws Exception{
SQLiteDatabase db=helper.getWritableDatabase();
db.execSQL("delete from courses where course_id=?",new Object[]{id});
db.close();
}
/**
* 更新数据
* @param c
* @throws Exception
*/
public void update(Course c) throws Exception{
SQLiteDatabase db=helper.getWritableDatabase();
db.execSQL("update courses set course_name=? where course_id=?",new Object[]{c.getName(),c.getId()});
db.close();
}
/**
* 查询数据
* @param id
* @return
* @throws Exception
*/
public List<Course> query(Integer id) throws Exception{
List<Course> courses=new ArrayList<Course>();
SQLiteDatabase db=helper.getReadableDatabase();
Cursor cursor= db.rawQuery("select * from courses", null);
while(cursor.moveToNext()){
Course cou=new Course();
cou.setId(cursor.getInt(cursor.getColumnIndex("course_id")));
cou.setName(cursor.getString(cursor.getColumnIndex("course_name")));
courses.add(cou);
}
cursor.close();
return courses;
}
/**
* 分页查询数据
* @param maxCount
* @param offset
* @return
* @throws Exception
*/
public List<Course> queryDivide(int maxCount,int offset) throws Exception{
List<Course> courses=new ArrayList<Course>();
SQLiteDatabase db=helper.getReadableDatabase();
Cursor cursor= db.rawQuery("select * from courses limit ? offset ?",
new String[]{String.valueOf(maxCount),String.valueOf(offset)});
while(cursor.moveToNext()){
Course cou=new Course();
cou.setId(cursor.getInt(cursor.getColumnIndex("course_id")));
cou.setName(cursor.getString(cursor.getColumnIndex("course_name")));
courses.add(cou);
}
cursor.close();
return courses;
}
}
`
实际上到这里,sqlite数据库的如何使用,已经论述完了,但是数据库避免不了一件事情,就是事务的原子性.
要么都做,要么都不做,这是数据库的很重要的一件事情.
下面讲述最后一个知识点,sqlite如何开启一个事务.
代码如下:
`
/**
* 该方法只是一个demo而已,开启一个事务,一次性添加两门课程,分别是1111和2222,
* 虽然这件事情毫无意义,但是开启事务代码就这么简单,大家只需要将相关的代码改改就好了
* @throws Exception
*/
public void insert2 () throws Exception{
SQLiteDatabase db=helper.getWritableDatabase();
db.beginTransaction();//开启一个事务
try{
db.execSQL("insert into courses(course_name) values(?)",new Object[]{"1111"});
db.execSQL("insert into courses(course_name) values(?)",new Object[]{"2222"});
db.setTransactionSuccessful();//设置事务结束标志为true,因为事务结束有两种情况,分别是commit 和rollback,若不将标识设为successful,那么事务结束时候不会提交,而是回滚
}finally{
db.endTransaction();//结束一个事务
db.close();
}
}
`
好的,本文章要说的内容已经说完了.
最后一个友情提示:
大家知道自己创建的数据库文件存放在哪里么?
打开模拟器,在路径data/data/你创建数据库文件的项目包/database/的下面就有你自己创建的数据库文件了.
你可以将其导出来,利用SQLiteExpert来进行查看.