SQL学习笔记之数据库专题(二):Android下SQL数据库开发

在Android开发 中,数据库是不可缺少的。在Android开发中,用的是一种小型的嵌入式数据库,sqllite。今天会写两篇关于Android开发环境下数据库开发的文章,第一篇先介绍使用android自带的API来实现数据库的使用和管理以及增删改查、数据库升级的相关操作。

一、数据库第一次生成

1、javabean文件的准备

这里以一个Person类为例子来描述

package com.example.freedomsql.bean;

import java.io.Serializable;

/**
 * @ClassName: Person
 * @author victor_freedom ([email protected])
 * @createddate 2015-1-10 下午4:22:09
 * @Description: TODO
 */
public class Person implements Serializable {
	private int id;
	private String name;
	private String number;

	// private String nickname;

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

}

2、数据库类的编写

要实现一个数据库的使用,需要新建一个类并继承SQLiteOpenHelper类。然后实现一个构造方法,详情看代码

package com.example.freedomsql.db;

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

/**
 * @ClassName: FreedomDB
 * @author victor_freedom ([email protected])
 * @createddate 2015-1-10 下午2:49:15
 * @Description: TODO
 */
public class FreedomDB extends SQLiteOpenHelper {

	public FreedomDB(Context context) {
		// 参数依次为:上下文,数据库名称,游标工厂一般为NULL,数据库版本号,升级的时候需要更改
		super(context, "freedom.db", null, 1);
	}

	/**
	 * 第一次创建数据库的时候触发该方法
	 */
	@Override
	public void onCreate(SQLiteDatabase db) {
		//sql语句详情请参考该系列文章第一篇
		db.execSQL("create table person (id integer primary key autoincrement,name varchar(20),number varchar(20))");
	}

	/**
	 * 数据库版本号变化的时候触发该方法
	 */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) {
		// if (oldversion == 1 && newversion == 2) {
		// db.execSQL("alter table person add nickname varchar(20)");
		// }
	}
}

3、数据库操作类dao类编写

数据库创建完成之后,需要有一个操作类来实现对数据库的操作,一般命名为dao类。详情请参考代码:

package com.example.freedomsql.db.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.freedomsql.bean.Person;
import com.example.freedomsql.db.FreedomDB;

/**
 * @ClassName: PersonDao
 * @author victor_freedom ([email protected])
 * @createddate 2015-1-10 下午2:30:24
 * @Description: TODO
 */
public class PersonDao {
	private FreedomDB dbHelper;

	public PersonDao(Context context) {
		dbHelper = new FreedomDB(context);

	}

	/**
	 * @Title: add
	 * @Description:增加
	 * @param name
	 * @param number
	 * @throws
	 */
	public void add(String name, String number) {
		SQLiteDatabase db = dbHelper.getWritableDatabase();
		db.execSQL("insert into person(name,number) values (?,?)",
				new Object[] { name, number });
		db.close();
		// 系统API
		// ContentValues = values = new ContentValues();
		// values.put("name",name);
		// values.put("number",number);
		// long id = db.insert(table(表名),null,values(数据));
		// return id;

	}

//	/**
//	 * @Title: add
//	 * @Description: 升级后的增加方法
//	 * @param name
//	 * @param number
//	 * @param nickname
//	 * @throws
//	 */
//	public void add(String name, String number, String nickname) {
//		SQLiteDatabase db = dbHelper.getWritableDatabase();
//		db.execSQL("insert into person(name,number,nickname) values (?,?,?)",
//				new Object[] { name, number, nickname });
//		db.close();
//		// 系统API
//		// ContentValues = values = new ContentValues();
//		// values.put("name",name);
//		// values.put("number",number);
//		// long id = db.insert(table(表名),null,values(数据));
//		// return id;
//
//	}

	/**
	 * @Title: delete
	 * @Description: 删除
	 * @param name
	 * @throws
	 */
	public void delete(String name) {
		SQLiteDatabase db = dbHelper.getWritableDatabase();
		db.execSQL("delete from person where name=?", new Object[] { name });

		// 系统API
		// int number=db.delete("person","name=?",new String[]{name});
		db.close();
	}

