android数据库sqlite的简单总结

SQLite是一种轻量级的小型数据库,虽然比较小,但是功能相对比较完善,一些常见的数据库基本功能也具有,在现在的嵌入式系统中使用该数据库的比较多,因为它占用系统资源很少。

一、sqlite数据库简介

特点:

1)    轻量级-占用资源少

2)    独立性-不依赖其他软件

3)    隔离性-所有信息都在一个文件里面

4)    跨平台-android和ios都用的是sqlite

5)    多语言接口-可以java、php等多语言

6)    安全性-独占性和共享锁

 

二、环境搭建

第一步:右键点击我的电脑(或者是计算机),选中属性进入  控制面板项>高级系统设置>系统属性设置>环境变量

新建一个系统变量,名字就叫做android(自己命名),里面的值就是sdk/platform-tools所在目录,里面有个文件sqlite3.exe

例如:D:\SDK\android-sdk-windows\platform-tools

注意,变量值最后不要加    ;   这个.

然后就是将android这个变量加到系统变量path里面。

使用这句 %android%  就可以了,

然后就打开dos操作界面,输入 adb shell

出现#号就是环境配置好了。

 

Window系统环境变量:

%SystemRoot%;%SystemRoot%\system32\wbem

%SystemRoot%:  就是    C:\windows;

 

三、数据库的操作

首先、新建一个类 ,该类继承自SQLiteOpenHelper,然后重写里面的方法。

构造方法

public static DatabaseHelper getInstance(Context context) {
		if (DB_HELPER == null) {
			DB_HELPER = new DatabaseHelper(context);
		}
		return DB_HELPER;
	}


还有

/**
	 * 数据库创建时执行
	 */
	@Override
	public void onCreate(SQLiteDatabase db) {
		String sql = "create table "+DataColumn.Student.TABLE_NAME
				+ " (" 
				+ DataColumn.Student._ID + " INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
				+ DataColumn.Student.COLUMN_NAME_NAME + " TEXT, "
				+ DataColumn.Student.COLUMN_NAME_NUMBER + " TEXT "
				+ ")";

		String sql1 = "create table "+ DataColumn.Tearch.TABLE_NAME
				+" (" 
				+ DataColumn.Tearch._ID+ " INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
				+ DataColumn.Tearch.COLUMN_NAME_NAME + " TEXT" 
				+ ")";

		db.execSQL(sql);
		db.execSQL(sql1);
	}


Oncreate方法是在数据库创建的时候执行的。

SQLiteOpenHelper是SQLiteDatabase的一个帮助类,用来管理数据库的创建和版本的更新。一般是建立一个类继承它,并实现它的onCreate和onUpgrade方法。

方法名  方法描述
SQLiteOpenHelper(Context context,String name,SQLiteDatabase.CursorFactory factory,int version)   
//构造方法,一般是传递一个要创建的数据库名称作为参数
onCreate(SQLiteDatabase db)     //创建数据库时调用
onUpgrade(SQLiteDatabase db,int oldVersion , int newVersion)  //版本更新时调用
getReadableDatabase()        //创建或打开一个只读数据库
getWritableDatabase()         //创建或打开一个读写数据库


getWritableDatabase()和getReadableDatabase()的区别:
getReadableDatabase()并不是以只读方式打开数据库,而是先执行getWritableDatabase(),失败的情况下才调用。
getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。
但getWritableDatabase()方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,
getWritableDatabase()打开数据库就会出错。

getReadableDatabase()方法先以读写方式打开数据库,

倘若使用如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库.

创建数据库代码:

/**
	 * 数据库创建时执行
	 */
	@Override
	public void onCreate(SQLiteDatabase db) {
		String sql = "create table "+DataColumn.Student.TABLE_NAME
				+ " (" 
				+ DataColumn.Student._ID + " INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
				+ DataColumn.Student.COLUMN_NAME_NAME + " TEXT, "
				+ DataColumn.Student.COLUMN_NAME_NUMBER + " TEXT "
				+ ")";

		String sql1 = "create table "+ DataColumn.Tearch.TABLE_NAME
				+" (" 
				+ DataColumn.Tearch._ID+ " INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
				+ DataColumn.Tearch.COLUMN_NAME_NAME + " TEXT" 
				+ ")";

		db.execSQL(sql);
		db.execSQL(sql1);
	}


