2013-05-09 42 views
5

Tôi có một Người dùng bảng và có nhiều cột trong mô hình dữ liệu lõi. Một trong những cột là user_id và tôi đang cố gắng để có được user_id cao nhất và thêm + 1 vào nó và chuyển nó cho đối tượng tiếp theo sẽ được chèn vào. Tôi đã theo dõi apple developer guide và triển khai như được đề xuất. Đây là mã mà tôi đang cố thực hiện.Lấy ID tối đa từ dữ liệu lõi & sqlite

Sự cố là: Giá trị tài khoản của tôi đang được trả về đang được đặt thành một số lạ mà thậm chí không tồn tại trong cơ sở dữ liệu.

"account_id" = 139784529; Nó được coi là 1 vì tôi chỉ lưu trong dữ liệu cốt lõi.

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Users" inManagedObjectContext:self._managedObjectContext]; 
[request setEntity:entity]; 

// Specify that the request should return dictionaries. 
[request setResultType:NSDictionaryResultType]; 

// Create an expression for the key path. 
NSExpression *keyPathExpression = [NSExpression expressionForKeyPath:@"account_id"]; 

// Create an expression to represent the function you want to apply 
NSExpression *expression = [NSExpression expressionForFunction:@"max:" 
                arguments:@[keyPathExpression]]; 

// Create an expression description using the minExpression and returning a date. 
NSExpressionDescription *expressionDescription = [[NSExpressionDescription alloc] init]; 

// The name is the key that will be used in the dictionary for the return value. 
[expressionDescription setName:@"maxAccountId"]; 
[expressionDescription setExpression:expression]; 
[expressionDescription setExpressionResultType:NSInteger32AttributeType]; // For example, NSDateAttributeType 

// Set the request's properties to fetch just the property represented by the expressions. 
[request setPropertiesToFetch:@[expressionDescription]]; 

// Execute the fetch. 
NSError *error; 
NSArray *objects = [self._managedObjectContext executeFetchRequest:request error:&error]; 
if (objects == nil) { 
    // Handle the error. 
} 
else { 
    if ([objects count] > 0) { 
     nextAccountId = [[[objects objectAtIndex:0] valueForKey:@"maxAccountId"] integerValue]; 
    } 
} 
} 

@catch (NSException *exception) { 
    NSLog(@"%@",[exception reason]); 
} 

return nextAccountId + 1; 

Hy vọng ai đó đã gặp phải vấn đề này trước và khắc phục sự cố.

Cảm ơn bạn

+0

Giá trị mà bạn thấy trông giống như giá trị rác "bình thường" mà bạn nhận được khi truy cập các biến chưa được khởi tạo. Đặt 'nextAccountId' thành 0 sẽ sửa lỗi đó. Tôi không chắc chắn tại sao '[đối tượng đếm]' trả về số không, mặc dù. – dasblinkenlight

+0

[đối tượng đếm] không trả về 0. Tôi không chắc chắn những gì bạn đang đề cập đến? – Harish

+0

Nó không giống như có một sự phân công của 'nextAccountId' trong một số đường dẫn, đặc biệt khi đếm là số không. Câu trả lời của Daniel dưới đây đã thêm một 'else' để che giấu điều đó. – dasblinkenlight

Trả lời

3

Cảm ơn tất cả các bạn đã xem câu hỏi. Cũng cảm ơn bạn cho các ý kiến ​​và câu trả lời. Sau khi tìm ra vấn đề xem cơ sở dữ liệu sqlite từ thiết bị đầu cuối, tôi nhận thấy bảng đã bị hỏng và nó đã đưa tất cả các giá trị rác lại cho tôi. Vấn đề thực sự đơn giản. Đây là những gì tôi đã làm để sửa chữa nó.

  1. Đã xóa ứng dụng khỏi Trình mô phỏng iPhone.
  2. Giải pháp làm sạch
  3. được biên dịch lại chương trình. Ran nó, và bam .. nó làm việc.

Chỉ cần một mẹo dành cho nhà phát triển cho những người không biết về số truy cập sqlite từ thiết bị đầu cuối.

  1. Tìm ra vị trí cho sqlite của bạn. Thông thường /Người dùng/Tên người dùng/Thư viện/Hỗ trợ ứng dụng/Trình mô phỏng iPhone/6.1/xxxxxxxxxx/Tài liệu cd vào thư mục này.

  2. lệnh loại sqlite3

  3. đính kèm "Application.sqlite" như db1

  4. bam .. chạy lệnh của bạn.

  5. Nếu bạn muốn nhìn vào cơ sở dữ liệu chạy trong - loại .database

Cảm ơn tất cả các bạn một lần nữa.

1

Mã này hoạt động tốt đối với tôi sau khi tôi loại bỏ các thử/code bắt và đơn giản hóa các câu lệnh if sau khi lấy yêu cầu này:

if ([objects count] > 0) { 
    nextAccountId = [[[objects objectAtIndex:0] valueForKey:@"maxAccountId"] integerValue]; 
} 
else { 
    nextAccountId = 0; 
} 

Nếu điều đó không sửa chữa nó xác nhận rằng bạn có ngữ cảnh đối tượng được quản lý được khởi tạo chính xác (self._managedObjectContextself.managedObjectContext tùy thuộc vào cách bạn đã xác định nó) và tên thuộc tính/thuộc tính là chính xác.

+0

cảm ơn bạn đã phản hồi, tôi sẽ thử cách này và cho bạn biết cách hoạt động của nó. – Harish

+0

Tôi đã thử những gì bạn nói và nó vẫn mang lại cho tôi cùng một vấn đề. Gắn nhật ký, trong các bình luận (LLĐB) po đối tượng $ 12 = 0x08156790 <_PFArray 0x8156790> ( { maxAccountId = 139.784.529; } ) – Harish

Các vấn đề liên quan