	/**
	 * @Title: updata
	 * @Description: 更新
	 * @param name
	 * @param newnumber
	 * @throws
	 */
	public void updata(String name, String newnumber) {
		SQLiteDatabase db = dbHelper.getWritableDatabase();
		db.execSQL("update person set number=? where name=?", new Object[] {
				newnumber, name });
		// 系统API
		// ContentValues values = new ContentValues();
		// values.put("number", newnumber);
		// int num = db.update("person", values, "name=?", new String[] { name
		// });
		db.close();
	}

	/**
	 * @Title: find
	 * @Description: 查询
	 * @param name
	 * @return
	 * @throws
	 */
	public boolean find(String name) {
		SQLiteDatabase db = dbHelper.getReadableDatabase();

		Cursor cursor = db.rawQuery("select * from person where name =?",
				new String[] { name });
		// 系统API
		// Cursor cursor = db.query(table(表名),null,"name=?",new
		// String[](name),null,null,null);
		boolean result = cursor.moveToNext();
		cursor.close();
		db.close();
		return result;

	}

	/**
	 * @Title: findAll
	 * @Description:查询
	 * @return
	 * @throws
	 */
	public List<Person> findAll() {
		List<Person> persons = new ArrayList<Person>();
		SQLiteDatabase db = dbHelper.getReadableDatabase();
		Cursor cursor = db.rawQuery("select * from person", null);
		// 系统API
		// Cursor cursor= db.query("Person",new
		// String[]{"name","id","number"},null,null,null,null,null);

		while (cursor.moveToNext()) {
			int id = cursor.getInt(cursor.getColumnIndex("id"));
			String name = cursor.getString(cursor.getColumnIndex("name"));
			String number = cursor.getString(cursor.getColumnIndex("number"));
			// String nickname = cursor.getString(cursor
			// .getColumnIndex("nickname"));
			Person p = new Person(id, name, number);
			persons.add(p);
		}
		cursor.close();
		db.close();
		return persons;

	}
}

4、主Activity内代码

在activity内我们使用dao类对数据库进行操作。

package com.example.freedomsql;

import com.example.freedomsql.db.dao.PersonDao;

import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		PersonDao dao = new PersonDao(getBaseContext());
		dao.add("汤老板", "110");
		dao.add("郭大侠", "119");
		// dao.add("汤老板1", "110", "汤老板");
		// dao.add("郭大侠1", "119", "郭女侠");
	}
}

这里只对插入数据进行了操作,有兴趣的同学可以自己测试其他的操作也可以在dao类写其他的方法进行更复杂的操作。代码执行后数据库内容显示如图

二、数据库升级更新

在实际开发中,数据库肯定会有升级相关的操作,但是,数据库的升级自然不可以让项目之前的数据清掉,必须保留,所以,这需要对数据库版本号进行一定的控制和处理。那么我们来对刚刚的数据库进行升级处理

1、person类的升级,增加一个nickname字段

package com.example.freedomsql.bean;

import java.io.Serializable;

/**
 * @ClassName: Person
 * @author victor_freedom ([email protected])
 * @createddate 2015-1-10 下午4:22:09
 * @Description: TODO
 */
public class Person implements Serializable {
	private int id;
	private String name;
	private String number;
	private String nickname;

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

}

2、数据库生成类的改动

1、将版本号更改为2

	public FreedomDB(Context context) {
		// 参数依次为:上下文,数据库名称,游标工厂一般为NULL,数据库版本号,升级的时候需要更改
		super(context, "freedom.db", null, 2);
	}

2、在onUpgrade方法中进行处理,在实际开发中,特别需要对版本号进行逻辑处理。

	/**
	 * 数据库版本号变化的时候触发该方法
	 */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) {
		if (oldversion == 1 && newversion == 2) {
			db.execSQL("alter table person add nickname varchar(20)");
		}
	}

3、Dao类的修改

1、增加方法的改动

