您的位置:首页 > 移动开发 > Android开发

android数据存储之数据库

2015-10-27 19:28 330 查看
Android 中数据存储分三类,一类是SQLiteDataBase类来实列化得到的小型数据库类型储存数据。二类是通过SharedPreferences类来保存。三类是通过File文件的形式来保存。这里简单介绍第一种保存数据类型,通过数据库来保存信息。数据库更目录在File Explorer---->data----->data---->database目录下。

创建android数据库的方法有两种

一、

通过Context对象调用openOrCreateDatabase(name, mode, factory) 方法。参数name为数据库名,mode为要创建数据库的访问类型,可以为私有和公有。factory设置为null。

由于是写的一个单元测试,所以创建数据库代码如下:

SQLiteDatabase db = getContext().openOrCreateDatabase("call.db", getContext().MODE_PRIVATE, null);  //创建数据库
		db.execSQL("create table teacher (id int,name varchar(50))"); //向该数据库中添加表
		db.execSQL("insert into teacher  values(1,'小红')");  //向表中插入记录
这样就创建了数据库了。而且执行了SQL语句创建相应表,插入了一条记录。

这种方式创建数据库创建简单,但是一旦创建就无法改变,这就造成了应用后期升级的不便。所有就有了下面一种创建方式。

二、

另一种方式是通过SQLiteOpenHelper 这个帮助类来创建数据库。我的代码如下:

public class MySQLiteDBHelper extends SQLiteOpenHelper {
	private static final String DB_NAME = "database.db";//数据库名字
	private static final int DB_VERSION = 1;  //数据库版本号
	/*
	 * 初始化操作 Context context , String name(数据库名字),CursorFactory factory, int version(版本号方便修改数据库)
	 */
	public MySQLiteDBHelper(Context context) {
		super(context, DB_NAME, null, DB_VERSION);  // 对要建的数据库进行初始化
	}

	@Override
	/**
	 * 初始化创建数据库
	 */
	public void onCreate(SQLiteDatabase db) {  //创建数据库要执行的代码 。。只执行一次
		Log.v("db", "onCreate-----------------");
		String sql = "create table user (id int,username varchar(20),password varchar(50))";  
		db.execSQL(sql);  //执行创建表的SQL语句
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  // 升级数据库时执行
		
	}

}


继承这个类后有三个方法需要实现,第一个就是构造方法,
public MySQLiteDBHelper(Context context, String name,
			CursorFactory factory, int version) {
		super(context, name, factory, version);
		// TODO Auto-generated constructor stub
	}
可以看出有几个参数需要设置,name参数为数据库名,factory设为null, 整型的Version为版本号。这个参数相当有作用。它决定了后面两个方法是否会执行。

接下来就是public void onCreate(SQLiteDatabase db)方法,这个方法只是在实列化时执行一次。而第三个方法则跟版本号有关。当版本号改变时将执行该方法里面的代码。

测试代码如下:
public void testDBHelper(){   //通过系统的SQLiteOpenHelper 来创建数据库
		MySQLiteDBHelper dbHelper = new MySQLiteDBHelper(getContext());  //得到helper对象
		SQLiteDatabase db = dbHelper.getReadableDatabase();  // 通过helper对象得到数据库
	}
这样就得到了SQLiteDatabase的实列了。就可以执行SQL语句了。若是觉得每次写Sql语句麻烦

android也为我们封装了一个类ContentValues来操作数据库。可以根据实际情况选用,这里直接上出入语句的代码。
ContentValues values = new ContentValues();  // andorid 系统定义的类用来拆解SQL语句
		values.put("id", 2);
		values.put("username", "张三");
		values.put("password", "10010");
		db.insert("user", null, values);  // 执行插入语句 ,参数分别为表名、null、插入内容
		
		String sql = "insert into user values(1,'李四','10011')";
		db.execSQL(sql);   // 用原始SQL语句进行插入
对应的更新语句为db.update()。删除语句为db.delete()在使用时注意参数表达的意思。

对于查询语句,和Mysql查询语句一样,查询的结果为一个Cursor集合。相当于Mysql中的数据集。需要遍历将每一条记录取出来。

Cursor curser = db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy).这个方法返回一个Cursor对象,这里就不分析各参数代表的意思了。下面会附上所有测试代码。遍历采用curser.moveToNext()来将游标移动到下一条数据。
public void findUser(){  // 查找  返回的是一个集合。。需要遍历,跟原SQL返回的结果集类似
		String[] columns = new String[]{"id","username","password"};  // 查找后需要返回的字段
		String selection = new String("id = ?");  //查找的条件字段
		String[] selectionArgs = new String[]{"1"};//查找条件的值
		Cursor curser = db.query("user", columns, selection, selectionArgs, null, null, "id asc"); 
		if(curser.getCount() > 0){  // 取出来的结果有元素时才执行下面的代码
			Log.v("db", "id----" +"name"+"------password");
			while(curser.moveToNext()){
				int id = curser.getInt(curser.getColumnIndex("id"));
				String name = curser.getString(curser.getColumnIndex("username"));
				String password = curser.getString(curser.getColumnIndex("password"));
				
				Log.v("db", id +"    " +name + "    "+password);
			}
		}
	}


