SQLite数据库介绍
android使用开源的,与操作系统无关的SQL数据的。SQLite是一款轻量级数据库,它的设计目的是嵌入式,而且占用的资源非常少,在嵌入式设备中,可能只需要几百KB,这也是Android系统采用SQLite数据库的原因之一。
SQLite3数据类型:
支持NULL,INTERGER,REAL(浮点数字),TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的数据对象只有五种,但实际上也接受varchar,char,decimal(p,s)等数据类型,只不过在运输或保存时会转成对于的五种数据类型。SQLite最大的特点是你可以保存任何类型的数据到任何字段中,无论这列声明的数据类型是什么。
SQLite命令行操作
在命令行下创建数据库
1、启动模拟器后,打开命令行,执行adb shell
2、进入所在工程目录,如:cd data/data/com.vince.db
3、执行sqlite3 mydb创建数据库文件
这时如果使用.help可以区则求助,.quit则是离开
SQL指令都是以分号(;)结尾的。如果遇到两个减号(–)则代表注解
.databases;
定义数据库的元数据
包android.database.sqlite包含了使用SQLite数据库的所有API
SQL数据库主要概念之一就是Schema——一个关于如何组织数据库的定义
以下是一个为单表定义表名和列名的代码片段:
public final class PetMetaData {
private PetMetaData(){}
//Dog表的定义
public static abstract class DogTable implements BaseColumns{
public static final String TABLE_NAME = "dog";
public static final String NAME = "name";
public static final String AGE = "age";
}
}
使用SQLiteOpenHelper创建数据库
android系统中,数据库存储在private空间里,很安全,其他app无法访问。
SQLiteOpenHelper类里有很多有用的API,当你使用这个类获取数据库的引用的时候,只有当你需要的时候,系统才有可能进行耗时较长的操作,比如创建和更新数据库,你只要调用getWritableDatabase()和getReadableDatabase()方法就可以。调用时务必在后台调用方法。
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DataBaseHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "pet.db";
private static final int VERSION = 1;
private static final String CREATE_TABLE_DOG = "create table dog(_id integer primary key autoincrement," +
"name text,age integer)";
private static final String DROP_TABLE_DOG = "drop table if exists dog";
public DataBaseHelper(Context context) {
super(context, DB_NAME , null, VERSION);
}
//如果数据表不存在,则调用该方法
@Override
public void onCreate(SQLiteDatabase db) {
//SQLiteDatabase 用于操作数据库的工具栏
db.execSQL(CREATE_TABLE_DOG);
}
//升级
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL(DROP_TABLE_DOG);
db.execSQL(CREATE_TABLE_DOG);
}
}
插入数据库
public void add(Dog dog){
//获取操作数据库的工具类
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(PetMetaData.DogTable.NAME,dog.getName());
values.put(PetMetaData.DogTable.AGE,dog.getAge());
//参数(表名,可以为NULL的列名,ContentValues)
//合法:insert into dog(name,age) values('xx',2)
//不合法:insert into dog(name) values(null)
db.insert(PetMetaData.DogTable.TABLE_NAME,PetMetaData.DogTable.NAME,values);
db.close();
}
查询数据库
//根据ID查询结果
public Dog findById(int id){
SQLiteDatabase db = dbHelper.getReadableDatabase();
String[] columns = {PetMetaData.DogTable._ID,PetMetaData.DogTable.NAME,PetMetaData.DogTable.AGE};
//是否去除重复记录,表名,要查询的列,查询条件,查询条件的值,分组条件,分组条件的值,排序,分离条件
Cursor c = db.query(true,PetMetaData.DogTable.TABLE_NAME,columns,PetMetaData.DogTable._ID+"=?",new String[]{String.valueOf(id)},null,null,null,null);
Dog dog = null;
if (c.moveToNext()){
dog = new Dog();
dog.setId(c.getInt(c.getColumnIndexOrThrow(PetMetaData.DogTable._ID)));
dog.setName(c.getString(c.getColumnIndexOrThrow(PetMetaData.DogTable.NAME)));
dog.setAge(c.getInt(c.getColumnIndexOrThrow(PetMetaData.DogTable.AGE)));
}
c.close();
db.close();
return dog;
}
//查询所有
public ArrayList<Dog> findAll(){
SQLiteDatabase db = dbHelper.getReadableDatabase();
String[] columns = {PetMetaData.DogTable._ID,PetMetaData.DogTable.NAME,PetMetaData.DogTable.AGE};
//是否去除重复记录,表名,要查询的列,查询条件,查询条件的值,分组条件,分组条件的值,排序,分离条件
Cursor c = db.query(true,PetMetaData.DogTable.TABLE_NAME,columns,null,null,null,null,null,null);
ArrayList<Dog> dogs = new ArrayList<>();
Dog dog = null;
while (c.moveToNext()){
dog = new Dog();
dog.setId(c.getInt(c.getColumnIndexOrThrow(PetMetaData.DogTable._ID)));
dog.setName(c.getString(c.getColumnIndexOrThrow(PetMetaData.DogTable.NAME)));
dog.setAge(c.getInt(c.getColumnIndexOrThrow(PetMetaData.DogTable.AGE)));
dogs.add(dog);
}
c.close();
db.close();
return dogs;
}
删除数据库
//删除
public void delete(int id){
SQLiteDatabase db = dbHelper.getWritableDatabase();
String whereClause = PetMetaData.DogTable._ID+"=?";
String[] whereArgs = {String.valueOf(id)};
//表名,事件条件的值
db.delete(PetMetaData.DogTable.TABLE_NAME,whereClause,whereArgs);
db.close();
}
更新数据库
//更新
public void update(Dog dog){
SQLiteDatabase db = dbHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(PetMetaData.DogTable.NAME,dog.getName());
values.put(PetMetaData.DogTable.AGE,dog.getAge());
String whereClause = PetMetaData.DogTable._ID+"=?";
String[] whereArgs = {String.valueOf(dog.getId())};
//表名,ContentValues,事件,条件的值
db.update(PetMetaData.DogTable.TABLE_NAME,values,whereClause,whereArgs);
db.close();
}
使用原生SQL语句
public void rawAdd(Dog dog){
String sql = "insert into dog(name,age) values (?,?)";
Object[] args = {dog.getName(),dog.getAge()};
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.execSQL(sql,args);
db.close();
}
public void rawDelete(int id){
SQLiteDatabase db = dbHelper.getWritableDatabase();
String sql = "delete from dog where _id = ?";
Object[] args = {id};
db.execSQL(sql,args);
db.close();
}
public void rawUpdate(Dog dog){
SQLiteDatabase db = dbHelper.getWritableDatabase();
String sql = "update dog set name = ?,age = ? where _id = ?";
Object[] args = {dog.getName(),dog.getAge(),dog.getId()};
db.execSQL(sql,args);
db.close();
}
public Dog rawFindById(int id){
SQLiteDatabase db = dbHelper.getReadableDatabase();
String sql = "select _id,name,age from dog where _id = ?";
Cursor c = db.rawQuery(sql,new String[]{String.valueOf(id)});
Dog dog = null;
if (c.moveToNext()){
dog = new Dog();
dog.setId(c.getInt(c.getColumnIndexOrThrow(PetMetaData.DogTable._ID)));
dog.setName(c.getString(c.getColumnIndexOrThrow(PetMetaData.DogTable.NAME)));
dog.setAge(c.getInt(c.getColumnIndexOrThrow(PetMetaData.DogTable.AGE)));
}
c.close();
db.close();
return dog;
}
public ArrayList<Dog> rawFindAll(){
SQLiteDatabase db = dbHelper.getReadableDatabase();
String sql = "select _id,name,age from dog";
Cursor c = db.rawQuery(sql,null);
ArrayList<Dog> dogs = new ArrayList<>();
Dog dog = null;
while (c.moveToNext()){
dog = new Dog();
dog.setId(c.getInt(c.getColumnIndexOrThrow(PetMetaData.DogTable._ID)));
dog.setName(c.getString(c.getColumnIndexOrThrow(PetMetaData.DogTable.NAME)));
dog.setAge(c.getInt(c.getColumnIndexOrThrow(PetMetaData.DogTable.AGE)));
dogs.add(dog);
}
c.close();
db.close();
return dogs;
}
使用事务
//事务处理
public void transaction(){
SQLiteDatabase db = dbHelper.getWritableDatabase();
db.beginTransaction();//开始事务
try {
db.execSQL("insert into dog(name,age)values('duang',4)");
db.execSQL("insert into dog(name,age)values('guang',3)");
db.setTransactionSuccessful();//设置事务的成功标记
}finally {
db.endTransaction();//结束事务,如果判断事务标记是否为true,true就提交事务,false就回滚
}
}
sqlite游戏玩家管理案例
功能实现
1、定义元数据类:GameMetaData和表结构数据内部类 GamePlayer
2、定义数据库操作类 DatabaseAdaptec和DatabaseHelper
3、MainActivity和GamePlayerFragment用于界面显示(列表)
4、AddFragment中使用Dialog来添加玩家
5、UpdateFragment显示一个玩家数据并可以修改