android数据库的使用

     在实际开发中,为了能够更好的管理和维护数据库,我们会封装一个继承自SQLiteOpenHelper类的数据库操作类,然后以这个类为基础,再封装我们的业务逻辑方法。

     一般在使用数据库时,要写三个类。假设现在要写一个关于个人的信息类,并且用数据库来存储,那么需要写的类有以下三个,分别为Persion,PersonDBManager,PersonDBHelper,下面将一个个来讲解。

技术分享

    首先要确定我们要储存的类都有哪些属性,比如,现在我们存储的是一个个人简单的信息类,它包含的属性有id,name,age以及info,那么该类的写法如下:

package com.lintao.dbusagedemo;

/**
 * 方便面向对象使用数据
 * @author LinTao
 */
public class Person {
    public int id;

    public String name;

    public int age;

    public String info;

    public Person() {

    }

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

    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;
    }

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }


}

      接下来要完成的就是PersonDBHelper类,它封装了SQLiteOpenHelper类,主要用于数据库的更新,代码如下:

package com.lintao.dbusagedemo;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

/**
 * 维护和管理数据库的基类
 * @author LinTao
 *
 */
public class PersonDBHelper extends SQLiteOpenHelper {

    // 用于调试
    private final static String TAG = "DBHelper";

    /** 数据库版本号 */
    private final static int VERSION = 1;

    /** 存储本地用户数据的数据库名称 */
    private final static String DB_NAME = "test.db";

    /** 存储本地用户数据的表名称 */
    public final static String TABLE_NAME = "person";

    // 三个表列名
    public final static String COLUMN_NAME_NAME = "name";

    public final static String COLUMN_NAME_AGE = "age";

    public final static String COLUMN_NAME_INFO = "info";

    public PersonDBHelper(Context context, String name, CursorFactory factory, int version) {
        super(context, name, factory, version);
        // TODO Auto-generated constructor stub
    }

    /**
     * 重载数据库的构造函数,使用已经确定好的数据库名称创建数据库local_user
     * @param context
     */
    public PersonDBHelper(Context context) {
        this(context, DB_NAME, null, VERSION);
    }

    /**
     * 该方法在初次生成数据库时会使用,可能在里面进行建表操作
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        // TODO Auto-generated method stub
        db.execSQL("create table IF NOT EXISTS " + TABLE_NAME
                + "(_id integer primary key autoincrement," + COLUMN_NAME_NAME + " VARCHAR,"
                + COLUMN_NAME_NAME + " INTEGER," + COLUMN_NAME_INFO + " TEXT");
    }

    /**
     * 如果VERSION值被更改,且比一开始的要高,系统会发现现有数据库版本不同,即会调用onUpgrade
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub
        // Logs that the database is being upgraded
        Log.w(TAG, "Upgrading database from version " + oldVersion + " to " + newVersion
                + ", which will destroy all old data");

        //丢弃旧表和旧数据
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);

        // 重新创建新数据库,生成新表
        onCreate(db);
    }

}

     最后也是重点,PersonDBManager类,该类是重点,主要是封装一些数据库的操作,代码如下:

package com.lintao.dbusagedemo;

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

/**
 * 该类用来封装一些业务逻辑
 * @author LinTao
 */
public class PersonDBManager {
    private PersonDBHelper mDBHelper;

    private SQLiteDatabase mDB;

    public PersonDBManager(Context context) {
        mDBHelper = new PersonDBHelper(context);
        mDB = mDBHelper.getWritableDatabase();
    }

    /*****************************************
     * 下面根据需要生成相应的函数,看事务的需求,一般需要什么写什么
     *****************************************/

