objectbox / objectbox-dart

Flutter database for super-fast Dart object persistence
https://docs.objectbox.io/getting-started
Apache License 2.0
948 stars 116 forks source link

Condition and get me a wrong data #505

Closed mrtnetwork closed 1 year ago

mrtnetwork commented 1 year ago

i have one model like this

@Entity()
class InstanceBoxData {
  InstanceBoxData(
      {required this.id,
      required this.data,
      this.localId = 0,
      required this.instanceName});
  @Unique(onConflict: ConflictStrategy.replace)
  final String id;
  @Id()
  int localId;

  final String instanceName;
  String data;
}

I want to get query with and condition

final String instanceKey = "${instanceName}_$key";
    Condition<InstanceBoxData> filters =
        InstanceBoxData_.instanceName.equals(instanceName);
    filters.and(InstanceBoxData_.id.equals(instanceKey));
    final query = (box
        .box<InstanceBoxData>()
        .query(
          filters,
        )
        .build());

above query get me two object with ids instance_1_account_buy_list, instance_1_account_ads_list

I know the id field is unique and when I use just one condition like ueniqueFields.equals get me correct data, but why the above method give me two object? Maybe I am using the condition method wrongly thanks

doctor -v

[√] Flutter (Channel stable, 3.7.0, on Microsoft Windows [Version 10.0.22000.1455], locale en-US)
    • Flutter version 3.7.0 on channel stable at C:\src\flutter
    • Upstream repository https://github.com/flutter/flutter.git
    • Framework revision b06b8b2710 (3 days ago), 2023-01-23 16:55:55 -0800
    • Engine revision b24591ed32
    • Dart version 2.19.0
    • DevTools version 2.20.1

[√] Windows Version (Installed version of Windows is version 10 or higher)

[√] Android toolchain - develop for Android devices (Android SDK version 33.0.0-rc4)
    • Android SDK at C:\Users\HP\AppData\Local\Android\sdk
    • Platform android-33, build-tools 33.0.0-rc4
    • Java binary at: C:\Program Files\Android\Android Studio\jre\bin\java
    • Java version OpenJDK Runtime Environment (build 11.0.10+0-b96-7249189)
    • All Android licenses accepted.

[√] Chrome - develop for the web
    • Chrome at C:\Program Files\Google\Chrome\Application\chrome.exe

[√] Visual Studio - develop for Windows (Visual Studio Community 2022 17.0.4)
    • Visual Studio at C:\Program Files\Microsoft Visual Studio\2022\Community
    • Visual Studio Community 2022 version 17.0.32014.148
    • Windows 10 SDK version 10.0.22000.0

[√] Android Studio (version 2020.3)
    • Android Studio at C:\Program Files\Android\Android Studio
    • Flutter plugin can be installed from:
       https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
       https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 11.0.10+0-b96-7249189)

[√] VS Code (version 1.74.3)
    • VS Code at C:\Users\HP\AppData\Local\Programs\Microsoft VS Code
    • Flutter extension version 3.58.0

[√] Connected device (5 available)
    • SM G935F (mobile)                  • ce041604a0f4933d05 • android-arm64  • Android 8.0.0 (API 26)
    • Android SDK built for x86 (mobile) • emulator-5554      • android-x86    • Android 6.0 (API 23) (emulator)
    • Windows (desktop)                  • windows            • windows-x64    • Microsoft Windows [Version 10.0.22000.1455]
    • Chrome (web)                       • chrome             • web-javascript • Google Chrome 109.0.5414.120
    • Edge (web)                         • edge               • web-javascript • Microsoft Edge 109.0.1518.61

[√] HTTP Host Availability
    • All required HTTP hosts are available

pub

objectbox: ^1.7.1
objectbox_flutter_libs: any

dev_dependencies:
  flutter_test:
    sdk: flutter
  build_runner: ^2.0.0
  objectbox_generator: any
greenrobot-team commented 1 year ago

I don't know how your actual data looks like, so I can't say if the query is "correct".

However, note this mistake:

final String instanceKey = "${instanceName}_$key";
Condition<InstanceBoxData> filters =
        InstanceBoxData_.instanceName.equals(instanceName);
filters.and(InstanceBoxData_.id.equals(instanceKey)); <-- Returns a new condition.

Instead use something like:

var filters =
        InstanceBoxData_.instanceName.equals(instanceName);
filters = filters.and(InstanceBoxData_.id.equals(instanceKey));

Or chain the calls together:

final filters =
        InstanceBoxData_.instanceName.equals(instanceName)
        .and(InstanceBoxData_.id.equals(instanceKey));
mrtnetwork commented 1 year ago
filters.and(InstanceBoxData_.id.equals(instanceKey)); <-- Returns a new condition.

ty my problem solved :)