以下是测试用到的两个类:

public class MySQLiteDBHelper extends SQLiteOpenHelper {
	private static final String DB_NAME = "database.db";//数据库名字
	private static final int DB_VERSION = 1;  //数据库版本号
	/*
	 * 初始化操作 Context context , String name(数据库名字),CursorFactory factory, int version(版本号方便修改数据库)
	 */
	public MySQLiteDBHelper(Context context) {
		super(context, DB_NAME, null, DB_VERSION);  // 对要建的数据库进行初始化
	}

	@Override
	/**
	 * 初始化创建数据库
	 */
	public void onCreate(SQLiteDatabase db) {  //创建数据库要执行的代码 。。只执行一次
		Log.v("db", "onCreate-----------------");
		String sql = "create table user (id int,username varchar(20),password varchar(50))";  //若要把Id设为自增 怎类型应该为INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT
		db.execSQL(sql);  //执行创建表的SQL语句
	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {  // 
		
	}

}


单元测试代码:

public class JUiteTestDB extends AndroidTestCase {
private SQLiteDatabase db;
@Override
protected void setUp() throws Exception { // 测试的初始化操作,每次执行测试代码是将先执行这里面的代码
super.setUp();
MySQLiteDBHelper dbHelper = new MySQLiteDBHelper(getContext()); //得到helper对象
db = dbHelper.getReadableDatabase(); //两个方法都可以打开数据库,readable方法在空间充足时打开可写不报错,空间不足时打开不可写不报错
// db = dbHelper.getWritableDatabase(); //Writable方法在空间充足时打开可写不报错,不足时直接报错
}

public void testDataBase(){
SQLiteDatabase db = getContext().openOrCreateDatabase("call.db", getContext().MODE_PRIVATE, null); //创建数据库 db.execSQL("create table teacher (id int,name varchar(50))"); //向该数据库中添加表 db.execSQL("insert into teacher values(1,'小红')"); //向表中插入记录
}


public void testDBHelper(){ //通过系统的SQLiteOpenHelper 来创建数据库 MySQLiteDBHelper dbHelper = new MySQLiteDBHelper(getContext()); //得到helper对象 SQLiteDatabase db = dbHelper.getReadableDatabase(); // 通过helper对象得到数据库 }
// 增
public void testAddUser(){ // 插入语句 操作的是mydatabase.db数据库
//每次测试都会执行setUp()方法里的代码。得到db数据库
ContentValues values = new ContentValues(); // andorid 系统定义的类用来拆解SQL语句 values.put("id", 2); values.put("username", "张三"); values.put("password", "10010"); db.insert("user", null, values); // 执行插入语句 ,参数分别为表名、null、插入内容 String sql = "insert into user values(1,'李四','10011')"; db.execSQL(sql); // 用原始SQL语句进行插入
}



public void testDeleteUser(){//删
String whereClause = "id = ?"; // 条件字段
String[] whereArgs = new String[]{"2"}; //条件值
db.delete("user", whereClause, whereArgs);
}

public void testUpdataUser(){ // 改
ContentValues values = new ContentValues();
values.put("username", "王五"); // 要修改的字段以及修改的内容
String whereClause = "password = ?"; //标识字段
String[] whereArgs = new String[]{"10011"}; //标识字段的值
db.update("user", values, whereClause, whereArgs); //执行
}

public void findUser(){ // 查找 返回的是一个集合。。需要遍历,跟原SQL返回的结果集类似 String[] columns = new String[]{"id","username","password"}; // 查找后需要返回的字段 String selection = new String("id = ?"); //查找的条件字段 String[] selectionArgs = new String[]{"1"};//查找条件的值 Cursor curser = db.query("user", columns, selection, selectionArgs, null, null, "id asc"); if(curser.getCount() > 0){ // 取出来的结果有元素时才执行下面的代码 Log.v("db", "id----" +"name"+"------password"); while(curser.moveToNext()){ int id = curser.getInt(curser.getColumnIndex("id")); String name = curser.getString(curser.getColumnIndex("username")); String password = curser.getString(curser.getColumnIndex("password")); Log.v("db", id +" " +name + " "+password); } } }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: