在Android中利用SQLite实现对数据的增删查改

  停更了一天,I'm back again~~当我们需要操作大量的数据时,我们首先想到的当然是数据库,因为可以通过简单的语句实现数据的增删改查,在Android中,我们不使用SQL或者ORACLE,我们使用SQLite,因为它占用资源更少,而语句格式与SQL语句一样。

  首先,我们来在Android中实现数据库的创建与增删改查,引用数据库的类时,不再继承常用的Activity类,而是继承Android中的SQLiteOpenHelper,创建一个构造方法,四个参数分别是(Context context, String name, SQLiteDatabase.CursorFactory factory,int version),下面我们来分别解释一下这四个参数,context代表上下文环境,大多情况是上下文环境就是activity,name是数据库的名字,通常我们写成"xxx.db",这样方便知道我们创建的是一个数据库,cursor代表指针,在默认为null时,它表示初始为-1,然后依次指向数据库的每一行,我们可以利用cursor来扫描数据库,有条件的扫描就是查找,version代表版本号,只要设置大于等于1的值即可。在数据库类中一定要调用两个方法,即onCreate()与onUpdate()方法,传进来的参数都是数据库对象,它们分别在数据库被创建与数据库被更新时调用,在数据库被创建时创建表,直接调用执行数据库语句方法execSQL(String),代码如下:

package com.administrator.sqlite;

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

/**
 * Created by Administrator on 2016/7/22.
 */
public class MyOpenHelper extends SQLiteOpenHelper {

    //构造方法,new时会调用,cursor:封装数据库查询时返回的数据,初始为-1.依次向下读取下一行数据,null使用默认游标
    public MyOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory,int version){
        super(context,name,factory,version);
    }
    //数据库创建时,此方法会调用
    //创建数据库的同时创建表
    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql="create table student(number char(4) primary key,name char(4),age char(1))";
        db.execSQL(sql);

    }

   //数据库升级时,此方法会调用
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        System.out.println("数据库被升级了");
    }
}

  下面我们用单元测试方法来实现一下数据库的增删改查,写在ApplicationTest中,首先我们定义一个MyOpenHelper的对象,此时我们在测试,没有任何前台任务,所以此时没有正在执行的Activity,Android为我们提供了getContext()方法,用来在没有上下文环境中为我们创建一个虚拟的上下文环境。接下来我们调用getReadableDatabase()来创建或打开一个数据库(如果没有,我们就创建一个数据库,如果有,我们就打开这个数据库),对数据的增删改操作,就是创建好一个数据库后执行相应的SQL语句,最后关闭数据库。代码如下:

package com.administrator.sqlite;

import android.app.Application;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.test.ApplicationTestCase;

/**
 * <a href="http://d.android.com/tools/testing/testing_android.html">Testing Fundamentals</a>
 */
public class ApplicationTest extends ApplicationTestCase<Application> {
    public ApplicationTest() {
        super(Application.class);
    }

    public void testInsert(){
        MyOpenHelper moh=new MyOpenHelper(getContext(),"student.db",null,2);
        SQLiteDatabase db=moh.getReadableDatabase();
        db.execSQL("insert into student values(?,?,?)",new Object[]{"1234","Lily","19"});
        db.execSQL("insert into student values(?,?,?)",new Object[]{"1235","Bob","20"});
        db.execSQL("insert into student values(?,?,?)",new Object[]{"1236","Amy","18"});
        db.execSQL("insert into student values(?,?,?)",new Object[]{"1237","Tom","21"});
        db.execSQL("insert into student values(?,?,?)",new Object[]{"1238","Alice","18"});
        db.execSQL("insert into student values(?,?,?)",new Object[]{"1239","Grace","20"});
        db.execSQL("insert into student values(?,?,?)",new Object[]{"1240","Henry","23"});
        db.execSQL("insert into student values(?,?,?)",new Object[]{"1241","David","40"});
        db.execSQL("insert into student values(?,?,?)",new Object[]{"1242","Soada","17"});
        db.close();
    }

    public void testDelete(){
        MyOpenHelper moh=new MyOpenHelper(getContext(),"student.db",null,2);
        SQLiteDatabase db=moh.getReadableDatabase();
        db.execSQL("delete from student where number=?",new Object[]{1241});
        db.close();
    }

    public void testUpdate(){
        MyOpenHelper moh=new MyOpenHelper(getContext(),"student.db",null,2);
        SQLiteDatabase db=moh.getReadableDatabase();
        db.execSQL("update student set number=? where name=?",new Object[]{"1314","Soada"});
        db.close();
    }
}

  对于对数据库的查找操作,我们需要利用游标实现按行扫描一遍数据库,并取出符合要求的数据,我们调用rawQuery方法,第一个参数为select语句;第二个参数为select语句中占位符参数的值,如果select语句没有使用占位符(也就是where语句),该参数可以设置为null,返回一个游标Cursor。扫描方法是:如果游标指向的下一行不为空,就获取每行每个属性的值,从而实现多行扫描并得到整个数据库的数据。我们还要强调一下getString()方法传递的参数是一个整型的索引值,它代表该属性的索引值,第一个为0,以此类推;但我们在不明确数据库结构的情况下,很难知道确切的值,因此我们通常调用getColumnIndex方法。代码如下:

 1 public void testSelect(){
 2         MyOpenHelper moh=new MyOpenHelper(getContext(),"student.db",null,2);
 3         SQLiteDatabase db=moh.getReadableDatabase();
 4         Cursor cursor=db.rawQuery("select * from student",null);
 5         while(cursor.moveToNext()){
 6             //获取下一行数据
 7             String number = cursor.getString(cursor.getColumnIndex("number"));
 8             String name = cursor.getString(cursor.getColumnIndex("name"));
 9             String age = cursor.getString(cursor.getColumnIndex("age"));
10             System.out.println(number+";"+name+";"+age);
11             db.close();
12         }

下面我们来逐一测试一下:

    增加若干条数据进入数据库student:

删除一条记录:删除number为1241的记录

修改一条记录:Soada的number改为1314

  我们掌握了在Android中使用SQLite对数据的增删改查,下节我们要实现的是将数据库的每条记录依次显示到屏幕上。

 

posted @ 2016-07-23 20:59  小苏打.iLD  阅读(6621)  评论(0编辑  收藏  举报