2012-02-15 58 views
1

我需要開發一個應用程序,我需要將產品存儲到購物車中。還需要以最後一種排序方式檢索最近的訂單。
哪個是存儲數據的最佳方式 - 使用plist或SQLite數據庫?iPhone中的存儲

回答

1

我創建了這種類型的應用程序,在該應用程序中,我使用Sqlite數據庫來輕鬆操作而不是.plist文件。

以下是將項目插入到數據庫中的一些代碼量。

初始化數據庫

-(id)init{ 
    if(self=[super init]) { 
     documentsDirectory_Statement; 
     documentsDirectory=[documentsDirectory stringByAppendingPathComponent:@"DietCenter.rsd"]; 
     self.dbPath=documentsDirectory; 
     NSFileManager *fm=[NSFileManager defaultManager]; 
     if(![fm fileExistsAtPath:self.dbPath]) { 
      NSString *localDB=[[NSBundle mainBundle] pathForResource:@"DietCenter" ofType:@"rsd"]; 
      NSError *err; 
      if(![fm copyItemAtPath:localDB toPath:self.dbPath error:&err]){ 
       NSLog(@"Error in creating DB -> %@",err); 
      } 
     } 

     if(sqlite3_open([self.dbPath UTF8String], &database) !=SQLITE_OK){ 
      NSLog(@"error while opening database."); 
     } else { 
      sqlite3_close(database); 
     } 
    } 
    return self; 
} 

同意價值觀

#define PUT_Value(_TO_,_FROM_) { \ 
     NSString *str=[dObj valueForKey:_FROM_]; \ 
     if(!str) [email protected]" "; \ 
     sqlite3_bind_text(compiledStmt,_TO_,[str UTF8String],-1,SQLITE_TRANSIENT); \ 
    } 

    #define PUT_Integer(_TO_,_FROM_) { \ 
     NSInteger numbr=[[dObj valueForKey:_FROM_] intValue]; \ 
     sqlite3_bind_int(compiledStmt,_TO_,numbr); \ 
    } 


    #define PUT_Double(_TO_,_FROM_) { \ 
    CGFloat doubleX=[[dObj valueForKey:_FROM_] floatValue]; \ 
    sqlite3_bind_double(compiledStmt,_TO_,doubleX); \ 
    } 



    #define GET_Value(_TO_,_FROM_) NSString *_TO_; { \ 
    const unsigned char *c=sqlite3_column_text(compiledStmt,_FROM_); \ 
    _TO_= c ? [NSString stringWithUTF8String:(char*)c] : @"" ; \ 
    } 

    #define GET_Double(_TO_,_FROM_) double _TO_;{ \ 
    _TO_=sqlite3_column_double(compiledStmt,_FROM_); \ 
    } 

    #define GET_Integer(_TO_,_FROM_) NSUInteger _TO_; { \ 
    _TO_ = sqlite3_column_int(compiledStmt,_FROM_); \ 
    } 

值插入功能 - (空)insertItem:(NSArray的*)arItem {

sqlite3_stmt *compiledStmt; 
    if(sqlite3_open([self.dbPath UTF8String], &database) ==SQLITE_OK) { 


     sqlite3_prepare_v2(database, "BEGIN TRANSACTION", -1, &compiledStmt, NULL); 
     sqlite3_step(compiledStmt); 
     sqlite3_finalize(compiledStmt); 

     const char *sqlInsertQry="insert into CartDetails (id,cat_id,KD,item,qty,calories,ar_name) values(?,?,?,?,?,?,?)"; 
     if(sqlite3_prepare_v2(database, sqlInsertQry, -1, &compiledStmt, NULL) == SQLITE_OK){ 
      for (NSDictionary *dObj in arItem) { 
       PUT_Integer(1,@"id"); 
       PUT_Integer(2,@"Cat_Id"); 
       PUT_Double(3,@"KD"); 
       PUT_Value(4,@"item"); 
       PUT_Integer(5,@"qty"); 
       PUT_Value(6,@"calories"); 
       PUT_Value(7,@"ar_name");     

       NSUInteger err = sqlite3_step(compiledStmt); 
       if (err != SQLITE_DONE){ 
        NSLog(@"error while binding %d %s",err, sqlite3_errmsg(database)); 
       } 
       sqlite3_reset(compiledStmt); 
      } 
      sqlite3_finalize(compiledStmt);  
     } else { 
      NSLog(@"Invalid Query"); 
     } 
     sqlite3_prepare_v2(database, "END TRANSACTION", -1, &compiledStmt, NULL); 
     sqlite3_step(compiledStmt); 
     sqlite3_finalize(compiledStmt); 
     sqlite3_close(database); 
    } else { 
     NSLog(@"error while opening database."); 
    } 
} 

如果您有任何疑問相關這個請告訴我我幫你ü

感謝和問候,

@塞繆爾

1

我認爲最好的方法就是像你說的過去的五年將在每個

+0

感謝回答... – nithin 2012-02-15 05:41:41

0

SQLite是始終處於應用程序使用,因爲它很容易保持一個不錯的選擇時間改變,因爲它的數據庫來保存。核心數據功能還可以使用另外一個選項。