Android——SQLite实现面向对象CRUD

       android中SQLite的使用,其实倒也不难,但是与JDBC操作数据库相比,这个还是有点不顺手,而且我好久没写底层的封装了,使用SSM框架这些都不需要考虑......好了,废话不多说,下面直接建立一个测试工程来试试SQLite在Android中的应用吧。


1、新建一个工程




2、配置junit测试环境

打开AndroidManifest.xml文件,进行jUnit相关配置,具体如下图:



3、源码

        关于在Android中如何使用SQLite的文章很多,我也是参考那些文章进行学习的。作为一个J2EE方向的开发者,我习惯于面向对象进行编程,而老罗的视频以及一些其他的教程关于CRUD操作使用的都是字符串,这我有点不适应,所有我在学习的过程中就改成了面向对象的CRUD操作,这样用着也方便点。原理、API什么的我就不说了,百度一下嗖嗖的都出来了,下面直接贴代码(完整工程下载,点这里):

      这样一个继承SQLiteOpenHelper的类主要就这么几个功能:

           a.创建数据库和表

           b.如果数据库有不同版本那么就会更新数据库

           c.调用的这个类的对象来取得数据库的读写权限


package com.example.db;

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

public class DBHelper extends SQLiteOpenHelper {

	private static final String DATABASE_NAME = "test.db";
	private static final int DATABASE_VERSION = 1;

	public DBHelper(Context context) {
		// CursorFactory设置为null,使用默认值
		super(context, DATABASE_NAME, null, DATABASE_VERSION);
	}

	// 数据库第一次被创建时onCreate会被调用
	@Override
	public void onCreate(SQLiteDatabase db) {
		String sql = "CREATE TABLE IF NOT EXISTS person "
				+ "(id INTEGER PRIMARY KEY AUTOINCREMENT,name VARCHAR(32),sex VARCHAR(8))";
		db.execSQL(sql);
	}

	// 如果DATABASE_VERSION值被改为2,系统发现现有数据库版本不同,即会调用onUpgrade
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		db.execSQL("ALTER TABLE base_info ADD COLUMN other STRING");
	}
}

可以看到上面创建了一个叫test.db的数据库,其中有一个表person,表中有三个字段:主键-id,姓名-name,性别-sex。


下面生成这个表对应的实体类:

package com.example.pojo;

public class Person {
	private int id;
	private String name;
	private String sex;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", sex=" + sex + "]";
	}
	
}

我们要实现CRUD操作,那么建一个接口定义CRUD方法:

package com.example.dao;

import com.example.pojo.Person;

public interface IPersonDao {
	public boolean insert(Person person);
	public boolean delete(int id);
	public boolean update(Person person);
	public Person select(int id);
}

下面要实现IPersonDao接口,定义具体的业务方法:

package com.example.dao.impl;

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

import com.example.dao.IPersonDao;
import com.example.db.DBHelper;
import com.example.pojo.Person;

public class PersonDaoImpl implements IPersonDao {
	DBHelper helper = null;
	
	public PersonDaoImpl(Context context){
		helper = new DBHelper(context);
	}

	@Override
	public boolean insert(Person person) {
		boolean flag = false;
		SQLiteDatabase database = null;
		try {
			String sql = "INSERT INTO person(name,sex) VALUES (?,?)";
			database = helper.getWritableDatabase();
			database.execSQL(sql, new Object[]{person.getName(),person.getSex()});
			flag = true;
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(database!=null){
				database.close();
			}
		}
		return flag;
	}

	@Override
	public boolean delete(int id) {
		boolean flag = false;
		SQLiteDatabase database = null;
		try {
			String sql = "DELETE FROM person WHERE id=?";
			database = helper.getWritableDatabase();
			database.execSQL(sql, new Object[]{Integer.toString(id)});
			flag = true;
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(database!=null){
				database.close();
			}
		}
		return flag;
	}

	@Override
	public boolean update(Person person) {
		boolean flag = false;
		SQLiteDatabase database = null;
		try {
			String sql = "UPDATE person set name=? , sex=? where id=?";
			database = helper.getWritableDatabase();
			database.execSQL(sql, new Object[]{person.getName(),person.getSex(),person.getId()});
			flag = true;
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(database!=null){
				database.close();
			}
		}
		return flag;
	}

