如何计算Realm数据库中燃料条目列表中的所有MPG

时间:2015-07-18 17:50:01

标签: objective-c algorithm realm

好的,我发生的事情就是这样。我有一辆" Car"对象,带有" FuelEntries"的数组。每个FuelEntry都有里程,加仑泵和Bool值的属性,用于" fillUp"。

我在我的应用程序中成功计算出最新的燃油里程,并使用以下方法显示结果:

    - (float)calculateMPG:(Car*)car {
    RLMResults *fuelResults1 = [car.fuelEntries objectsWhere:@"fillUp = YES"];
    if (fuelResults1.count <= 1) {
        return 0.0;
    } else {
        NSUInteger __block firstEntry = 0;
        NSUInteger __block secondEntry = 0;
        float __block gallonsTotal = 0.0;

        RLMResults *fuelResults = [car.fuelEntries sortedResultsUsingProperty:@"date" ascending:NO];
        NSMutableArray *results = [NSMutableArray new];
        for (FuelEntry *entry in fuelResults) {
            [results addObject:entry];
        }

        [results enumerateObjectsUsingBlock:^(FuelEntry *obj, NSUInteger idx, BOOL *stop) {
            if (obj.fillUp == YES && firstEntry == 0) {
                firstEntry = obj.mileage;
                gallonsTotal += obj.gallons;
            } else if (obj.fillUp == NO && firstEntry == 0) {
                idx++;
            } else if (obj.fillUp == YES && firstEntry != 0) {
                secondEntry = obj.mileage;
                *stop = YES;
            } else {
                gallonsTotal += obj.gallons;
            }

        }];

        return (firstEntry - secondEntry) / gallonsTotal;
    }
}

但是,我仍然坚持如何迭代整个数组并计算所有可能的MPG读数,以便我可以随着时间的推移创建一个报告。

我正在考虑创建一个名为MPGEntry的RLMObject,但是如果我可以在需要的时候计算它,我认为它会更简单。

这是我的&#34; Car&#34;类标题:

#import <Realm/Realm.h>

#import "OilChange.h"
#import "FuelEntry.h"
#import "ServiceEntry.h"
#import "MonthlyMilesEntry.h"
#import "PhotoObject.h"
#import "MPGEntry.h"

RLM_ARRAY_TYPE(OilChange)
RLM_ARRAY_TYPE(FuelEntry)
RLM_ARRAY_TYPE(MonthlyMilesEntry)
RLM_ARRAY_TYPE(ServiceEntry)


@interface Car : RLMObject
@property NSString *uuid;
@property NSString *name;
@property NSString *make;
@property NSString *VIN;
@property NSInteger year;
//@property BOOL activeCar;
@property NSInteger currentMileage;
@property NSString *driverID;
@property NSInteger oilChangeMiles;
@property NSInteger nextOilChange;


@property RLMArray<PhotoObject> *carPhoto;
@property RLMArray<OilChange> *oilChanges;
@property RLMArray<FuelEntry> *fuelEntries;
@property RLMArray<ServiceEntry> *serviceEntries;
@property RLMArray<MonthlyMilesEntry> *monthlyMilesEntries;
@property RLMArray<MPGEntry> *mpgEntries;

+ (NSDictionary *)defaultPropertyValues;
+ (NSString *)primaryKey;

@end

这是我目前的#34; FuelEntry&#34;头:

#import <Realm/Realm.h>
#import "PhotoObject.h"

@interface FuelEntry : RLMObject

@property NSDate *date;
@property NSInteger mileage;
@property double price;
@property double gallons;
@property BOOL fillUp;
@property RLMArray<PhotoObject> *receipts;

+ (NSDictionary *)defaultPropertyValues;

@end

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

从我可以收集到的信息中,你的逻辑可以获取与汽车相关的所有燃料条目,但是然后使用该循环来计算出最新的2个填充事件以计算出最新的MPG。

由于你已经获得了所有的燃料条目,我不明白为什么不应该遍历整个阵列来计算出以前的MPG结果。

希望,只需要创建另一个数组对象来保存MPG结果,然后每当你到达循环中你同时拥有'firstEntry'和'secondEntry'的点时,你就可以在那里执行计算,然后重置这两个条目。

如果我在这里遗漏任何东西,请告诉我!