Android SQLite数据库操作

本文介绍如何使用Android SQLite进行数据操作,包括创建数据库、增删改查等基本操作,并提供两种不同的DAO实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android定义了一个很方便的Sqlite操作类SQLiteOpenHelper...我们不再需要加载驱动而且要手写关闭一大堆PrepareStatement,Connection等等...

package com.example.db;
import android.content.Context;
import android.database.DatabaseErrorHandler;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;


public class PersonSQLiteOpenHelper extends SQLiteOpenHelper {


	/**
	 * 构造方法
	 * @param context 上下文	
	 * @param name 数据库名称
	 * @param factory 使用什么游标,传null是使用默认游标
	 * @param version 版本,最小是1
	 */
	public PersonSQLiteOpenHelper(Context context, String name,
			CursorFactory factory, int version) {
		super(context, name, factory, version);
		// TODO Auto-generated constructor stub
	}
	/**
	 * 数据库第一次被创建的时候调用的方法
	 */
	@Override
	public void onCreate(SQLiteDatabase db) {
		// TODO Auto-generated method stub
		db.execSQL("create table person (id integer primary key autoincrement, name varchar(20),number varchar(20),account varchar(20))");
	}
	/**
	 * 只有在数据库版本发生变化的时候调用
	 * @param db
	 * @param oldVersion
	 * @param newVersion
	 */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		// TODO Auto-generated method stub
	}

}



定义personDataAccessObject..这是第一种写DAO的方法。---手写SQL语句

package com.example.dao;

import java.util.ArrayList;
import java.util.List;

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

import com.example.db.PersonSQLiteOpenHelper;
import com.example.domain.Person;

public class PersonDAO {
	private PersonSQLiteOpenHelper helper;

	// 在构造方法完成helper的初始化
	public PersonDAO(Context context) {
		super();
		this.helper = new PersonSQLiteOpenHelper(context, "person.db", null, 1);
	}

	/**
	 * 添加一条记录到数据库
	 * 
	 * @param name
	 *            姓名
	 * @param number
	 *            电话
	 */
	public void add(String name, String number) {
		SQLiteDatabase db = helper.getWritableDatabase();
		db.execSQL("insert into  person (name,number) values (?,?);",
				new Object[] { name, number });
		db.close();
	}

	/**
	 * 查询记录
	 * 
	 * @param name
	 * @return true 查询结果存在 , false 查询结果不存在
	 */
	public boolean findPersonByName(String name) {
		SQLiteDatabase db = helper.getWritableDatabase();
		Cursor cursor = db.rawQuery("select * from person where name = ?",
				new String[] { name });
		boolean result = cursor.moveToNext();
		cursor.close();
		db.close();
		return result;
	}

	/**
	 * 修改一条记录
	 * 
	 * @param name
	 *            修改人的姓名
	 * @param newnumber
	 *            修改后密码
	 */
	public void updatePersonByName(String name, String newnumber) {
		SQLiteDatabase db = helper.getWritableDatabase();
		db.execSQL("update person set number=? where name = ?", new Object[] {
				newnumber, name });
		db.close();

	}

	public void deletePersonByName(String name) {
		SQLiteDatabase db = helper.getWritableDatabase();
		db.execSQL("delete from person where name = ?", new Object[] { name });
		db.close();
	}

	public List<Person> getAll() {
		SQLiteDatabase db = helper.getWritableDatabase();
		List<Person> persons = new ArrayList<Person>();
		Cursor cursor = db.rawQuery("select * from person", null);
		while (cursor.moveToNext()) {
			int id = cursor.getInt(0);
			String name = cursor.getString(1);
			String number = cursor.getString(2);
			Person person = new Person(id, name, number);
			persons.add(person);
		}
		cursor.close();
		db.close();
		return persons;
	}
}



这是第二种写DAO的方法,Android已经为我们写好了SQL的操作,如果不记得SQL语句或者害怕出错,建议用这种方法

package com.example.dao;

import java.util.ArrayList;
import java.util.List;

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

import com.example.db.PersonSQLiteOpenHelper;
import com.example.domain.Person;

public class PersonDAO2 {
	private PersonSQLiteOpenHelper helper;

	// 在构造方法完成helper的初始化
	public PersonDAO2(Context context) {
		super();
		this.helper = new PersonSQLiteOpenHelper(context, "person.db", null, 1);
	}

