2014-05-16 7 views
0

У меня есть приложение tableview, где я пытаюсь удалить данные, хранящиеся в обозревателе sqlte. Когда я удаляю данные в симуляторе, данные не появляются после закрытия и повторного запуска симулятора. Однако, когда я открываю базу данных, где исходные данные хранятся с использованием браузера sqlite, удаленные данные все же появляются в браузере sqlite. Может ли кто-нибудь посоветовать, что мне не хватает?Приложение TableView удалить из базы данных sqlite

#import "DataAccess.h" 
#import "sqlite3.h" 
#import "Product.h" 
#import "Company.h" 


@implementation DataAccess 

NSString *dbPathString; 
sqlite3 *companyDB; 
sqlite3 *productDB; 


-(void) setCompanyListFromDB 
{ 
    NSLog(@"setCompanyListFromDB"); 
    dbPathString = @"/Users/user/Desktop/telecom.db"; 

    self.companyList = [self readCompanyDataFromDB]; 
    NSLog(@"read all company data"); 
} 


-(void) deleteCompany:(Company *)company andDeleteProduct:(NSIndexPath*)indexPath{ 

    //pass the company from the tableview, then pass the row from the tablewview 
    Product *product = [company.products objectAtIndex:indexPath.row]; 
    [self deleteProductFromDB:product.name]; 
    [company.products removeObjectAtIndex:indexPath.row]; 

} 


-(NSMutableArray*)readCompanyDataFromDB //returning companyList bc we want to use this for displaying in tableview 
{ 

    NSLog(@"readDataFromDB"); 

    NSMutableArray *companyList = [[NSMutableArray alloc]init]; 


    sqlite3_stmt *statement ; 


    if (sqlite3_open([dbPathString UTF8String], &companyDB)==SQLITE_OK) { //when we do this process for products, we can skip opening companyDB bc it is already open - just do it once 

     NSLog(@"sqlite3_open"); 


     // Reading Companies ....................................Start 
     NSLog(@"Reading Companies"); 
     NSString *querySQL = [NSString stringWithFormat:@"SELECT * FROM company"]; 
     NSLog(@"Company SQL: %@", querySQL); 
     const char *query_sql = [querySQL UTF8String]; //converting to type of string C understands 
     if (sqlite3_prepare(companyDB, query_sql, -1, &statement, NULL) == SQLITE_OK) 
     { 
      NSLog(@"sqlite3_prepare"); 
      while (sqlite3_step(statement)== SQLITE_ROW) //while stepping through database, if it returns a row it should keep going, cuts out if it returns something other than SQLITE_ROW 
      { 
       // 1|Apple|AAPL|593.1|apple.jpeg 

       NSString *companyID = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statement, 0)]; 
       NSString *name = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statement, 1)]; 
       NSString *stockSymbol = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statement, 2)]; 
       NSString *stockPrice = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statement, 3)]; 
       NSString *logo = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statement, 4)]; 

       //Company *company = [Company initWithName:name logo:logo symbol:stockSymbol price:stockPrice]; 

       Company *company = [[Company alloc]init]; 
       company.companyID = companyID; 
       company.name = name; 
       company.logo = logo; 
       company.stockSymbol = stockSymbol; 
       company.stockPrice = stockPrice; 


       [company print]; 

       [companyList addObject:company]; 

      } 

     } 
     // Reading Companies ....................................Done 


     // Reading Products for each Company ....................................Start 

     sqlite3_close(companyDB); 


    } 


    for(Company *company in companyList){ 
     NSMutableArray *productList = [self readProductDataFromDBForCompanyID:company.companyID ]; 
     company.products = productList; 
    } 

    return companyList; 

} 


-(NSMutableArray*) readProductDataFromDBForCompanyID:(NSString*)companyId { 

    NSLog(@"readProductDataFromDB"); 
    NSMutableArray *productList = [[NSMutableArray alloc]init]; 


    sqlite3_stmt *statement ; 

    if (sqlite3_open([dbPathString UTF8String], &companyDB)==SQLITE_OK) { //when we do this process for products, we can skip opening companyDB bc it is already open - just do it once 

     NSLog(@"sqlite3_open"); 

     // Reading Products ....................................Start 
     NSLog(@"Reading Products"); 
     NSString *querySQL = [NSString stringWithFormat:@"select * from product where productid = %@", companyId]; 
     NSLog(@"Product SQL: %@", querySQL); 
     const char *query_sql = [querySQL UTF8String]; //converting to type of string C understands 
     if (sqlite3_prepare(companyDB, query_sql, -1, &statement, NULL) == SQLITE_OK) 
     { 
      NSLog(@"sqlite3_prepare"); 
      while (sqlite3_step(statement)== SQLITE_ROW) //while stepping through database, if it returns a row it should keep going, cuts out if it returns something other than SQLITE_ROW 
      { 

       NSString *name = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statement, 0)]; 
       NSString *website = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statement, 2)]; 
       NSString *productID = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statement, 3)]; 


       Product *product = [[Product alloc]init]; 
       product.productID = productID; 
       product.name = name; 
       product.website = website; 

       [product print]; 

       [productList addObject:product]; 
      } 

     } 
     // Reading Products ....................................Done 

     sqlite3_close(companyDB); 

    } 

// insert into product values('iPad','0','http://www.apple.com/ipad/',1); 


    return productList; 


} 

-(void) deleteProductFromDB:(NSString*)productname{ 

    if (sqlite3_open([dbPathString UTF8String], &companyDB)==SQLITE_OK) { //when we do this process for products, we can skip opening companyDB bc it is already open - just do it once 

     NSLog(@"sqlite3_open"); 

     NSString *querySQL = [NSString stringWithFormat:@"delete from product where productname = '%@'", productname]; 

     NSLog(@"Product Delete SQL: %@", querySQL); 
     const char *deleteQuery = [querySQL UTF8String]; //converting to type of string C understands 

     if (sqlite3_exec(companyDB, deleteQuery, NULL, NULL, nil)==SQLITE_OK) 
     { 
      NSLog(@"Product Deleted"); 
     } 

     sqlite3_close(companyDB); 
    } 

} 

@end 
+1

Вы используете этот код в iOS-симуляторе? Если это так, то код работает в песочнице (для имитации того, как это будет на телефоне/iPad), поэтому абсолютный путь, который у вас есть, /Users/user/Desktop/telecom.db, может быть не таким, где имитируемое приложение фактически пишет база данных. Таким образом, вы можете просто посмотреть на две разные копии базы данных. – orpheist

+0

Я запускаю его на симуляторе iOS. Это довольно интересно. Благодаря! – user3525783

ответ

0

Как уже упоминалось в комментариях - когда ваше приложение будет работать в iOS, оно будет изолировано. Более того, если вы включите базу данных sqlite в качестве файла ресурсов с вашим приложением - она ​​войдет в папку/Resources в папке вашего приложения. И все в этой папке не доступно для записи.

Так что если вам нужна база данных, которую вы хотите читать/писать, вам нужно поместить ее под папку «Документы» внутри папки вашего приложения.

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