安卓内部存储数据有多种方式,其中就有利用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来进行查看.