Android工程搭建
SQLite数据库
1、SQLite数据库介绍
1.Android 系统中集成的轻量级的数据库
2.特点:
轻量级 只用一个动态的库, 是以单个文件的形式进行存取
跨平台 支持多个操作系统
零配置 无需安装, 直接使用
嵌入式 内嵌到手机中
3.在程序的内部可以通过数据库的名称访问, 其他应用不能访问
4.路径: data/data/应用程序包名/database/ ****.db
5.存放的类型:
NULL 空值
INTEGER 整型(不用int)
VARCHAR 可变长度的字符数据
TEXT 文本字符串
BOOLEAN 布尔
DATE
TIME
2、数据库核心类
1.SQLiteOpenHelper 数据库的帮助类, “用于数据库的创建和版本更新”
(1)定义一个类, 继承SQLiteOpenHelper
(2)重写构造方法 :提供数据库的基本信息 : 上下文对象,数据库名称,Null,数据库的版本号
(3)重写父类的方法:
onCreate():第一次创建数据库时调用, 只会执行一次 -- "初始化表,初始化数据"
onUpgrade()
2.SQLiteDatabase 数据库的操作类, “操作数据库: 执行sql语句/增/删/改/查”
(0)获取SQLiteDatabase对象
(1)执行sql 语句
void execSQL(String sql,String[] bindArgs); 执行增删改
Cusor rawQuery(String sql,String[] selectionArgs); 执行查询
(2)执行方法 – 封装好的方法 (适用于菜鸟级别的程序员)
insert() 插入数据
update() 修改数据
delete() 删除数据
query() 查询数据
3、SQL语句复习
1.创建表:
create table student(_id integer primary key autoincrement,name varchar(30),age integer,address varchar(30));
2.添加数据:insert into student values(null,‘要甜雪’,18,‘北京市海淀区’);
3.修改数据:update student set age=13,address=‘河北省沧州市’ where name=‘要甜雪’;
4. 查询数据:
select * from student where 字段 = ‘值’
模糊查询: select * from 表名 where name like ‘%小%’
select * from student order by age desc 降序查询
sum(列名) 求和
max(列名) 最大值
min(列名) 最小值
avg(列名) 求平均值
count(列名) 统计记录数
5.删除数据:delete from student where id=12;
4、数据库简单代码
举例:创建一张表student(id name age address)
1.自定义类继承SQLiteOpenHelper
注意:onCreate方法只会执行一次,如果想要修改表的字段,修改oncreate方法的话是不行的,需要删除之前生成的数据库
a.创建类
//TODO 1:自定义类继承SQLiteOpenHelper 数据库帮助类:创建数据库
public class MySQList extends SQLiteOpenHelper {
//参数一 上下文 参数二 数据库名称 参数三 工厂 null使用默认 参数四 版本号 1
public MySQList( Context context) {
super(context, "mySQL_1", null, 1);
}
//TODO 3:方法 创建表初始化数据
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table xinhao(id integer primary key autoincrement,name varchar(20),age integer)");
db.execSQL("insert into xinhao values(null,'张新浩',17),(null,'新星',18),(null,'小明',19)");
}
//TODO 更新数据库:不用写
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
b.执行增删改查方法
public void insert(View view) {
MyHelper dbOpenHelper=new MyHelper(this);
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
//方式一:
db.execSQL("insert into User(Name,Sex,Age) values('尹志强','男',18)");
//方式二:
//参数一表名 参数二:默认值 参数三:要插入的值
ContentValues values = new ContentValues();
values.put("Name","殷志强");
values.put("Sex","男");
values.put("Age","18");
db.insert("User",null,values);
}
//TODO:修改数据
public void updateData(View view) {
MyHelper dbOpenHelper=new MyHelper(this);
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
//方式一:
db.execSQL("update User set Age = 3 where name=?",new String[]{"尹志强"});
//方式二:参数一:表名 参数二:要修改的值 参数三:条件 参数四:为条件中的?赋值
ContentValues values = new ContentValues();
values.put("Age","3");
int num=db.update("User",values,"name=?",new String[]{"尹志强"});
}
//TODO:删除数据
public void deleteData(View view) {
MyHelper dbOpenHelper=new MyHelper(this);
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
//方式一:
String sql="delete from User where name = ? ";
db.execSQL(sql,new String[]{"张磊"});
//方式二:参数一:表名 参数二:要修改的值 参数三:条件 参数四:为条件中的?赋值
ContentValues values = new ContentValues();
values.put("Age","3");
int num=db.update("User",values,"name=?",new String[]{"尹志强"});
}
//TODO:查询数据
public void query1(View view) {
//创建一个数据库
MyHelper dbOpenHelper=new MyHelper(this);
SQLiteDatabase db = dbOpenHelper.getWritableDatabase();
//方式一
//Cursor cursor = db.rawQuery("select * from User",null);
//方式二
Cursor cursor=db.query("User",null,null,null,null,null,null);
//循环输出
while (cursor.moveToNext())
{
//cursor.getColumnIndex("Name") 通过列名 获取所在列的编号
//cursor.getString(列的编号); 通过列的编号, 得到该列的数据
String Name = cursor.getString(cursor.getColumnIndex("Name"));
String Sex = cursor.getString(cursor.getColumnIndex("Sex"));
int Age = cursor.getInt(cursor.getColumnIndex("Age"));
Log.i("yaotianxue","姓名: " + Name +", 性别: "+ Sex + ", 年龄 : "+ Age);
}
}
5、使用事务批量处理数据
a、什么是事务?
就是把多件事情当做一件事情来处理。也就是大家同在一条船上,要活一起活,要over一起over !
在Android应用程序开发中,经常会遇到需要进行数据库操作的时候,有关数据库事务处理对Android应用程序的稳定性和效率提升非常重要。
b、事务的好处?
1.首先Android数据库操作,特别是进行写操作的时候非常慢,将所有操作打包成一个事务能大大提高处理速度。
2.保证数据的一致性,让一个事务中的所有操作都成功执行,或者失败,或者所有操作回滚。
例如:应用程序初始化时需要批量插入大量数据,单独的使用for循环方法导致应用响应缓慢,因为 sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。我的应用初始5000条记录也就是要5000次读写磁盘操作。
而且不能保证所有数据都能同时插入。(有可能部分插入成功,另外一部分失败,后续还得删除。太麻烦)
c、代码
SQLiteDatabase db = myHepler.getWritableDatabase();
db.beginTransaction();//开启事务
try {
for (int i=0;i<1000;i++) {
db.execSQL(“insert into 表名 (字段名) values(值)”);
}
db.setTransactionSuccessful();//成功
}catch (Exception e){
e.printStackTrace();
}finally {
db.endTransaction();//结束事务
db.close();//关闭
}