/**
	 * @Title: add
	 * @Description: 升级后的增加方法
	 * @param name
	 * @param number
	 * @param nickname
	 * @throws
	 */
	public void add(String name, String number, String nickname) {
		SQLiteDatabase db = dbHelper.getWritableDatabase();
		db.execSQL("insert into person(name,number,nickname) values (?,?,?)",
				new Object[] { name, number, nickname });
		db.close();
		// 系统API
		// ContentValues = values = new ContentValues();
		// values.put("name",name);
		// values.put("number",number);
		// long id = db.insert(table(表名),null,values(数据));
		// return id;

	}

2、查询方法的改动

	/**
	 * @Title: findAll
	 * @Description:查询
	 * @return
	 * @throws
	 */
	public List<Person> findAll() {
		List<Person> persons = new ArrayList<Person>();
		SQLiteDatabase db = dbHelper.getReadableDatabase();
		Cursor cursor = db.rawQuery("select * from person", null);
		// 系统API
		// Cursor cursor= db.query("Person",new
		// String[]{"name","id","number"},null,null,null,null,null);

		while (cursor.moveToNext()) {
			int id = cursor.getInt(cursor.getColumnIndex("id"));
			String name = cursor.getString(cursor.getColumnIndex("name"));
			String number = cursor.getString(cursor.getColumnIndex("number"));
			String nickname = cursor.getString(cursor
					.getColumnIndex("nickname"));
			Person p = new Person(id, name, number,nickname);
			persons.add(p);
		}
		cursor.close();
		db.close();
		return persons;

	}

4、主Activity的修改

package com.example.freedomsql;

import com.example.freedomsql.db.dao.PersonDao;

import android.app.Activity;
import android.app.ActionBar;
import android.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.os.Build;

public class MainActivity extends Activity {

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		PersonDao dao = new PersonDao(getBaseContext());
		dao.add("汤老板1", "110", "汤老板");
		dao.add("郭大侠1", "119", "郭女侠");
	}
}

这样就完成了对数据库升级之后的操作,我们来看下升级后的数据库内容

从图我们可以看到,之前有的数据还存在,没有清除掉,新增加的字段增加进去了,新创建的对象也创建成功。

在Android开发中sqlite数据库的基础操作介绍完毕,当然,在实际开发中,我们不会这样去操作,有很多封装好了的框架给我们去使用,而且性能极大的优化,操作简便。学习这些基础开发,是为了让我们更加清晰的知道数据库底层的操作原理。所有的数据库操作框架基本上都是基于这套理论去实现的。了解这些后我们再去学习框架的使用,会容易上手。

时间: 2024-12-14 18:07:59

SQL学习笔记之数据库专题(二):Android下SQL数据库开发的相关文章

Sql学习笔记4——嵌套子查询(下)