    /**
     * 根据名字进行查询操作
     * @param person
     */
    /*
     * 执行query方法后,返回的是一个Cursor游标,游标最开始指向的是记录集合中第一行的上一行,
     * 因此首先需要先调用cursor.next()将游标移动到记录集合的第一行,接着再获取数据 游标的使用 c.move(int offset);
     * //以当前位置为参考,移动到指定行 c.moveToFirst(); 
     * //移动到第一行 c.moveToLast(); //移动到最后一行
     * c.moveToPosition(int position); 
     * //移动到指定行 c.moveToPrevious(); 
     * //移动到前一行
     * c.moveToNext(); 
     * //移动到下一行 c.isFirst(); 
     * //是否指向第一条 c.isLast(); 
     * //是否指向最后一条
     * c.isBeforeFirst(); 
     * //是否指向第一条之前 c.isAfterLast(); 
     * //是否指向最后一条之后 c.isNull(int
     * columnIndex); 
     * //指定列是否为空(列基数为0) c.isClosed(); 
     * //游标是否已关闭 c.getCount();
     * //总数据项数 c.getPosition(); 
     * //返回当前游标所指向的行数 c.getColumnIndex(String columnName);
     * //返回某列名对应的列索引值 c.getString(int columnIndex); 
     * //返回当前行指定列的值
     */
    public Cursor query(String name) {
        String[] columns = new String[] {
                PersonDBHelper.COLUMN_NAME_NAME, PersonDBHelper.COLUMN_NAME_AGE, PersonDBHelper.COLUMN_NAME_INFO
        };
        String selection = PersonDBHelper.COLUMN_NAME_NAME + "=?";
        String[] selectionArgs = {
            name
        };

        /*
         * query(String table, String[] columns, String selection, String[]
         * selectionArgs, String groupBy, String having, String orderBy, String
         * limit) 这里复习一下SQL语句的知识
         * columns表示要查询的列所有名称集,selection表示WHERE之后的条件语句,可以使用占位符,groupBy指定分组的列名
         * ,having指定分组条件,配合groupBy使用,orderBy指定排序的列名,limit指定分页参数,distinct可以指定
         * “true”或“false”表示要不要过滤重复值。需要注意的是,selection、groupBy、having、orderBy、limit、这几个参数中不包括“WHERE”、“GROUP
         * BY”、“HAVING”、“ORDER BY”、“LIMIT”等SQL关键
         */
        // 等同于select * from person where name = name;
        Cursor c = mDB.query(PersonDBHelper.TABLE_NAME, columns, selection, selectionArgs, null, null,
                null, null);

        return c;
    }

    /**
     * 判断某个人名是否存在
     * @param name
     * @return
     */
    public boolean isExist(String name) {
        Cursor c = query(name);
        if (c.moveToFirst()) {
            return true;
        } else {
            return false;
        }
    }

    public boolean add(Person person) {
        String name = person.getName();
        int age = person.getAge();
        String info = person.getInfo();

        // 如果已经存在该名字的记录,则不插入,在这里有一个前提,就是假定名字是不能重复的
        ContentValues values = new ContentValues();
        values.put(PersonDBHelper.COLUMN_NAME_NAME, name);
        values.put(PersonDBHelper.COLUMN_NAME_AGE, age);
        values.put(PersonDBHelper.COLUMN_NAME_INFO, info);
        // ??insert返回的行号是从0开始还是从1开始?
        if (mDB.insert(PersonDBHelper.TABLE_NAME, null, values) > -1) {
            return true;
        } else {
            return false;
        }
    }

    public int update(Person person) {
        String name = person.getName();
        int age = person.getAge();
        String info = person.getInfo();

        ContentValues values = new ContentValues();
        values.put(PersonDBHelper.COLUMN_NAME_NAME, name);
        values.put(PersonDBHelper.COLUMN_NAME_AGE, age);
        values.put(PersonDBHelper.COLUMN_NAME_INFO, info);

        // update(table, values, whereClause,
        // whereArgs),whereClause表示where从句,whereArgs表示从句中的参数
        // 以下实际上是以名字为条件进行更新,返回影响的条数
        return mDB.update(PersonDBHelper.TABLE_NAME, values, PersonDBHelper.COLUMN_NAME_INFO + "=?", new String[] {
            name
        });
        // 以下是以年龄为条件进行更新,根据实际情况可以组成不同的更新条件
//        mDB.update(DBHelper.TABLE_NAME, values, DBHelper.COLUMN_NAME_AGE + ">?", new String[] {
//            "20"
//        });
    }

    /**
     * 删除操作
     * @param name
     * @return 返回影响条数
     */
    public int delete(String name) {
        //根据名字来进行删除操作
        return mDB.delete(PersonDBHelper.TABLE_NAME, PersonDBHelper.COLUMN_NAME_NAME + "=?", new String[] {
            name
        });
    }
}

     下面写一些测试样例来测试:

      1.测试public boolean add(Person person);

package com.lintao.dbusagedemo;

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {
    private PersonDBManager mPersonDBManager;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //测试用例
        
        //创建数据库
        mPersonDBManager = new PersonDBManager(this);
        
        //创建Person类来进行插入操作
        Person person1 = new Person("小明", 10, "是个逗比");
        Person person2 = new Person("孙悟空",5000,"谁都知道他--");
        Person person3 = new Person("路飞",18,"人气动漫人物,也是个逗比");
        
        mPersonDBManager.add(person1);
        mPersonDBManager.add(person2);
        mPersonDBManager.add(person3);
        
    }
}

     创建成功

技术分享

    用SQLiteSpy查看,可以看到,添加成功。

技术分享

未完待续。。。

 

项目下载链接:http://download.csdn.net/detail/u010662742/8312465     

参考链接:http://blog.csdn.net/liuhe688/article/details/6715983/

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。