实现对数据库info.db的表signalinfo,resultsinfo的操作。
提示:这里可以添加本文要记录的大概内容:
编程参考:
https://blog.csdn.net/sinat_38184748/article/details/88532631
https://blog.csdn.net/qq_19343089/article/details/72985675
提示:以下是本篇文章正文内容,下面案例可供参考
1.Dbhelper
代码如下(示例):
/*
*定义:SQLiteOpenHelper是一个辅助类
*作用:管理数据库(创建、增、修、删) & 版本的控制。
*使用过程:通过创建子类继承SQLiteOpenHelper类,实现它的一些方法来对数据库DataBase进行操作。
*在实际开发中,为了能够更好的管理和维护数据库,
*我们会封装一个继承自SQLiteOpenHelper类的数据库操作类,
*然后以这个类为基础,再封装我们的业务逻辑方法。
*
* SQLite数据库打开助手DbHelper作为抽象类SQLiteOpenHelper的子类
* 需要重写2个抽象方法onCreate()和onUpgrade()
*/
public class SignalDbHelper extends SQLiteOpenHelper {
public static final String DataBase_name = "info.db";//数据库名.db
public static final String SignalTable_name = "signalinfo";//信号数据库表1名
public static final String ResultsTable_name = "resultsinfo";//结果数据库表2名
public static final int DataBase_version = 1;//数据库版本号
public static final String longitude = "longitude", latgitude = "latgitude",distance="distance",sign="sign";//数据库主要内容,经度,纬度,当前点与信号源距离(Rssi计算得出)
public static final String wname = "wname", wlongitude = "wlongitude",wlatgitude = "wlatgitude",wsign="wsign";//ap源经度,纬度,名字
//构造方法:第1参数为上下文,第2参数库库名,第3参数为游标工厂,第4参数为版本
public SignalDbHelper( Context context) {
super(context, DataBase_name, null, DataBase_version);//name数据库名.db 仅一个数据库.db
}
//创建数据库自动执行
@Override
public void onCreate(SQLiteDatabase db) {
//不存在时建表,第一字段为自增长类型
db.execSQL("create table if not exists "+ SignalTable_name +"(_id INTEGER PRIMARY KEY AUTOINCREMENT,longitude DOUBLE NOT NULL,latgitude DOUBLE NOT NULL,distance DOUBLE NOT NULL,sign TEXT);");
db.execSQL("create table if not exists "+ ResultsTable_name +"(_id INTEGER PRIMARY KEY AUTOINCREMENT,wname TEXT NOT NULL, wlongitude DOUBLE NOT NULL,wlatgitude DOUBLE NOT NULL,wsign TEXT);");
}
//数据库版本升级自动执行
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("drop table if exists "+ SignalTable_name);//表存在删除
db.execSQL("drop table if exists "+ ResultsTable_name);//表存在删除
onCreate(db);//重建数据库
}
}
2.DAO 编写对两个表的CURD方法
代码如下(示例):
/*
本类DAO调用了打开数据库的助手类DbHelper
本类DAO提供的CRUD接口针对数据库info.db的表signalinfo,resultsinfo
DAO (Data Access Object) 数据库操作对象设计模式,对数据库的CRUD的封装,简化代码中数据库的操作
数据库使用完关闭
DAO(数据访问对象)是一种API(应用程序编程接口)
*/
public class SignalDAO {
private SQLiteDatabase sch_db;
private SignalDbHelper sch_helper;//类的对象
public String DataBase_name = "info.db";//数据库名.db
//构造函数,初始化数据库info.db
public SignalDAO(Context contsxt) {
//初始变量
//第1参数为上下文,第2参数为数据库名(无,在dbhelper中)
this.sch_helper = new SignalDbHelper(contsxt);
}
//关闭数据库
public void closeDatabase() {
sch_db.close();
}
//表一操作
/*
*新增Signal插入记录
*/
public void insertSignalInfo(double lon, double lat,double dis,String sign) {
// 通过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);
contentValues.put(SignalDbHelper.sign, sign);
// 插入数据
// insert方法参数1:要插入的表名
// insert方法参数2:如果发现将要插入的行为空时,会将这个列名的值设为null
// insert方法参数3:contentValue
long i = sch_db.insert(SignalDbHelper.SignalTable_name, null, contentValues);//成功id,失败-1
Log.v("signal数据库测试", "插入");
// 释放连接
// sch_db.close();//一般来说不要随便close(),我认为在在Activity执行onDestory的时候调用close()比较合理,或者整个App退出的时候再close()。
}
/*
*查询
* 返回全部Signal
*/
public Cursor allQuerySignalInfo() {
// 通过DBHelper类获取一个读写的SQLiteDatabase对象
sch_db = sch_helper.getWritableDatabase();
Cursor cursor=sch_db.rawQuery("select * from "+ SignalDbHelper.SignalTable_name, null);
//sch_db.close();
Log.d("signal数据库查询所有结果", String.valueOf(cursor.getCount()));
return cursor;
}
/*
查询数据表记录数Signal
*/
public int getSignalRecordsNumber(){ //返回数据表记录数
sch_db = sch_helper.getReadableDatabase();
Cursor cursor= sch_db.rawQuery("select * from "+SignalDbHelper.SignalTable_name,null);
return cursor.getCount();
}
/*
清空表Signal
*/
public void clearSignalTable() {
sch_db = sch_helper.getWritableDatabase();
sch_db.execSQL("delete from " + SignalDbHelper.SignalTable_name);
Log.d("signal清空数据表","....");
}
//表二操作
/*
*新增插入记录Wifi
*/
public void insertWifiInfo(String wname,double lon, double lat,String wsign) {
// 通过DBHelper类获取一个读写的SQLiteDatabase对象
sch_db = sch_helper.getWritableDatabase();
// 创建ContentValue设置参数
ContentValues contentValues = new ContentValues();
contentValues.put(SignalDbHelper.wname, wname);
contentValues.put(SignalDbHelper.longitude, lon);
contentValues.put(SignalDbHelper.latgitude, lat);
contentValues.put(SignalDbHelper.wsign,wsign);
// 插入数据
// insert方法参数1:要插入的表名
// insert方法参数2:如果发现将要插入的行为空时,会将这个列名的值设为null
// insert方法参数3:contentValue
long i = sch_db.insert(SignalDbHelper.ResultsTable_name, null, contentValues);//成功id,失败-1
Log.v("wifi数据库测试", "插入");
// 释放连接
// sch_db.close();//一般来说不要随便close(),我认为在在Activity执行onDestory的时候调用close()比较合理,或者整个App退出的时候再close()。
}
/*
*查询
* 返回全部Wifi
*/
public Cursor allQueryWifiInfo() {
// 通过DBHelper类获取一个读写的SQLiteDatabase对象
sch_db = sch_helper.getWritableDatabase();
Cursor cursor=sch_db.rawQuery("select * from "+ SignalDbHelper.ResultsTable_name, null);
//sch_db.close();
Log.d("wifi数据库查询所有结果", String.valueOf(cursor.getCount()));
return cursor;
}
/*通过wifi标志更新记录
*/
private void updateWifiInfo(String wname,double lon, double lat,String wsign) {
sch_db = sch_helper.getReadableDatabase();
// 创建ContentValue设置参数
ContentValues contentValues = new ContentValues();
contentValues.put(SignalDbHelper.wname, wname);
contentValues.put(SignalDbHelper.longitude, lon);
contentValues.put(SignalDbHelper.latgitude, lat);
contentValues.put(SignalDbHelper.wsign,wsign);
// 修改数据
// 参数1:tablename
// 参数2:修改的值
// 参数3:修改的条件(SQL where语句)
// 参数4:表示whereClause语句中的表达式的占位符参数列表,这些字符串会替换where条件中?
int i = sch_db.update(SignalDbHelper.ResultsTable_name, contentValues, SignalDbHelper.wsign + "=?", new String[]{wsign});
if (i < 1)
Log.v("wifi数据库测试", "更新失败");
// sch_db.close();
}
/*通过id查找对应记录wifi,id-wsign
*/
public Cursor idWifiQuery(String id) {
sch_db = sch_helper.getReadableDatabase();
// 调用SQLiteDatabase对象的query方法进行查询
// 返回一个Cursor对象:由数据库查询返回的结果集对象
Cursor cursor = sch_db.query(SignalDbHelper.ResultsTable_name, null, SignalDbHelper.wsign + "=?", new String[]{String.valueOf(id)}, null, null, null);
// 第一个参数String:表名
// 第二个参数String[]:要查询的列名
// 第三个参数String:查询条件
// 第四个参数String[]:查询条件的参数
// 第五个参数String:对查询的结果进行分组
// 第六个参数String:对分组的结果进行限制
// 第七个参数String:对查询的结果进行排序
// sch_db.close();
Log.d("wifi数据库查询结果(是否存在)", String.valueOf(cursor.getCount()));
return cursor;
}
}
3.使用DAO对象进行数据库操作
省略......