2014-01-20 2 views
0

Я начинающий разработчик IOS Пожалуйста, руководство мне кто-то о «Как я могу получить данные из базы данных только у меня есть» у меня есть 2-го класса для этого MainViewController и BookViewController это одна работа отлично подходит для автономный режим может показывать данные только у меня есть.Xcode: Получить данные с устройства Database

MainViewController.m

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    db = [[DBManager alloc]init]; 
    [db initWithDB]; 
    bookArray = [db getBookData]; 
} 
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *path = [paths objectAtIndex:0]; 
    _databaseVersion = [[bookArray objectAtIndex:indexPath.item]bookVersion]; 

    NSLog(@"%f",_databaseVersion); 
    BookCell *bookcell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ReuseCell" forIndexPath:indexPath]; 

    return bookcell; 

} 
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{ 
    return [bookArray count]; 
} 
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView 
{ 
    return 1; 
} 

Это MainViewController работает , но когда я отправить данные, как это BookViewController

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 


     if ([segue.identifier isEqualToString:@"course1"]){ 
      BookViewController *controller = (BookViewController *)segue.destinationViewController; 

      [controller setBookArray:bookArray]; 
      controller.checkType = @"1"; 
      controller.statusMode = statusMode; 
      controller.databaseVersion = _databaseVersion; 

     } 
} 

но bookArray не работает для BookViewController

BookViewController. м

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ 

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *path = [paths objectAtIndex:0]; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 


    BookCell *bookcell = [collectionView dequeueReusableCellWithReuseIdentifier:@"ReuseCell" forIndexPath:indexPath]; 
    BookCell *cell = (BookCell *)[collectionView cellForItemAtIndexPath:indexPath]; 
    NSInteger row= indexPath.row; 

     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 

      NSURL *imageURL = [NSURL URLWithString:[[bookList objectAtIndex:indexPath.item]coverURL]]; 

      NSData *imageData = [NSData dataWithContentsOfURL:imageURL]; 
      UIImage *image = [UIImage imageWithData:imageData]; 

      dispatch_async(dispatch_get_main_queue(), ^{ 


       bookcell.bookCover.image = [UIImage imageWithData:imageData]; 
       bookcell.bookCover.alpha = 0.5f; 
       bookcell.bookDetailLabel.hidden = NO; 
         NSLog(@"Row == %d ",row); 

     if ([[bookList objectAtIndex:indexPath.row]bookVersion] > [[bookArray objectAtIndex:indexPath.row]bookVersion] && [[bookArray objectAtIndex:indexPath.row]bookVersion] > 0) { 
      bookcell.bookCover.image = [UIImage imageWithData:imageData]; 
      bookcell.bookCover.alpha = 1.0f; 
      bookcell.bookDetailLabel.hidden = NO; 
      bookcell.bookDetailLabel.text = @"Update"; 


      } 

       }); 
     }); 

    } 
    return bookcell; 
} 