而onUpgrade是在数据库版本或字段有变动的时候执行的。

/**
	 * 数据库版本发生变化
	 */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		if(oldVersion < 3){
			String sql = "Alter table "+DataColumn.Student.TABLE_NAME+" add column "+DataColumn.Student.COLUMN_NAME_AGE+" TEXT ";
			db.execSQL(sql);
		}
		String sql1 = "Alter table "+DataColumn.Student.TABLE_NAME+" add column "+DataColumn.Student.COLUMN_NAME_SCORE+" TEXT ";
		db.execSQL(sql1);
	}

数据库的基本增删改查应该是在普通类里面写方法来实现。

在该类初始化的时候要 实例化继承了SQLiteOpenHelper类的对象,然后在该对象上得到SQLiteDatabase对象,以后的操作就在该对象上执行。

代码如下

public SQLiteDatabase db;//声明为全局变量
//实例化db的操作在oncreate里进行
DatabaseHelper dbHelper = DatabaseHelper.getInstance(this);
	db = dbHelper.getReadableDatabase();  //如果数据库不存在则创建数据库,否则直接打开数据库


比如添加就写一个普通的添加方法,使用android方式操作数据库。也可以使用sql语句。例如:

Android:实现方式

1、增加

2、删除

3、修改

4、查询

 //打开或创建test.db数据库
    //方法一:openOrCreateDatabase ,方法二: SQLiteDatabase的帮助类 SQLiteOpenHelper类实现

/**
	 * 数据库操作方法一
	 */
	public void operOrCreateDataBase() {
		SQLiteDatabase db = openOrCreateDatabase("bruce.db", MODE_PRIVATE,
				null);

		db.execSQL("create table student (id INTEGER NOT NULL,name TEXT,PRIMARY KEY(id))");

		db.execSQL("insert into student (id,name) values (1001,'张三')");

	}

数据的添加



1.使用insert方法

ContentValues cv = new ContentValues();//实例化一个ContentValues用来装载待插入的数据
cv.put("username","Jack Johnson");//添加用户名
cv.put("password","iLovePopMusic"); //添加密码
db.insert("user",null,cv);//执行插入操作

2.使用execSQL方式来实现
String sql = "insert into user(username,password) values ('Jack Johnson','iLovePopMuisc');//插入操作的SQL语句
db.execSQL(sql);//执行SQL语句


数据的删除-有2种方式可以实现
String whereClause = "username=? and "sex=?";//删除的条件
String[] whereArgs = {"Jack Johnson","男"};//删除的条件参数
db.delete("user",whereClause,whereArgs);//执行删除

使用execSQL方式的实现
String sql = "delete from user where username='Jack Johnson'";//删除操作的SQL语句
db.execSQL(sql);//执行删除操作

数据修改

同上,仍是2种方式
ContentValues cv = new ContentValues();//实例化ContentValues
cv.put("password","iHatePopMusic");//添加要更改的字段及内容
String whereClause = "username=?";//修改条件
String[] whereArgs = {"Jack Johnson"};//修改条件的参数
db.update("user",cv,whereClause,whereArgs);//执行修改

使用execSQL方式的实现

String sql = "update [user] set password = 'iHatePopMusic' where username='Jack Johnson'";//修改的SQL语句
db.execSQL(sql);//执行修改

数据查询
数据查询相对前面几种方法就复杂一些了,因为查询会带有很多条件

通过query实现查询的

	Cursor cursor = db.query(DataColumn.Student.TABLE_NAME, null,
						null, null, null, null, null, null);

各参数说明:
table:表名称
colums:列名称数组
selection:条件子句,相当于where
selectionArgs:条件语句的参数数组
groupBy:分组
having:分组条件
orderBy:排序类
limit:分页查询的限制
Cursor:返回值,相当于结果集ResultSet

针对游标(Cursor)也提供了不少方法

方法名称  方法描述
getCount()  总记录条数
isFirst() 判断是否第一条记录
isLast()  判断是否最后一条记录
moveToFirst()  移动到第一条记录
moveToLast()移动到最后一条记录
move(int offset) 移动到指定的记录
moveToNext()移动到下一条记录
moveToPrevious() 移动到上一条记录
getColumnIndex(String columnName)  获得指定列索引的int类型值