	/**
	 * 添加一条记录到数据库
	 * 
	 * @param name
	 *            姓名
	 * @param number
	 *            电话
	 */
	public long add(String name, String number) {
		SQLiteDatabase db = helper.getWritableDatabase();
		ContentValues values = new ContentValues();
		values.put("name", name);
		long id = db.insert("person", null, values);
		db.close();
		return id;
	}

	/**
	 * 查询记录
	 * 
	 * @param name
	 * @return true 查询结果存在 , false 查询结果不存在
	 */
	public boolean findPersonByName(String name) {
		SQLiteDatabase db = helper.getWritableDatabase();
		Cursor cursor = db.query("person", null, "name=?",
				new String[] { name }, null, null, null);
		boolean result = cursor.moveToNext();
		cursor.close();
		db.close();
		return result;
	}

	/**
	 * 修改一条记录
	 * 
	 * @param name
	 *            修改人的姓名
	 * @param newnumber
	 *            修改后密码
	 */
	public int updatePersonByName(String name, String newnumber) {
		SQLiteDatabase db = helper.getWritableDatabase();
		ContentValues values = new ContentValues();
		values.put("number", newnumber);
		int number = db.update("person", values, "name=?", new String[] {});
		db.close();
		return number;
	}

	public int deletePersonByName(String name) {
		SQLiteDatabase db = helper.getWritableDatabase();
		int number = db.delete("person", "name=?", new String[] { name });
		db.close();
		return number;
	}

	public List<Person> getAll() {
		SQLiteDatabase db = helper.getWritableDatabase();
		Cursor cursor = db.query("person", null, null, null, null, null, null);
		List<Person> persons = new ArrayList<Person>();
		while (cursor.moveToNext()) {
			int id = cursor.getInt(0);
			String name = cursor.getString(1);
			String number = cursor.getString(2);
			Person person = new Person(id, name, number);
			persons.add(person);
		}
		return persons;
	}
}

其中的Person数据模型(Bean):

package com.example.domain;

public class Person {
	private int id;
	private String name;
	private String number;
	public Person(int id, String name, String number) {
		super();
		this.id = id;
		this.name = name;
		this.number = number;
	}

	public int getId() {
		return id;
	}

	public String getName() {
		return name;
	}

	public String getNumber() {
		return number;
	}

	public void setId(int id) {
		this.id = id;
	}

	public void setName(String name) {
		this.name = name;
	}

	public void setNumber(String number) {
		this.number = number;
	}

	@Override
	public String toString() {
		return "Person [id=" + id + ", name=" + name + ", number=" + number
				+ "]";
	}
}

Android单元测试:

package com.example.test; 
/**
 * 如果不想每次都getAll()
 * sqlite3の使用
 */
import java.util.List;

import android.test.AndroidTestCase;

import com.example.dao.PersonDAO;
import com.example.dao.PersonDAO2;
import com.example.db.PersonSQLiteOpenHelper;
import com.example.domain.Person;

public class TestPersonDB extends AndroidTestCase {
	public void testCreateDB() throws Exception
	{
		PersonSQLiteOpenHelper helper = new PersonSQLiteOpenHelper(getContext(),"person.db",null,1);
		helper.getWritableDatabase();
	}
	public void testAdd() throws Exception{
		PersonDAO dao = new PersonDAO(getContext());
		for(int i = 123131121;i<123131121+20;i++)
		dao.add("w5", i+"");
	}
	public void testFindPersonByName() throws Exception{
		PersonDAO dao = new PersonDAO(getContext());
		boolean result = dao.findPersonByName("w5");
		AndroidTestCase.assertEquals(result, true);
	}
	public void testGetAll() throws Exception{
		PersonDAO dao = new PersonDAO(getContext());
		List<Person> all = dao.getAll();
		System.out.println(all);
	}
	public void testUpdateByName() throws Exception{
		PersonDAO dao = new PersonDAO(getContext());
		dao.add("w5", "110" +
				"");
	}
	public void testDeleteByName() throws Exception{
		PersonDAO dao = new PersonDAO(getContext());
		dao.deletePersonByName("w5");
	}
}

为了方便的查看DataBase的值, ADB提供了sqlite3工具

使用方法adb shell


sqlite3 xxx.db




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值