小编Big*_*air的帖子

Room - 为什么在 @ForeignKey 上使用 @Relation?

我目前的目标是在我的数据中建立一对多的关系。

从各种教程中,我了解到我有两种主要的方法来做到这一点。

  1. 创建两个实体并让孩子使用@ForeignKey注释

  2. 创建这两个实体一个额外的 POJO,@Embedded用于父实体并将子实体@Relation列表绑定到 父实体

因此,使用 Relation 似乎是额外的努力。或者我错过了什么?
Relation 的一大优势是:

当 Pojo 从查询中返回时,它的所有关系也由 Room 获取。

第一种方法哪个不那么容易?

android android-sqlite android-room

6
推荐指数
1
解决办法
272
查看次数

MVVM - 在应用程序关闭时从通知开始访问 BroadcastReceiver 中的 ViewModel/SQLite

我有每隔几天发送一次的提醒通知。

该通知的发送由重复触发AlarmManager。该通知本身是建立在onReceive我的BroadcastReceiver(如描述在这里)。所以当onReceive被触发时,应用程序甚至没有打开/运行。

现在我想访问我的(本地)SQLite 数据库并获得正确的内容来构建通知,但是我如何ViewModelProvider在这个地方获得一个(代码中的 xxx)来访问我的ViewModel?

