DAO(Data Access Object) 数据访问对象是一个面向对象的数据库接口API,数据库操作对象设计模式,对数据库的CRUD的封装,简化代码中数据库的操作。
提示:这里可以添加本文要记录的大概内容:
Android 学习: http://www.wustwzx.com/web/#
参考教程
1.DbHelpr
SQLite数据库打开助手DbHelper作为抽象类SQLiteOpenHelper的子类,最主要需要重写2个抽象方法onCreate()和onUpgrade()
SQLiteOpenHelper是一个辅助类。作用:管理数据库(创建、增、修、删) & 版本的控制。
使用过程:通过创建子类继承SQLiteOpenHelper类,实现它的一些方法来对数据库DataBase进行操作。在实际开发中,为了能够更好的管理和维护数据库,我们会封装一个继承自SQLiteOpenHelper类的数据库操作类,然后以这个类为基础,再封装我们的业务逻辑方法。
代码如下(示例):
public class SignalDbHelper extends SQLiteOpenHelper {
public static final String DataBaseTable_name = "signalinfo";//数据库表名
public static final int DataBase_version = 1;//数据库版本号
public static final String longitude = "longitude", latgitude = "latgitude",distance="distance";//数据库主要内容,经度,纬度,当前点与信号源距离(Rssi计算得出)
//构造方法:第1参数为上下文,第2参数库库名,第3参数为游标工厂,第4参数为版本
public SignalDbHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);//name数据库名.db
}
//创建数据库自动执行
@Override
public void onCreate(SQLiteDatabase db) {
//不存在时建表,第一字段为自增长类型
db.execSQL("create table if not exists "+ DataBaseTable_name +"(_id INTEGER PRIMARY KEY AUTOINCREMENT,longitude DOUBLE NOT NULL,latgitude DOUBLE NOT NULL,distance DOUBLE NOT NULL);");
}
//数据库版本升级自动执行
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists "+ DataBaseTable_name);//表存在删除
onCreate(db);//重建数据库
}
}
2.DAO
本类DAO调用了打开数据库的助手类DbHelper。本类DAO提供的CRUD接口针对数据库info.db的表signalinfo
代码如下(示例):
public class SignalfcDAO {
private SQLiteDatabase sch_db;
private SignalDbHelper sch_helper;//类的对象
public static final String DataBase_name = "info";//数据库名.db
// public static final String DataBaseTable_name = "signalinfo";//数据库表名
// private static final String longitude = "longitude", latgitude = "latgitude",distance="distance";//数据库主要内容,经度,纬度,当前点与信号源距离(Rssi计算得出)
//构造函数
public SignalfcDAO(Context contsxt) {
//初始变量
//第1参数为上下文,第2参数为数据库名
this.sch_helper = new SignalDbHelper(contsxt, DataBase_name+".db", null, 1);
}
/*
*新增
*/
//插入记录
public void insertInfo(double lon, double lat,double dis) {
// 通过DBHelper类获取一个读写的SQLiteDatabase对象
sch_db = sch_helper.getWritableDatabase();
// 创建ContentValue设置参数
ContentValues contentValues = new ContentValues();
contentValues.put(SignalDbHelper.longitude, lon);
contentValues.put(SignalDbHelper.latgitude, lat);
contentValues.put(SignalDbHelper.distance, dis);
// 插入数据
// insert方法参数1:要插入的表名
// insert方法参数2:如果发现将要插入的行为空时,会将这个列名的值设为null
// insert方法参数3:contentValue
long i = sch_db.insert(SignalDbHelper.DataBaseTable_name, null, contentValues);//成功id,失败-1
Log.v("数据库测试", "插入");
// 释放连接
// sch_db.close();//一般来说不要随便close(),我认为在在Activity执行onDestory的时候调用close()比较合理,或者整个App退出的时候再close()。
}
/*
*查询
* 返回全部
*/
public Cursor allQueryInfo() {
// 通过DBHelper类获取一个读写的SQLiteDatabase对象
sch_db = sch_helper.getWritableDatabase();
Cursor cursor=sch_db.rawQuery("select * from "+ SignalDbHelper.DataBaseTable_name, null);
//sch_db.close();
Log.d("数据库查询所有结果", String.valueOf(cursor.getCount()));
return cursor;
}
/*
查询数据表记录数
*/
public int getRecordsNumber(){ //返回数据表记录数
sch_db = sch_helper.getReadableDatabase();
Cursor cursor= sch_db.rawQuery("select * from "+SignalDbHelper.DataBaseTable_name,null);
return cursor.getCount();
}
/*
清空表
*/
public void clearTable() {
sch_db = sch_helper.getWritableDatabase();
sch_db.execSQL("delete from " + SignalDbHelper.DataBaseTable_name);
Log.d("清空数据表","....");
}
//通过id判断数据是否存在数据库中
public boolean idexist(String id)
{
sch_db = sch_helper.getReadableDatabase();
Cursor cursor = sch_db.rawQuery(
"select * from schedual where card_idnum=? ",
new String[] { id });
while (cursor.moveToNext()) {
sch_db.close();
Log.i(" search_city_name_exist", id + "在数据库已存在,return true");
return true;// //在数据库已存在,返回true
}
sch_db.close();
Log.d(" id_exist", id + "在数据库不存在,return false");
return false;
}
}
3.MainActivity中使用
本类对数据库的插入操作和查询,使用了DAO类的相关方法
代码如下(示例):
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private SignalfcDAO DAO; //数据库访问对象
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DAO = new SignalfcDAO(this); //创建数据库访问对象
if(DAO.getRecordsNumber()==0) { //防止重复运行时重复插入记录
DAO.insertInfo(20, 20,20); //插入记录
}
}
其余代码省略......