实现代码

Cursor c = db.query("user",null,null,null,null,null,null);//查询并获得游标
if(c.moveToFirst()){//判断游标是否为空
    for(int i=0;i<c.getCount();i++){
        c.move(i);//移动到指定记录
        String username = c.getString(c.getColumnIndex("username");
        String password = c.getString(c.getColumnIndex("password"));
    }
}
通过rawQuery实现的带参数查询

Cursor c = db.rawQuery("select * from user where username=?",new Stirng[]{"Jack Johnson"});
if(cursor.moveToFirst()) {
    String password = c.getString(c.getColumnIndex("password"));
}


数据库在activity界面最后一定要关闭

@Override
	protected void onDestroy() {
		super.onDestroy();
		if (db != null) {
			if (db.isOpen()) {
				db.close();
				db = null;
			}
		}
	}

数据库cursor有一个专门的适配器CursorAdapter:

public class MyCursorAdapter extends CursorAdapter{
		private LayoutInflater mInflater;

		public MyCursorAdapter(Context context,Cursor cursor) {
			super(context, cursor, FLAG_REGISTER_CONTENT_OBSERVER);
			mInflater = LayoutInflater.from(context);
		}

		@Override
		public View newView(Context context, Cursor cursor, ViewGroup parent) {
			View view = mInflater.inflate(R.layout.view_db1_item_layout, null);
			return view;
		}

		@Override
		public void bindView(View view, Context context, Cursor cursor) {
			TextView idTxt = (TextView) view.findViewById(R.id.db_id_txt);
			TextView nameTxt = (TextView) view.findViewById(R.id.db_username_txt);
			TextView numberTxt = (TextView) view.findViewById(R.id.db_number_txt);
			
			int id = cursor.getInt(cursor.getColumnIndex(DataColumn.Student._ID));
			String name = cursor.getString(cursor.getColumnIndex(DataColumn.Student.COLUMN_NAME_NAME));
			String number = cursor.getString(cursor.getColumnIndex(DataColumn.Student.COLUMN_NAME_NUMBER));
			
			idTxt.setText(""+id);
			nameTxt.setText(name);
			numberTxt.setText(number);
			
		}
		
	}


SQLite数据库升级

Andoird的SQLiteOpenHelper类中有一个onUpgrade方法。帮助文档中只是说当数据库升级时该方法被触发。

1. 帮助文档里说的“数据库升级”是指什么?


你开发了一个程序,当前是1.0版本。该程序用到了数据库。到1.1版本时,你在数据库的某个表中增加了一个字段。那么软件1.0版本用的数据库在软件1.1版本就要被升级了。


2. 数据库升级应该注意什么?


软件的1.0版本升级到1.1版本时,老的数据不能丢。那么在1.1版本的程序中就要有 地方能够检测出来新的软件版本与老的数据库不兼容,并且能够有办法把1.0软件的数据库升级到1.1软件能够使用的数据库。换句话说,要在1.0软件的数 据库的那个表中增加那个字段,并赋予这个字段默认值。


3. 程序如何知道数据库需要升级?

SQLiteOpenHelper类的构造函数有一个参数是int version,它的意思就是指数据库版本号。比如在软件1.0版本中,我们使用SQLiteOpenHelper访问数据库时,该参数为1,那么数据库版本号1就会写在我们的数据库中。
到了1.1版本,我们的数据库需要发生变化,那么我们1.1版本的程序中就要使用一个大于1的整数来构造SQLiteOpenHelper类,用于访问新的数据库,比如2。
当我们的1.1新程序读取1.0版本的老数据库时,就发现老数据库里存储的数据库版本是1,而我们新程序访问它时填的版本号为2,系统就知道数据库需要升级。


4. 何时触发数据库升级?如何升级?


当系统在构造SQLiteOpenHelper类的对象时,如果发现版本号不一样,就会自动调用onUpgrade函数,让你在这里对数据库进行升级。根据上述场景,在这个函数中把老版本数据库的相应表中增加字段,并给每条记录增加默认值即可。
新版本号和老版本号都会作为onUpgrade函数的参数传进来,便于开发者知道数据库应该从哪个版本升级到哪个版本。
升级完成后,数据库会自动存储最新的版本号为当前数据库版本号。



 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值