public void onReceive(Context context, Intent intent) {    

    NotificationViewModel viewModel = 
    ViewModelProviders.of(XXX).get(NotificationViewModel.class);

    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

或者问一个更好的问题,这甚至是好的做法吗?
另一种可能性是PendingIntent将触发 的所有内容填充到 中onReceive,因此我可以在收到后一一检索它。但这会更难,因为它是一个重复的警报,每次都需要不同的内容,但只触发一次。


我查看了一些搜索结果,但它们没有解决我的问题:

  • Android 上自定义视图的 MVVM 架构
    -> 对于这样一个小问题,似乎有很多代码,再加上是 Kotlin,这对我来说很难理解
  • 使用 Model View Presenter 设计模式处理 BroadcastReceivers
    -> 这里似乎有必要先在活动中设置一些东西,然后才能使用它,但我需要在没有运行我的应用程序的情况下启动此代码
  • 在 Viewmodel 中访问 BroadCastReceiver
    ->这似乎最接近我需要的,但它也需要之前的设置。我想试试这个,但我需要手动创建我的 MainActivity 来访问它的变量。这不会在没有警告的情况下在用户的设备上打开一个新活动吗?
    甚至可以在我的应用程序不在前台的情况下访问我的数据库吗?

编辑:

读取LiveData 超出 ViewModel [...],据说

如果您的应用程序的一部分不影响 UI,则您可能不需要 LiveData。

所以这意味着我应该简单地使用上下文访问我的存储库并从中获取原始数据, …

android mvvm broadcastreceiver viewmodel android-viewmodel

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

Android BottomNavigationView:图标和文本之间的空间太大

截至最近,底部导航栏开始在文本和图标之间包含一些奇怪的空间(我认为在更新依赖项之后):

在此输入图像描述
(红色是为了看清边界)

现在图标和文本之间似乎有一个间隔符,它将两者推到了栏的最末端。到目前为止,我发现的只是尝试app:itemPaddingTop手动将图标推回原处,但这会破坏较小设备上的视图。

这是 XML:

<com.google.android.material.bottomnavigation.BottomNavigationView
        android:id="@+id/nav_view"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:background="?android:attr/windowBackground"
        app:itemBackground="@color/darkGalaxy"
        app:itemIconTint="@color/bottom_nav_color_selector"
        app:itemTextColor="@color/bottom_nav_color_selector"
        app:labelVisibilityMode="labeled"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHeight_default="percent"
        app:layout_constraintHeight_percent="0.1"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:menu="@menu/bottom_nav_menu" />
Run Code Online (Sandbox Code Playgroud)

有没有办法让它们都以最小的边距垂直居中?

基本上看起来像这样:
在此输入图像描述

android bottomnavigationview android-bottomnav

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

当与包含空间的Pattern一起使用时,扫描程序抛出NoSuchElementException

我正在尝试使用a Scanner和a 从输入中读取指定的文件格式Pattern,如下所示:

Pattern p = Pattern.compile("\\d+\\sx\\s\\d+");
Scanner sc = new Scanner(System.in);
String input = "";
try {
    input = sc.next(p);
} catch(NoSuchElementException ne) {
    System.out.println("No such token");
}
sc.close();
System.out.println(input);
Run Code Online (Sandbox Code Playgroud)

但是当我1 x 1用作输入时,它会抛出NoSuchElementException
模式\\d+x\\d+,输入1x1它可以工作,但模式中没有空格,我做错了吗?

java java.util.scanner

4
推荐指数
1
解决办法
464
查看次数

while循环中的死代码警告,如果是2

我不明白为什么Eclipse在第二个if条件中给出了代码的死代码警告:

 boolean frameErreicht = false;
  while (!frameErreicht) {
        String line = reader.readLine();
        if (line.matches("@\\d*")) {
            reader.mark(reader.getLineNumber() - 1);
            reader.setLineNumber(reader.getLineNumber() - 1);
            frameErreicht = true;
        }
        if (line == null)
            throw new IOException("Keine Angaben zu Frames im Eingabestrom");
    }
Run Code Online (Sandbox Code Playgroud)

LinenumberReader的readLine()方法的jdoc表示null如果到达流的末尾它将返回,所以如果在整个text(line == null)中找不到匹配,它应该抛出异常.
但是怎么了?

java dead-code

4
推荐指数
1
解决办法
440
查看次数

getElementsByTagName("table") - 以好奇的方式获得td

我有这个简单的例子

 <table border="1px">
  <tr> 
    <td> </td>
    <td> <input type="button" value="Click" onclick="insertText()"/> </td>
  </tr>
 </table>
Run Code Online (Sandbox Code Playgroud)

我想获得(第一个)tr元素的第一个td元素,我试过:

var td = document.getElementsByTagName("table")[0].children[0].children[0];
Run Code Online (Sandbox Code Playgroud)

因为它是:

  • var td = document.getElementsByTagName("table")[0] 对于表元素本身
  • children[0] 对于tr元素
  • children[0]再次为第一个TD元素

这就是我的想法,但显然这会让我返回tr元素而只添加另一个.children[0]让我获得td元素.

var td = document.getElementsByTagName("table")[0].children[0].children[0].children[0];
Run Code Online (Sandbox Code Playgroud)

为什么这样,或者我错过了什么?

html javascript html5 html-table

4
推荐指数
1
解决办法
1023
查看次数

SwiftUI - 计算 ScrollView 内长 GeometryReader 的高度

基于这个问题:SwiftUI - Drawing (curved) paths between view

我使用 绘制所需的视图和路径GeometryReader。问题是,现在屏幕变得太长而无法显示全部内容(有 15 个这样的视图,但您在这里只能看到 6 个):

在此输入图像描述

所以...我ScrollView在整个事情上添加了一个。之外,GeometryReader因为否则所有观点都是错误的。这是代码:

var body: some View {
        if (challengeViewModel.challengeAmount != 0) {
            ScrollView {
                GeometryReader { geometry in
                    let points = calculatePoints(geometry: geometry)
                    drawPaths(geometry: geometry, points: points)
                            .stroke(lineWidth: 3).foregroundColor(.yellow)
                    drawCircles(geometry: geometry, points: points)
                }
            }
                 .background(Color.black)
                 .navigationBarTitle("Journey")

        } else {
            Text("Loading...")
        }
    }
Run Code Online (Sandbox Code Playgroud)

(内容基本上就是1.根据屏幕尺寸计算点,2.沿着点绘制路径,3.在点上放置圆圈)

问题:
现在我明白需要从父级和子级GeometryReader获取其高度,这成为一个“先有鸡还是先有蛋的问题”。ScrollView所以我想手动计算高度GeometryReader


我的尝试

第一次尝试

最简单的方法是采用一些固定值并计算出一个非常粗略的值。我只是将其添加到GeometryReader

GeometryReader { geometry in …
Run Code Online (Sandbox Code Playgroud)

ios swiftui geometryreader swiftui-scrollview

4
推荐指数
1
解决办法
2404
查看次数

SwiftUI - 在视图之间绘制(弯曲)路径

用非常基本的术语来说,在我的 Android 应用程序中,我有一个屏幕可以绘制圆圈,然后用曲线将它们连接起来。

我需要的草图

我正在尝试在 SwiftUI 中重新创建它。

我发现这个问题看起来与我正在寻找的问题非常相似,但不幸的是答案非常简短,即使在阅读了大约 10 个不同的博客和 5 个视频之后,我仍然没有完全理解它。
我可以在 SwiftUI 中布局后获取“View”的位置吗?


所以基本逻辑是我以某种方式GeometryReader用来获取我创建的每个元素的.midX.midY坐标Circle,然后Paths在它们之间进行绘制。我唯一的问题是在创建圆之后获取这些坐标。

如何将路径添加到屏幕上,在ZStack前面Circles,路径作为一个自定义形状在后面?


更多信息:
在 Android 上,最终结果如下所示:

在此输入图像描述

基本上我有一个Challenge具有名称和一些详细文本的对象,我将它们像这样布局,以便它在视觉上代表用户的“旅程”。

所以我真正需要的是知道如何布置一些圆圈/图像(上面有文字),然后绘制连接它们的线。每个这样的挑战圈都需要可点击才能打开详细视图。

line ios swift swiftui geometryreader

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

在基元数组中重新分配数组值不会更改数组

我尝试用2个循环设置2D布尔数组的值,如下所示:

 boolean[][] frame = new boolean[10][4];
    for (boolean[] column : frame)
        for (boolean b : column)
            b = true;
Run Code Online (Sandbox Code Playgroud)

但这似乎没有用,所有的布尔都是假的,为什么呢?

java multidimensional-array

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

Java - 具有自己的 hasNext() 和 next() 的可迭代:如何做对?

我有一个实现 Iterable 的类,但有自己的hasNext()和这样的next()方法:

public class BLMovie implements Iterable<BLMovieFrame> {

@Override
public Iterator<BLMovieFrame> iterator() {
    iteratorVar = 0;
    return liste.iterator();
}

public boolean hasNext() {
    if (loop)
        return true;
    return iteratorVar < liste.size();
}

public BLMovieFrame next() {
    iteratorVar = (iteratorVar++)%(liste.size()-1);
    return liste.get(iteratorVar);
}

public void remove() {
    throw new UnsupportedOperationException();
}
Run Code Online (Sandbox Code Playgroud)

我很确定这不是最好的方法,
关于 Iterable 的其他线程似乎并不关心自己的下一个方法,所以有人对我有建议吗?

java iterator iterable

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