在iPhone中保存从tableview中选择的行数据

时间:2012-01-04 11:46:24

标签: iphone objective-c ios

我在iPhone应用程序中有表格视图。要求是我必须对该表视图使用手势,以便当用户点击+保持一行时,会出现一个对话框,确认用户将该特定行的数据保存到iPhone核心数据或nsuserdefaults。

我想知道最好保存数据的选项,即核心数据还是nsuserdefaults?

最重要的我怎样才能实现它?

我需要任何示例或代码段来完成此操作...

thanx

3 个答案:

答案 0 :(得分:3)

在我看来

少量数据:NSUserDefaults

中等金额:plists

大量:CoreData,sqlite

首先,我们来看看直接使用SQLite。

  • 关系数据库系统
  • 跨平台兼容性的潜力
  • 许多早期的iPhone数据库示例都是使用SQLite
  • 编写的
  • 目标-C包装器(如FMDB)非常易于使用

现在核心数据:

  • 可以将数据存储在自己的Binary或SQLite存储格式中。
  • 可以序列化对象
  • 比直接使用SQLite更高级别
  • 不是RDBMS,你实际上可以直接存储东西。

现在真正的问题是,哪个更容易使用?那么,这真的取决于你在做什么。在我最近创建的应用程序中,我所要做的就是从SQLite数据库中按顺序读取少量数据,因为这是一个非常简单的任务,我只是将FMDB与iPhone SQLite一起使用。现在,如果我需要对数据做任何事情而不是阅读它,Core Data可以使这一切变得更加容易,我建议使用它。

结论:核心数据让这么多事情变得如此简单,我建议使用它,除非你已经有了现有代码,或者只做了最基本的数据库使用

这是一些教程的列表

  1. http://www.applausible.com/blog/?p=317

  2. http://maniacdev.com/2010/04/great-beginners-core-data-tutorial/

  3. http://mobile.tutsplus.com/tutorials/iphone/nsuserdefaults_iphone-sdk/

答案 1 :(得分:0)

我认为如果我们谈论真的很多日期,你最好使用核心数据。如果您只需要存储非常少的信息,例如用户设置或类似NSUserDefaults的信息,那就是正确的方法。

如何实现: 你是一个NSTimer作为aproperty,我只是称之为yourTimer 在带有tableView的ViewController中,您需要实现以下方法:

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event{
    [yourTimer invalidate];
    yourTimer = nil;
}
- (void)touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event{
     [yourTimer invalidate];
     yourTimer = nil;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
    UITouch *touch = [touches anyObject];
    CGPoint *currentPosition = [touch locationInView:self.view];

    //here you have to check if the touch is inside the cell you wanted
    //note that this code wont work, you have to personalize it, this is only a hint
    if ([currentPosition isInsideYourCell]){
        if (!yourTimer.isValid) {
            // NSLog(@"testausgabe");
            yourTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 //any interval you like 
                                                         target:self 
                                                       selector:@selector(onTick:) 
                                                       userInfo:nil repeats: YES];
           [yourTimer fire];
         }
     }

}
- (BOOL)isInsideYourCell{
//check if the touch is inside the cell
}
- (void)onTick:(NSTimer *)timer {
    if (timer.timeInterval >= 2.0){
        //lets say your dialogue will appear after 2 secconds
        [self displayYourDialogue];
    }
}

我希望你能得到这个帮助。

答案 2 :(得分:0)

如果我确定不会超过10-20行数据,我会选择NSUserDefault,否则我会选择CoreData,以便将来可以扩展。我将在单元格中使用LongPressGestureRecognizer来获取单元格的indexPath并显示对话框,如下面的示例代码所示。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{ 
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        UILongPressGestureRecognizer *pressRecongnizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(tableCellPressed:)];
            pressRecongnizer.minimumPressDuration = 0.5f;
            [cell addGestureRecognizer:pressRecongnizer];
            [pressRecongnizer release];
    }
    // your cell info
    cell.textLabel.text = @"test";
    return cell;
} 

- (void)tableCellPressed:(UILongPressGestureRecognizer *)recognizer
{
    // You can access to the tableview cell from the recognizer.view
    // You can get the data directly from the cell data more or label and etc.
    UITableViewCell *cell = (UITableViewCell *)recognizer.view;

    // You can either get the NSIndexPath of the cell from the tableview to 
    // access the data model from you data collection.
    NSIndexPath *indexPath = [self.tableview indexPathForCell:cell]

    // Use the index path to get data and display dialog.
    // For example:
    UIAlertView *alert = [UIAlertView alloc] – initWithTitle:@"table cell pressed" message:nil delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
}