5)from子句中的子查询 因为SQL任何select-from-where表达式返回的都是关系,所以from子句中允许使用子查询表达式. 考虑查询“找出平均工资超过42000美元的那些系中教师的平均工资”,之前我们用having子句来书写该查询. 现在我们不用having子句,如下: select dept_name,avg_salary from(select dept_name,avg(salary) as avg_salary from instructor group by dept_

Oracle之PL/SQL学习笔记

自己在学习Oracle是做的笔记及实验代码记录,内容挺全的,也挺详细,发篇博文分享给需要的朋友,共有1w多字的学习笔记吧.是以前做的,一直在压箱底,今天拿出来整理了一下,给大家分享,有不足之处还望大家批评指正. PL/SQL定义:PL/SQL是由Oracle开发,专门用于Oracle的程序设计语言. PL---Procedural Language. SQL—Structure QueryLanguage.PL/SQL包括过程化语句和SQL语句     PL/SQL的单位:块. 一个块中可以嵌套

SQL学习笔记:选取第N条记录

Northwind数据库,选取价格第二高的产品. 有两种方法,一个是用Row_Number()函数: SELECT productname FROM (SELECT TOP 2 productname, Row_Number() OVER (ORDER BY unitprice desc) AS rownum FROM Products) AS tbl WHERE rownum = 2; 另一种是对子语句的的结果再进行排序: SELECT top 1 productname FROM (SELE

Oracle 学习笔记 18 -- 存储函数和存储过程(PL/SQL子程序)

PL/SQL子程序 包括函数和过程.这里的函数指的是用户自己定义的函数,和系统函数是不同的.子程序一般是完成特定功能的PL/SQL程序块,并且具有一定的通用性,可以被不同的应用程序多次调用.Oracle提供可以把PL/SQL程序存储在数据库中,并可以再任何地方来运行它.这样就叫做存储过程或者是函数.过程和函数的唯一区别就是函数总是向调用者返回数据,而过程则不返回数据. 函数 如果用户要经常执行某些操作,并且需要返回特定的数据,那么就可以将这些操作构造成一个函数. 可以使用SQL语句定义函数. 基

Oracle 学习笔记 19 -- 触发器和包浅析(PL/SQL)

触发器是存放在数据库中的一种特殊类型的子程序.不能被用户直接调用,而是当特定事件或操作发生时由系统自己主动 调用执行.触发器不能接受參数.所以执行触发器就叫做触发或点火.Oracle事件指的是数据库的表进行的insert .update.delete操作或对视图进行类似的操作. 触发器是很多关系数据库系统都提供的一项技术.在Oracle系统里,触发器类似过程和函数,都有声明,运行和异常 处理过程的PL/SQL块. 触发器的组成: 触发事件:在何种情况下触发:比如:INSERT , UPDATE

Oracle之PL/SQL学习笔记之触发器

Oracle之PL/SQL学习笔记之触发器 触发器是许多关系数据库系统都提供的一项技术.在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块. 触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行. 即触发器是当某个事件发生时自动地隐式运行.并且,触发器不能接收参数.所以运行触发器就叫触发或点火(firing).ORACLE事件指的是对数据库的表进行的INSERT. UPDATE及D

Oracle之PL/SQL学习笔记之数据类型(三)

Oracle之PL/SQL学习笔记之数据类型(三) 所有的编程语言中变量是使用最频繁的.PL/SQL作为一个面向过程的数据库编程语言同样少不了变量,利用变量可以把PL/SQL块需要的参数传递进来,做到动态执行程序,同时也可以利用变量在PL/SQL内部进行值得传递,甚至可以把值传递出去,最终返回给用户,由此可见,变量是PL/SQL不可或缺的一部分. 1. Oracle预定义的普通数据类型(常见的数据类型) 类型 子类 说明 Oracle中的范围 char Character,String Rowi

Halcon学习笔记之支持向量机(二)

例程:classify_halogen_bulbs.hdev 在Halcon中模式匹配最成熟最常用的方式该署支持向量机了,在本例程中展示了使用支持向量机对卤素灯的质量检测方法.通过这个案例,相信大家可以对支持向量机的使用有一个更加清晰的了解.在相当多的检测和识别的应用中,都可以使用相同的方法来解决分类问题. 图1. 卤素灯图像 大致原理: 一.准备阶段:描述样本 1. 准备好两组卤素灯图像样本,好坏的各若干张图像: 2. 对样本图像进行分割,获取卤素灯关键部位区域: 3. 选择合适的对图像的描述

Object C学习笔记26-文件管理(二)

上一篇简单的介绍了如何获取文件属性,删除,拷贝文件等,本文继续记录Object C中文件IO操作. 一. 获取文件的执行主目录 在Object C中提供了一个方法 NSHomeDirectory() 用于获得执行执行的主目录,使用如下代码测试: NSString *homePath=NSHomeDirectory(); NSLog(@"执行文件的主目录:%@",homePath); 通过以上代码可以正确的输出应用程序的执行目录,上一张也提到了文件的目录问题,这个和Windows系统的有

sql学习笔记1

参考: 1.<SQL学习指南> 2.慕课网,SQL学习基础 提纲: 第二章 创建和使用数据库 2.1 创建MYSQL数据库 2.2 使用mysql命令行工具 2.3 MySQL数据类型 2.3.1 字符型数据 2.3.2 数值型数据 2.3.3 时间数据 2.4 表的创建 2.4.1 第一步:设计 2.4.2 第二步:精华 2.4.3 第三步:构建SQL方案语句 2.5 操作和修改表 2.5.1 插入数据 2.5.2 更新数据 2.5.3 删除数据 2.6 导致错误的语句 2.6.1 主键不唯