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中数据存储和网络传输的框架的主要内容,如果未能解决你的问题,请参考以下文章

docker的持久化存储和共享存储和网络架构

从 Google 云存储中移动/流式传输数据

解析本地数据存储 + 网络同步

13.1 存储选项

NAS网络存储

深度学习LSTM神经网络输入输出究竟是怎样的?