上下文:
- 开发社交应用。
- 我有两个包含相同对象类型的数组(称为"友谊")。
- 一个来自本地数据库(localArray),另一个来自服务器(onlineArray)
- 在线的始终是最新的,本地的可能略有不同或完全相同。
我需要比较它们。
问题 :
- 每个友谊都有不同的属性值(为了知道,有分数、名字等)。
- 这两个数组没有专门包含相同数量的友谊(如果用户在两次更新之间删除了它) 它们的顺序不同。 本地数组中的第一个对象可能具有
- ID X,而另一个对象中的第一个对象可能具有 Y。
目标 :
从意义上讲,我只想用新内容更新我的本地数据库。它是一个SQLite数据库。我只想更新更改的字段。假设友谊#147有一个更新的分数,我只是更新了相应的对象147,我很好。但是知道发生了什么变化会阻止我。
现状:
现在,我只是总是删除它并使用新内容重新创建它,正如您现在可能会尖叫的那样,这是非常欠优的。这是我的代码(带注释)
+ (void)compareFriendshipsFromDb:(NSMutableArray*)friendshipsFromDb andInsert:(NSMutableArray*)friendshipsOnline{
BOOL update = NO; //It tells us if there is new stuff
NSUInteger x = 0; //It helps us compare later.
if ([friendshipsFromDb count] != [friendshipsOnline count]){
update = YES; //The count is different, there MUST be something different, we update.
}
else{
x = [friendshipsOnline count]; //same count, but not specifically identical.
// i'm saving that count in 'x' because its the up-to-date count.
}
if (x > 0 && update == NO){ //This means that the count was identical and that there were friendships to update
for(int i = 0; i < x ; i ++){
//TODO: Compare with PREDICATES ? I read online that it's very powerful/optimal
//This is how I compare right now. It's always updating right now...
if (![friendshipsFromDb containsObject:[friendshipsOnline objectAtIndex:i]]){
update = YES;
break;
}
}
}
// Count was at zero (no friendships online) and none were found in DB. Pretty much alone.
if (x == 0 && update == NO){
DLog(@"There are no friends to compare");
}
//This is my update process, doesn't really matter.
if (update){
[DatabaseManager dropAndRecreateTable:@"friendships"];
[DatabaseManager insertFriendships:friendshipsOnline];
}
//And this calls the end of this part of the update, doesn't really matter either.
//I left these just so you have the complete process.
else {
[[NSNotificationCenter defaultCenter]postNotificationName:NOTIF_FRIENDSHIPS_DONE object:self];
[[NSNotificationCenter defaultCenter]postNotificationName:NOTIF_HOME_RELOAD object:self];
}
}
另外,我觉得将每个对象与其他对象(两个 for 循环)进行比较完全是矫枉过正,考虑到: - 我有多个属性要比较 - 大多数比较都是无用的,因为我不需要将友谊 X 与友谊 Y 进行比较。我需要将其与新版本的友谊X进行比较。
好了,这就是我现在的全部内容,但请务必在评论中提问。对于一个有经验的程序员来说,这看起来相当容易,但我不知道我如何才能在这里取得成功。我的残酷方法有效,但充满了不必要的过程。
我都听见了!
编辑 : 相关问题 :
我总是会在该特定表中处理大约 10 到 50 个条目。保持原样,还是将所有内容与 ifs 中的内部 forloop 进行比较,并进行唯一的数据库调用(但可能连续 15 次)更有效?连续 15 次打开-更新-关闭 db 还是每次(但一次)残酷地删除并作为数组插入所有内容会更重 CPU ?
考虑你想比较 产品对象数组
产品
@interface Prodcut : NSObject
@property NSString *name;
@property NSString *firstName;
-(BOOL)isEqual:(Prodcut *)object;
@end
产品.m
#import "Prodcut.h"
@implementation Prodcut
-(BOOL)isEqual:(Prodcut *)object{
int i = 0;
if ([self.name isEqual:object.name]) {
i++;
if ([self.firstName isEqualToString:object.firstName]) {
i++;
}
}
if (i == 2) {
return YES;
}
else return NO;
}
@end
压缩逻辑
Prodcut *prod1 = [[Prodcut alloc] init];
prod1.name = @"name";
prod1.firstName = @"fn1";
Prodcut *prod2 = [[Prodcut alloc] init];
prod2.name = @"name";
prod2.firstName = @"fn2";
Prodcut *prod3 = [[Prodcut alloc] init];
prod3.name = @"name";
prod3.firstName = @"fn1";
Prodcut *prod4 = [[Prodcut alloc] init];
prod4.name = @"name";
prod4.firstName = @"fn2";
NSArray *array1 = [NSArray arrayWithObjects:prod1,prod2,nil];
NSArray *array2 = [NSArray arrayWithObjects:prod3,prod4,nil];
int i=0;
if (array1.count == array2.count) {
for (Prodcut *pro in array1 ) {
for (Prodcut *innerPro in array2) {
if ([pro isEqual:innerPro]) {
i++;
break;
}
}
}
if (i == array1.count) {
NSLog(@"same");
}
else{
NSLog(@"Not Same");
}
}
else{
NSLog(@"Not same");
}