-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{ 
    return [bookList count]; 
} 
- (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView 
{ 
    return 1; 
} 

//bookList is data from Webservice and bookArray is data from database.

, но я не знаю, почему я не могу использовать данные из базы данных Я стараюсь, как этот [[bookArray objectAtIndex:indexPath.item]bookVersion]; в cellForItemAtIndexPath: на BookViewController.m но bookArray крах, потому что все дни bookArry есть только один данные работы, если Я иду, как этот [[bookArray objectAtIndex:0]bookVersion]; получит один данные, и не врезаться, но я хочу использовать

if([[bookList objectAtIndex:indexPath.row]bookVersion] > [[bookArray objectAtIndex:indexPath.row]bookVersion]) 
{ .... } 

, но это один из-за аварии во все дни у [[bookList objectAtIndex:indexPath.row]bookVersion] есть 10 данных внутри на WebService но [[bookArray objectAtIndex:indexPath.row]bookVersion] ВГА e только одна информация Пожалуйста, помогите мне, как получить [[bookArray objectAtIndex:indexPath.row]bookVersion] данных, а не сбой, если нет данных, покажет null Пожалуйста, пожалуйста, пожалуйста.

авария на этом [[bookArray objectAtIndex:indexPath.item]bookVersion]

NSString *testData = [[bookArray objectAtIndex:indexPath.item]downloadFlag]; 
NSLog(@"test flag %@",testData); 


2014-01-20 11:14:29.837 GreenAcademy PowerShelf[596:60b] test flag 1 
2014-01-20 11:14:29.842 GreenAcademy PowerShelf[596:60b] ------------------------- 
2014-01-20 11:14:29.844 GreenAcademy PowerShelf[596:60b] test flag 1 
2014-01-20 11:14:29.849 GreenAcademy PowerShelf[596:60b] ------------------------- 
2014-01-20 11:14:29.851 GreenAcademy PowerShelf[596:60b] test flag 1 
2014-01-20 11:14:29.854 GreenAcademy PowerShelf[596:60b] ------------------------- 
2014-01-20 11:14:29.863 GreenAcademy PowerShelf[596:60b] *** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSArrayM objectAtIndex:]: index 3 beyond bounds [0 .. 2]' 
*** First throw call stack: 
(0x2e349f4b 0x38a1b6af 0x2e280533 0xb6911 0x30b1de65 0x30b1c5d9 0x30b18921 0x30abcda3 0x30743c6b 0x3073f47b 0x3073f30d 0x3073ed1f 0x3073eb2f 0x3073885d 0x2e3151cd 0x2e312b71 0x2e312eb3 0x2e27dc27 0x2e27da0b 0x32f51283 0x30b21049 0x80b7d 0x38f23ab7) 
libc++abi.dylib: terminating with uncaught exception of type NSException 
+0

Ваш 'cellForItemAtIndexPath' в' BookViewController.m' очень любопытен. Вы ссылаетесь на 'shelcell', но не показываете нам это. После 'dequeueReusableCellWithReuseIdentifier' вы устанавливаете' cell' (я предполагаю, что это должно было быть 'shelcell'), используя' cellForItemAtIndexPath', но эта конструкция не имеет смысла, если вы не делаете этого _inside_ блока, чтобы отправить обратно главная очередь из очереди фона. Также неясно, почему вы вызываете '[db initWithDB]' в этой фоновой очереди. – Rob

+0

Я редактирую свои вопросы сейчас, помогите мне, пожалуйста. @Rob Спасибо, я пишу неправильно. –

ответ

2

Если вы не хотите, чтобы ваш код сгенерирует исключение при попытке доступа элемента за пределами массива элементов, проверьте count свойство первым. Таким образом, вместо:

NSInteger row = indexPath.row 
if ([[bookList objectAtIndex:row] bookVersion] > [[bookArray objectAtIndex:row] bookVersion]) 
{ .... } 

Вы можете просто добавить проверку count собственности, первый:

if ([bookArray count] >= (row + 1) && [[bookList objectAtIndex:row] bookVersion] > [[bookArray objectAtIndex:row] bookVersion]) 
{ .... } 

или, возможно, немного более кратким, используя новый индекс массива обозначения:

if ([bookArray count] >= (row + 1) && [bookList[row] bookVersion] > [bookArray[row] bookVersion]) 
{ .... } 
+0

Спасибо за вашу доброту, я не могу вас поблагодарить. Это прекрасно. Спасибо учителю. –

+0

Пожалуйста, помогите мне снова. почему я не могу показать bookCover bookID = 4, если я сначала не загружаю bookID = 3.Я использую этот код для отображения некоторой книги 'if ([bookArray count]> = (row + 1) && [[bookList objectAtIndex: row] bookVersion]> [[bookArray objectAtIndex: row] bookVersion] && [[[bookList objectAtIndex : row] bookID] isEqualToString: [[книгаArray объектAtIndex: ряд] книгаID]]) {..} 'пожалуйста, путеводитель. –

+0

@ user2180698 Трудно сказать, потому что не совсем ясно, что такое «модель» вашего приложения (и, без обид, ваш вопрос довольно запутанный, в том числе множество ненужных вещей, но по иронии судьбы не хватает материала для ответа на подобные вопросы; и это уже так много беспорядка, что я не решаюсь приглашать вас добавить еще код, lol). – Rob

Смежные вопросы