【问题标题】:Android/Room/Sqlite : Get a list of Maximum/Minimum Value of each Column in RoomAndroid/Room/Sqlite : 获取 Room 中每列的最大值/最小值列表
【发布时间】:2021-04-17 05:30:27
【问题描述】:

我的 android 应用程序中有一个类似于下面给出的表格。

Demo Table

我希望查询表格以获取表格中每一列的最小值/最大值的列表。

例如,对于给定的样本值:

Sample Values

我希望输出是

最大值:{ "Value 1":76.1, "Value 2":1000.0, "Value 3":4897.847, "Value 4":99.0 }

最小值:{ "Value 1":2.3, "Value 2":0.0, "Value 3":9.1, "Value 4":99.0 }

在 Android 中使用 Room 实现这一目标的最佳方法是什么?

【问题讨论】:

    标签: android android-sqlite android-room


    【解决方案1】:

    下面是一个实现你想要的结果的例子。

    Demo实体(表格):-

    @Entity
    class Demo {
        @PrimaryKey
        Long id;
        Double value1;
        Double value2;
        Double value3;
        Double value4;
    
        Demo(){}
    
        Demo(Double value1, Double value2, Double value3, Double value4) {
            this.value1 = value1;
            this.value2 = value2;
            this.value3 = value3;
            this.value4 = value4;
        }
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public Double getValue1() {
            return value1;
        }
    
        public void setValue1(Double value1) {
            this.value1 = value1;
        }
    
        public Double getValue2() {
            return value2;
        }
    
        public void setValue2(Double value2) {
            this.value2 = value2;
        }
    
        public Double getValue3() {
            return value3;
        }
    
        public void setValue3(Double value3) {
            this.value3 = value3;
        }
    
        public Double getValue4() {
            return value4;
        }
    
        public void setValue4(Double value4) {
            this.value4 = value4;
        }
    }
    

    DemoDao 道:-

    @Dao
    interface DemoDao {
    
        @Insert
        Long insertDemoRow(Demo demo);
    
        @Query("SELECT '{\"Value 1\":'||max(value1)||', \"Value 2\":'||max(value2)||', \"Value 3\":'||max(value3)||' \"Value 4\":'||max(value4) AS Maximum FROM demo")
        String getMaxvaluesFromDemo();
        @Query("SELECT '{\"Value 1\":'||min(value1)||', \"Value 2\":'||min(value2)||', \"Value 3\":'||min(value3)||' \"Value 4\":'||min(value4) AS Minimum FROM demo")
        String getMinvaluesFromDemo();
    
    }
    
    • 单独的查询更容易,但它们可以合并。

    DemoDatabase抽象类

    @Database(entities = {Demo.class},version = 1)
    abstract class DemoDatabase extends RoomDatabase {
        abstract DemoDao getDemoDao();
    }
    

    最后是一个调用活动(为了方便和简洁,使用了主线程):-

    public class MainActivity extends AppCompatActivity {
    
        DemoDatabase db;
        DemoDao dao;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            db = Room.databaseBuilder(this,DemoDatabase.class,"demo.db")
                    .allowMainThreadQueries()
                    .build();
            dao = db.getDemoDao();
            dao.insertDemoRow(new Demo(76.1,null,4897.847,null));
            dao.insertDemoRow(new Demo(44.2,87.1,47.0,null));
            dao.insertDemoRow(new Demo(null,1000.0,12.345,null));
            dao.insertDemoRow(new Demo(2.3,0.0,9.1,99.0));
    
            Log.d("DEMOINFO","Maximum " + dao.getMaxvaluesFromDemo());
            Log.d("DEMOIBFO","Minimums " + dao.getMinvaluesFromDemo());
        }
    }
    

    运行时(仅设计为运行一次)日志中的结果是:-

    D/DEMOINFO: Maximum {"Value 1":76.1, "Value 2":1000.0, "Value 3":4897.847 "Value 4":99.0
    D/DEMOIBFO: Minimums{"Value 1":2.3, "Value 2":0.0, "Value 3":9.1 "Value 4":99.0
    

    【讨论】:

    • 非常感谢您的解决方案。我只是想知道是否有一种方法可以将其扩展到具有很多列的类,而不必提及查询字符串中的所有列名。
    • @AayushMohanSinha 这可能可以通过利用函数从给定的列列表生成 SQL 来完成,然后 rawQuery developer.android.com/reference/androidx/room/RawQuery 可以使用这些列。可能有更好的设计/架构适合。
    • 非常感谢。我认为 RawQuery 和 SimpleSQLiteQuery 将为我完成这项工作。我会接受这个作为答案。
    猜你喜欢
    • 2020-09-22
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2017-05-24
    • 2010-11-23
    • 2016-09-04
    相关资源
    最近更新 更多