Android下数据库的使用

SQLiteOpenHelper 

根据开发应用程序的需要,内部封装了创建和更新数据库使用的逻辑

使用SQLiteOpenHelper首先要创建一个类,该类继承自android.database.sqlite.SQLiteOpenHelper

而SQLiteDatabase.java中,构造函数是私有的,需要指定构造方法,接收参数为:

通过构造函数选择父类 SQLiteOpenHelper 的构造函数:

public myOpenHelper(Context context,String name,CursorFactory factory,int version) {
//context 上下文
//name 数据库的名称,"person.db"(文件数据库),如果是空则创建内存数据库
//factory 数据库查询结果的游标工厂,一般为null
//version 数据库的版本 >=1
super(context, "person.db", null, 4);

由于这个是抽象类, 因此你需要实现该类的两个方法

一个是

onCreate(SQLiteDatabase db),(数据库第一次创建的时候调用的方法,适合做数据库表结构的初始化)

db.execSQL("create table person (id integer primary key autoincrement , name varchar(20), phone varchar(20))");//用传进来的db例创建一个数据库

一个是

onUpgrage();

创建数据库

在测试类中使用上下文,getContext()  获取的是一个模拟的方便测试的上下文,用于提供数据库的路径等信息

1,在activity中创建myOpenHelper实例: myOpenHelper helper = new myOpenHelper(this);

在调用helper.getWriteableDatabase();时如果数据库中没有表,则会创建一个数据库表结构。

getWriteableDatabase();该方法会调用SQLiteOpenHelper类中的

<span style="font-size:14px;">getWritableDatabase()<span style="font-family: 'Microsoft YaHei', 'Segoe UI', Tahoma, Arial, Helvetica, sans-serif;">方法</span></span>

<span style="font-size:14px;"> public SQLiteDatabase getWritableDatabase() {
        synchronized (this) {
            return getDatabaseLocked(true);
        }
    }</span>
getDatabaseLocked(true);方法中会判断数据库是否已经创建过,执行创建或是返回等操作

关于数据库中存放的类型

SQLite,SQLite3支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。 SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。

数据库的操作

语句:

查询语句:   select * from person where name = 'zhangsan'

插入语句:insertinto 表名(字段列表)values(值列表)。如:insert into person(name, age) values(‘lisi’,3)

更新语句:update表名set字段名=值where条件子句。如:update person set name='zhangsan' where id=10

删除语句:deletefrom 表名where条件子句。如:delete from person  where id=10

代码包装数据库语句

创建一个类 persondao.java

数据库增删改查方法1:

<span style="font-size:14px;">public class PersonDao {
	private PersonDBOpenHelper helper;
	public PersonDao(Context context) { 创建对象,传递上下文,得到PersonDBOpenHelper对象</span>
		helper = new PersonDBOpenHelper(context);在构造函数中创建对象
	}
	 * 添加一条记录
public void add(String name,String phone){
		SQLiteDatabase  db = helper.getWritableDatabase();
		db.execSQL("insert into person (name,phone) values (?,?)", new Object[]{name,phone});
		db.close();//最好记得关闭数据库, 避免如果有过的打开的连接 导致数据库以后无法访问.
	}
	 * 查询一条记录
	public boolean find(String name){
		SQLiteDatabase db = helper.getReadableDatabase(); 
		Cursor cursor = db.rawQuery("select * from  person where name=?", new String[]{name});
		boolean result = cursor.moveToFirst();//如果可以移动则返回ture
		cursor.close();
		db.close();
		return result;
	}
	 * @param 姓名根据姓名修改
	 * @param newphone  新的电话号码
	public void update(String name,String newphone){
		SQLiteDatabase  db = helper.getWritableDatabase();
		db.execSQL("update person set phone=? where name=?", new Object[]{newphone , name});
		db.close();
	}
	 * 删除记录
	public void delete(String name){
		SQLiteDatabase  db = helper.getWritableDatabase();
		db.execSQL("delete from person where name=?", new Object[]{ name});
		db.close();
	}
}</span>


方法处理完毕,则可以在activity中创建对象,调用方法

personDao dao = new personDao(this);
dao.add("zhangsan","123456");
dao.update("zhangsan","110");


数据库增删改查2(API):注释的为第一种方法

此方法能显示增删改查的结果

<span style="font-size:14px;">public class PersonDao2 {
	private PersonDBOpenHelper helper;
	public PersonDao2(Context context) {
		helper = new PersonDBOpenHelper(context);
	}
	public boolean add(String name, String phone) {
		SQLiteDatabase db = helper.getWritableDatabase();
		// db.execSQL("insert into person (name,phone) values (?,?)", new
		// Object[]{name,phone});
		ContentValues values = new ContentValues();//内部是一个map集合
		values.put("name", name);
		values.put("phone", phone);
		long id = db.insert("person", null, values);//返回一个被影响的行的id,如果失败则返回-1
		db.close();
		return id != -1;
	}

	public boolean find(String name) {
		SQLiteDatabase db = helper.getReadableDatabase();
		/*
		 * Cursor cursor = db.rawQuery("select * from peron where name =?", new
		 * String[]{name});
		 */
		Cursor cursor = db.query("person", null(返回哪几列), "name=?",
				new String[] { name }, null, null, null);
		boolean result = cursor.moveToFirst();
		cursor.close();
		db.close();
		return result;
	}
	/**
	 * 获取全部的person信息
	 * @return
	 */
	public List<Person> findAll(){//返回list集合,集合中装person对象,需要创建
		SQLiteDatabase db = helper.getReadableDatabase();
		Cursor cursor = db.query("person", null(返回全部), null, null, null, null, null);
		List<Person> persons = new ArrayList<Person>();
		while(cursor.moveToNext()){//遍历结果集
			int id = cursor.getInt(cursor.getColumnIndex("id")<span style="font-family: 'Microsoft YaHei', 'Segoe UI', Tahoma, Arial, Helvetica, sans-serif;">(根据id得到例)</span>);
			String name = cursor.getString(cursor.getColumnIndex("name")(根据name得例));
			String phone = cursor.getString(cursor.getColumnIndex("phone"));
			long account = cursor.getLong(cursor.getColumnIndex("account"));
			Person person = new Person(name, phone, id);
			person.setAccount(account);
			persons.add(person);
		}
		cursor.close();
		db.close();
		return persons;
	}
		public boolean update(String name, String newphone) {
		SQLiteDatabase db = helper.getReadableDatabase();
		// db.execSQL("update person set phone=? where name=?", new
		// Object[]{newphone,name});
		ContentValues values = new ContentValues();
		values.put("phone", newphone);
		int result = db.update("person", values, "name=?",//返回的int为影响了多少行
				new String[] { name });
		db.close();
		return result>0;
	}
	public boolean delete(String name) {
		SQLiteDatabase  db = helper.getWritableDatabase();
	//	db.execSQL("delete from person where name=?", new Object[]{ name});
		int result = db.delete("person", "name=?", new String[]{name});//int值为影响了多少行
		db.close();
		return result>0;
	}
}
</span>
推荐使用第二种方法,稳定性高

往数据库中添加一列:名为account的列,将版本更新就能调用onupgrade方法

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//程序的2.0的版本也要发布了. 2.0的版本 增加一个新的表  
db.execSQL("alter table person add account varchar(20)");
}


数据库的事物:如转账,需要金额减少的一方和金额增加的一方都执行,增加数据库的事物

db.beginTransaction();// 开始数据库的事务
try {
db.execSQL("update person set account = account-100 where name='zhangsan'");
// s.equals("haha");
db.execSQL("update person set account = account+100 where name='zhangsan0'");
db.setTransactionSuccessful(); // 如果没有标记数据库事务成功 //数据会回滚
} finally {
db.endTransaction(); // 检查是否设置了事务成功的flag
}
db.close();










  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值