概述
SQLite是一种轻量级的小型数据库,虽然比较小,但是功能相对比较完善,一些常见的数据库基本功能也具有,在现在的嵌入式系统中使用该数据库的比较多,因为它占用系统资源很少。
一、sqlite数据库简介
特点:
1) 轻量级-占用资源少
2) 独立性-不依赖其他软件
3) 隔离性-所有信息都在一个文件里面
4) 跨平台-android和ios都用的是sqlite
5) 多语言接口-可以java、php等多语言
6) 安全性-独占性和共享锁
二、环境搭建
第一步:右键点击我的电脑(或者是计算机),选中属性进入 控制面板项>高级系统设置>系统属性设置>环境变量
新建一个系统变量,名字就叫做android(自己命名),里面的值就是sdk/platform-tools所在目录,里面有个文件sqlite3.exe
例如:D:SDKandroid-sdk-windowsplatform-tools
注意,变量值最后不要加 ; 这个.
然后就是将android这个变量加到系统变量path里面。
使用这句 %android% 就可以了,
然后就打开dos操作界面,输入 adb shell
出现#号就是环境配置好了。
Window系统环境变量:
%SystemRoot%;%SystemRoot%system32wbem
%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函数的参数传进来,便于开发者知道数据库应该从哪个版本升级到哪个版本。
升级完成后,数据库会自动存储最新的版本号为当前数据库版本号。
最后
以上就是缓慢康乃馨为你收集整理的android数据库sqlite的简单总结的全部内容,希望文章能够帮你解决android数据库sqlite的简单总结所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复