小编Kev*_*van的帖子

将房间数据库中的唯一约束添加到多列

我在房间里有一个实体

@Entity(foreignKeys ={
        @ForeignKey(entity = Label.class, parentColumns = "_id", childColumns = "labelId", onDelete = CASCADE),
        @ForeignKey(entity = Task.class, parentColumns = "_id", childColumns = "taskId", onDelete = CASCADE)
})
public class LabelOfTask extends Data{
    @ColumnInfo(name = "labelId")
    private Integer labelId;
    @ColumnInfo(name = "taskId")
    private Integer taskId;
}
Run Code Online (Sandbox Code Playgroud)

这个实体的sql语法如下

CREATE TABLE `LabelOfTask` (
    `_id` INTEGER PRIMARY KEY AUTOINCREMENT,
     `labelId` INTEGER,
     `taskId` INTEGER,
     FOREIGN KEY(`labelId`) REFERENCES `Label`(`_id`) ON UPDATE NO ACTION ON DELETE CASCADE ,
     FOREIGN KEY(`taskId`) REFERENCES `Task`(`_id`) ON UPDATE NO ACTION …
Run Code Online (Sandbox Code Playgroud)

sqlite android database-design android-room android-architecture-components

19
推荐指数
3
解决办法
1万
查看次数

如何填充房间库中实体的非列字段

我有一个类实体如下

@Entity
public class Task {    
    private String name; 
    private Integer ParentId;
    private Integer userId;   
    @Ignore
    private int noOfSubTask;
}
Run Code Online (Sandbox Code Playgroud)

在DAO类中有一个方法getTaskList()

@Dao
public interface TaskDao extends Dao<Task> {

@Query("SELECT *,(SELECT count(*) FROM Task b  WHERE a._id = b.ParentId ) AS noOfSubTask FROM Task a ")
LiveData<List<Task>> getTaskList();
}
Run Code Online (Sandbox Code Playgroud)

我想用noOfSubTask填充由(SELECT count(*)FROM Task b WHERE a._id = b.ParentId)部分查询给出的数字,但问题是它不是一列,所以房间库不会映射它getTaskList方法in dao实现(自动生成)类.

有没有办法用dao类房间库的任何方法来填充实体的非列字段(比如我的情况下的noOfSubTask)?

java sqlite android android-room android-architecture-components

16
推荐指数
2
解决办法
2832
查看次数

用于覆盖 build.gradle 中的属性的 Gradle 命令行参数

每当导入现有的 android 项目时,在大多数情况下,我们需要更改已安装工具版本号后的值

在项目/build.gradle

buildscript {
    ...
    dependencies {
        classpath 'com.android.tools.build:gradle:x.x.x'
    }
}
Run Code Online (Sandbox Code Playgroud)

在项目/应用程序/build.gradle

android {
    compileSdkVersion xx
    buildToolsVersion "xx.x.x"

    defaultConfig {
        applicationId "com.example.app.xyz"
        minSdkVersion xx
        targetSdkVersion xx
        versionCode x
        versionName "x.x"
    }
...
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:x.xx'
    compile 'com.android.support:appcompat-v7:xx.x.x'
    compile 'com.android.support:recyclerview-v7:xx.x.x'
}
Run Code Online (Sandbox Code Playgroud)

如何覆盖上述值

classpath
compileSdkVersion
buildToolsVersion
targetSdkVersion
Run Code Online (Sandbox Code Playgroud)

使用命令行参数,例如

./gradlew installDebug -PCompileSdkVersion=26 -PbuildToolsVersion=26.0.0
Run Code Online (Sandbox Code Playgroud)

或类似的东西?

我的想法是使用一个相同的命令(以我安装的 sdk 版本号作为参数)来构建任何不由我维护的项目。

如果我们必须构建由其他人管理的多个项目,这会很有帮助。它可以通过我们的命令行参数覆盖他们的构建配置来节省大量时间,这样我们就不需要每次都在每个特定位置进行更改新导入的项目。

groovy android command-line-arguments build.gradle android-gradle-plugin

7
推荐指数
1
解决办法
6391
查看次数

为什么不能在本地类中声明成员接口?

您不能在像下面这样的块内声明接口

public void greetInEnglish() {

        interface HelloThere {
           public void greet();
        }

        class EnglishHelloThere implements HelloThere {
            public void greet() {
                System.out.println("Hello " + name);
            }
        }

        HelloThere myGreeting = new EnglishHelloThere();
        myGreeting.greet();
}
Run Code Online (Sandbox Code Playgroud)

本 Oracle 教程中,我得到了“您不能在本地类中声明成员接口”。因为“接口本质上是静态的”。

我渴望用更合理的信息来理解这一点,为什么界面本质上是静态的?

为什么上面的代码没有意义?

提前感谢您的介绍!

java oop interface class local

5
推荐指数
1
解决办法
792
查看次数