	@Override
	public Person select(int id) {
		Person person = new Person();
		SQLiteDatabase database = null;
		try {
			String sql = "SELECT * FROM person where id=?";
			database = helper.getReadableDatabase();			
			Cursor cursor = database.rawQuery(sql, new String[]{Integer.toString(id)});
			while(cursor.moveToNext()){
				int _id = cursor.getInt(cursor.getColumnIndex("id"));
				String _name = cursor.getString(cursor.getColumnIndex("name"));
				String _sex = cursor.getString(cursor.getColumnIndex("sex"));
				person.setId(_id);
				person.setName(_name);
				person.setSex(_sex);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			if(database!=null){
				database.close();
			}
		}
		return person;
	}
	
	

}

以上完成之后就可以开始单元测试了,绿色......

package com.example.test;

import com.example.dao.IPersonDao;
import com.example.dao.impl.PersonDaoImpl;
import com.example.pojo.Person;

import android.test.AndroidTestCase;
import android.util.Log;

public class Test extends AndroidTestCase {
	public void insertDB(){
		IPersonDao personDao = new PersonDaoImpl(getContext());
		Person person = new Person();
		person.setName("李四");
		person.setSex("男");
		personDao.insert(person);
	}
	
	public void selectDB(){
		IPersonDao personDao = new PersonDaoImpl(getContext());
		Person person = personDao.select(1);
		Log.i("info", person.toString());
	}
	
	public void updateDB(){
		IPersonDao personDao = new PersonDaoImpl(getContext());
		Person person = personDao.select(1);
		person.setName("改名字啦");
		person.setSex("不详");
		personDao.update(person);
	}
	
	public void deleteDB(){
		IPersonDao personDao = new PersonDaoImpl(getContext());
		personDao.delete(2);
	}

}


导出test.db文件,在SQLite Expert中打开:



这是insert测试成功的例子,其他就不放图了,这个软件百度就可以下载了。



(转载注明出处:http://blog.csdn.net/zhshulin)

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
大家好,个人觉得用Sqlite数据库时,经常需要进行机械性的CRUD操作,故对其进行了一下封装,希望能起到抛砖引玉的作用。 目的:封装共有的CRUD 下面简单的说一下使用步骤,如果觉得多余,可以无视。 1. 实现自己的DBHelper: /** * * @author Kee.Li * * 1. 继承了SmartDBHelper,不需要重写SQLiteOpenHelper的那两个方法 * 2. 父类构造方法参数modelClasses是实体类的数组,也就是需要生产表的类的Class数组 * */ public class DBHelper extends SmartDBHelper { //数据库名称 private final static String DATABASE_NAME = "books.db"; //数据库版本 private final static int DATABASE_VERSION = 2; //需要生成数据库表的类的数组 private final static Class<?>[] modelClasses = {Book.class,User.class}; public DBHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION,modelClasses); } } 2.创建app需要的实体,也就是对应的数据库表(这里的实体添加到DBHelper的modelClasses数组中) /** * 数据库的实体 * @author Kee.Li * 关于注解: * Table: 此类对应的数据库表名 * Id:标识此属性为数据库自增长的id,应为int型 * Column:标识此属性对应的数据库字段名 */ @Table(name="t_books") public class Book{ @Id @Column(name="book_id") private int bookId; @Column(name="book_name") private String bookName; @Column(name="book_author") private String bookAuthor; //set get 方法省略.... } 3. 实现DAO,也就是对实体的CRUD类 /** * @author Kee.Li * * 此类只需要继承TemplateDAO,在构造方法里面给父类的属性dbHelper赋值,即可实现CRUD操作 * 若有复杂的操作,可以自定义方法 */ public class BookDAO extends TemplateDAO { /** * 创建DAO时初始化连接数据库对象helper * @param context */ public BookDAO(Context context) { super(new DBHelper(context)); } } 4. activity的调用 bookDAO = new BookDAO(this); List books = bookDAO.find(); 好了,到此结束,如果有什么好的建议或者意见,希望可以共同学习!谢谢大家!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值