Xutils-Android中数据存储和网络传输的框架
Posted 木白星枝
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xutils-Android中数据存储和网络传输的框架相关的知识,希望对你有一定的参考价值。
待解决:1.自处理复杂的sql语句
2.xutils自定义类型的属性
Xutils 数据库存储自定义类型和自定义数据类型集合 - 简书 (jianshu.com)
(1条消息) xUtils系列之DbUtils-保存自定义类型_轻度强迫症患者的博客-CSDN博客
(1条消息) xUtils 3 中,如何存储自定义实体类字段类型_WymanWong的博客-CSDN博客
一.引入Xutils包
1.首先需要引入Xutils包,在buil.gradle
中添加如下内容:
implementation 'org.xutils:xutils:3.9.0'
2.在androidManifest.xml文件中添加网络权限等
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
3.然后需要在自定义Application中添加初始化内容:(放在onCreate方法中)
x.Ext.init(this);//注册Xutils
//x.Ext.setDebug(false); // 是否输出debug日志,开启debug会影响性能,暂时未用到
//自定义特殊类型的转换器,
//ColumnConverterFactory.registerColumnConverter(GeometryField.class, new GeometryColumnConverter());
initDBManager();//数据库模块使用的,自定义的一个用来初始化数据库的函数
二.数据库模块-DbUtils
1.创建数据库
//数据库初始化
private void initDBManager()
//data/data/com.iot.gis/databases/gis_report.db
File dbFile = this.getDatabasePath("gis_report.db");
//getDatabasePath函数是用来获取右侧手机路径:/data/user/0/应用包名/databases/参数名 下的文件
boolean dbFileOk = copyDb(dbFile);
//因为项目需要自带数据,所以就把数据都放到一个SQLite的数据库文件中了,之后把db文件放到了assets文件夹下面。
//copyDb函数然后判断手机路径下是否有db文件,如果没有,就把assets下的db文件数据,复制到对应目录下,如果有,则表示已经复制过了,就不需要创建了。
if (!dbFileOk)
Logger.eTag(TAG, ResUtils.getString(R.string.db_file_not_exists));
return;
DbManager.DaoConfig daoConfig = new DbManager.DaoConfig()
.setDbName("gis_report.db")//设置数据库名称
.setDbVersion(1)//设置数据库版本
.setAllowTransaction(true)//设置是否允许事务,默认true
.setDbDir(dbFile.getParentFile())// 不设置dbDir时, 默认存储在app的私有目录.
.setDbOpenListener( new DbManager.DbOpenListener() //设置数据库打开的监听
@Override
public void onDbOpened(DbManager db)
//开启数据库支持多线程操作,提升性能,对写入加速提升巨大
db.getDatabase().enableWriteAheadLogging();
)
//下面这2个暂时还没用到
/* .setTableCreateListener( new DbManager.TableCreateListener()//设置表创建的监听
@Override
public void onTableCreated(DbManager db, TableEntity<?> table)
Log.i("JAVA", "onTableCreated:" + table.getName());
)
.setDbUpgradeListener(new DbManager.DbUpgradeListener() //设置数据库更新的监听
@Override
public void onUpgrade(DbManager db, int oldVersion, int newVersion)
)*/
;
try
db = x.getDb(daoConfig);
//gisDB = new GISDbManager(db);//gisDB是学长创建的用来查询复杂的sql语句的,里面还包含了事务
Logger.iTag(TAG, db.getDatabase().getPath());
catch (DbException e)
Logger.eTag(TAG, e);
private boolean copyDb(File dbFileTargetPath)
try
if (!dbFileTargetPath.exists()) //判断该文件是否存在于手机中
InputStream dbFileIS = this.getAssets().open("gis_report.db");
//以数据流的形式获取左侧AS中assets文件夹中对应文件名的内容
return FileIOUtils.writeFileFromIS(dbFileTargetPath, dbFileIS);
//将读取的输入流写入文件
catch (IOException e)
Logger.eTag(TAG, e);
return false;
return true;
2.创建数据库中一个表对应的实体类
import org.xutils.db.annotation.Column;
import org.xutils.db.annotation.Table;
//数据库中表的实体类
@Table(name = "Common_Using_rock_soil_sample") //确定表名
public class SampleModel
//样本ID
@Column(name = "sample_id", isId = true, autoGen = false)//isId为true代表为主键,autoGen为true代表自增,不写autoGen这个属性,默认是自增长的属性
//@Column(name = "sample_id",property ="NOT NULL")//添加约束条件,这里不能为空。
//如果普通属性没有加上@Column标签,生成表中的字段就不会包含该属性
public long sample_id;
//项目ID
@Column(name = "project_id")//name是用来设置列名的
public long project_id;
//样本编号
@Column(name = "sample_code")
public String sample_code;
//样本类型
@Column(name = "sample_type")
public String sample_type;
//动作关联ID
@Column(name = "action_relation_id")
public long action_relation_id;
//版本号
@Column(name = "sync_version_number")
public long sync_version_number;
//备注
@Column(name = "remark")
public String remark;
//野外名称
@Column(name = "field_name")
public String field_name;
//勘调对象ID
@Column(name = "survey_target_id")
public long survey_target_id;
public SampleModel() //必须要有无参构造,否则创建表不成功
//有参构造方法和相关set、get方法根据自己的需求来,使用AS快捷键创建会方便很多
3.对数据表进行操作
//插入
public static void insertSamples(List<SampleModel> sampleModels)
for (SampleModel sampleModel : sampleModels)
try
GISApplication.db.saveOrUpdate(sampleModel); //更新保存单个样例***主要用saveOrUpdate
catch (DbException e)
Log.e("eee", "samplemodel");
try
GISApplication.db.save(sampleModels);//保存实体类或实体类的List到数据库
//db.replace(list);保存或更新实体类或实体类的List到数据库, 根据id和其他唯一索引判断数据是否存在
//db.saveOrUpdate(list);保存或更新实体类或实体类的List到数据库, 根据id对应的数据是否存在.
//db.saveBindingId(list);保存实体类或实体类的List到数据库,如果该类型的id是自动生成的, 则保存完后会给id赋值.
/**
* 1.如果在你建表的时候你的主键设置成自增长,那么你在插入数据的时候直接调replace方法就可以了,
* 但是saveOrUpdate只能达到插入的效果,达不到更新原有数据的效果.
* 2.如果在你建表的时候你的主键设置成不是自增长,replace方法当然可以插入,saveOrUpdate方法既可以插入也可以达到更新的效果
*/
catch (DbException e)
Log.e("eee", "samplemodels");
//查询
public static List<SampleModel> selectSamples()
try
SampleModel sampleModel1 = GISApplication.db.findById(SampleModel.class, 2);//根据主键来查找表里的数据
SampleModel sampleModel2 = GISApplication.db.findFirst(SampleModel.class);//返回当前表的第一条数据
//查询所有数据
List<SampleModel> all = GISApplication.db.findAll(SampleModel.class);
//按条件查找,查询年龄大于15的
List<DbModel> dbModelAll = GISApplication.db
.findDbModelAll(new SqlInfo("select * from student where age > 15"));//findDbModelFirst
for (int i = 0; i < dbModelAll.size(); i++)
DbModel dbModel = dbModelAll.get(i);
String name = dbModel.getString("name");
Log.i("tag", "查询的数据: name=" + name);
//第二种条件查找,我用的这种
List<SampleModel> all1 = GISApplication.db.selector(SampleModel.class)//***主要用这种查询条件
.where("age", ">", 14)
.and("age", "<", 16)
.findAll();//.findFirst();.count();
/**List<DbModel> list = db.selector(Child.class) //复杂的参考样例
.where("age", "<", 18)
.groupBy("parentId")
.having(WhereBuilder.b("COUNT(parentId)", ">", 1))
.select("parentId, COUNT(parentId) as childNum")
.findAll();**/
//和上面那种应该是等价的
WhereBuilder b = WhereBuilder.b();
b.and("id",">",2); //构造修改的条件
b.and("id","<",4);
List<SampleModel> all2 = GISApplication.db.selector(SampleModel.class)
.where(b).findAll();
//第三种
List<SampleModel> all3 = GISApplication.db.selector(SampleModel.class)
.expr("age>14 and age<17").findAll();
if (all1 == null)
all1 = new ArrayList<>();
return all1;
catch (DbException e)
return new ArrayList<>();
//删除
public static void deleteSamples()
try
//第一种,根据主键来删除
GISApplication.db.deleteById(SampleModel.class,5);//删除主键为5的值
//第二种方法,找到符合条件的第一条数据 .findAll()就是找所有符合条件的了
SampleModel student = GISApplication.db.selector(SampleModel.class)
.where("name", "=", "学生11").findFirst();
GISApplication.db.delete(student);//先找到,再删除 ,需要判断为不为空
//第三种,删除那name=学生9 且 sex=女 的数据
GISApplication.db.delete(SampleModel.class, WhereBuilder
.b("name","=" ,"学生9")
.and("sex","=","女"));
//第二种写法,添加删除条件:
WhereBuilder b = WhereBuilder.b();
b.and("id",">",2); //构造修改的条件
b.and("id","<",4);
GISApplication.db.delete(SampleModel.class, b);
//第四种,删除所有数据,但是表还在
GISApplication.db.delete(SampleModel.class);
//db.dropTable(Student.class);删除表
//db.dropDb();删除数据库
catch (DbException e)
e.printStackTrace();
三.网络模块-HttpUtils
1.
以上是关于Xutils-Android中数据存储和网络传输的框架的主要内容,如果未能解决你的问题,请参考以下文章