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查看,可以看到,添加成功。
未完待续。。。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。