2014-03-13 140 views
1

中,所以我有一個條形碼掃描應用程序應該讀取條形碼,將其與數據庫中的條目進行匹配,並顯示有關條目的所有其他信息。無法從SQLite數據庫獲取數據以顯示在iOS應用程序

我使用的單個文件數據庫名爲trackeddb.sqlite,它是使用終端和sqlite3命令創建的。它包含兩個表格,一個用於填寫「第一次掃描」條目的關於產品的靜態信息(每個零件號碼都是唯一的,並有自己的條目),另一個表格包含相同的產品信息以及條形碼。第二個表格允許用戶存儲具有相同部件號和規格的多個產品,但使用條形碼創建唯一條目。

我的問題是,當條形碼掃描時,應該顯示存儲在第二個表中的信息(如果條形碼匹配)。代碼是健全的,但是當我運行條形碼時(在第二個表中輸入條目後),它不會顯示預設文本以外的任何數據。我已經絞盡腦汁想到了這一點,但我想不出來,但我認爲這可能與我如何引用我的數據庫有關。

謝謝你的時間!

What I am greeted with when I scan the barcodes

這是sqlite的DB

PasteBin link to sqlite db and schema

數據庫從這種方法稱爲

- (id)init { 
    if ((self = [super init])) { 
     NSString* sqLiteDb = [[NSBundle mainBundle] pathForResource:@"trackeddb" ofType:@"sqlite"]; 
     if (sqlite3_open([sqLiteDb UTF8String], &_database) != SQLITE_OK) { 
      NSLog(@"Failed to open database"); 
     } 
    } 
    return self; 
} 

這裏是我的代碼的主要部分,條形碼掃描器作品完美無缺,所以我不會在那裏發帖。這僅用於數據庫。

TrackerDatabase.m

//TrackerDatabase.m  
#import "TrackerDatabase.h" 
#import "TrackedItems.h" 
#import "Barcode.h" 

@interface TrackerDatabase() 

@end 

@implementation TrackerDatabase 

static TrackerDatabase *_database; 

+ (TrackerDatabase*)database { 
    if (_database == nil) { 
     _database = [[TrackerDatabase alloc] init]; 
    } 
    return _database; 
} 

- (id)init { 
    if ((self = [super init])) { 
     NSString* sqLiteDb = [[NSBundle mainBundle] pathForResource:@"trackeddb" ofType:@"sqlite"]; 
     if (sqlite3_open([sqLiteDb UTF8String], &_database) != SQLITE_OK) { 
      NSLog(@"Failed to open database"); 
     } 
    } 
    return self; 
} 

- (void)dealloc { 
    sqlite3_close(_database); 
} 

- (NSArray *)trackedItems:(NSString *)barcode { 
    NSMutableArray *retval = [[NSMutableArray alloc] init]; 
    NSString *query = @"SELECT * from Tracked WHERE barcode="; 
    query = [query stringByAppendingString:barcode]; 
    sqlite3_stmt *statement; 

    if (sqlite3_prepare_v2(_database, [query UTF8String], -1, &statement, nil) == SQLITE_OK) { 
     while (sqlite3_step(statement) == SQLITE_ROW) { 
      char *barcodeChars  = (char *) sqlite3_column_text(statement, 0); 
      char *partNumChars  = (char *) sqlite3_column_text(statement, 1); 
      char *descChars   = (char *) sqlite3_column_text(statement, 2); 
      char *colorChars  = (char *) sqlite3_column_text(statement, 3); 
      char *sizeChars   = (char *) sqlite3_column_text(statement, 4); 
      char *leadChars   = (char *) sqlite3_column_text(statement, 5); 
      char *manufacturerChars = (char *) sqlite3_column_text(statement, 6); 
      NSString *barcode  = [[NSString alloc] initWithUTF8String:barcodeChars]; 
      NSString *partNum  = [[NSString alloc] initWithUTF8String:partNumChars]; 
      NSString *desc   = [[NSString alloc] initWithUTF8String:descChars]; 
      NSString *color  = [[NSString alloc] initWithUTF8String:colorChars]; 
      NSString *size   = [[NSString alloc] initWithUTF8String:sizeChars]; 
      NSString *lead   = [[NSString alloc] initWithUTF8String:leadChars]; 
      NSString *manufacturer = [[NSString alloc] initWithUTF8String:manufacturerChars]; 

      TrackedItems *items = [[TrackedItems alloc] initWithBarcode:barcode partNum:partNum desc:desc 
       color:color size:size lead:lead manufacturer:manufacturer]; 
      [retval addObject:items]; 
     } 
     sqlite3_finalize(statement); 
    } 

    return retval; 
} 

@end 

TrackerDatabase.h

//TrackerDatabase.h 
#import <Foundation/Foundation.h> 
#import <sqlite3.h> 

@interface TrackerDatabase : NSObject { 
    sqlite3 *_database; 
} 

+ (TrackerDatabase*)database; 
- (NSArray *)trackedItems:(NSString*)barcode; 

@end 

TrackedItems.m

#import "TrackedItems.h" 

@implementation TrackedItems 

@synthesize barcode  = _barcode; 
@synthesize partNum  = _partNum; 
@synthesize desc   = _desc; 
@synthesize color  = _color; 
@synthesize size   = _size; 
@synthesize lead   = _lead; 
@synthesize manufacturer = _manufacturer; 

- (id)initWithBarcode:(NSString *)barcode partNum:(NSString *)partNum desc:(NSString *)desc 
     color:(NSString *)color size:(NSString *)size lead:(NSString *)lead 
     manufacturer:(NSString *)manufacturer { 

    if ((self = [super init])) { 
     self.barcode  = barcode; 
     self.partNum  = partNum; 
     self.desc   = desc; 
     self.color  = color; 
     self.size   = size; 
     self.lead   = lead; 
     self.manufacturer = manufacturer; 
    } 
    return self; 
} 

- (void) dealloc { 
    self.barcode  = nil; 
    self.partNum  = nil; 
    self.desc   = nil; 
    self.color  = nil; 
    self.size   = nil; 
    self.lead   = nil; 
    self.manufacturer = nil; 
} 

@end 

TrackedItems.h

#import <Foundation/Foundation.h> 

@interface TrackedItems : NSObject { 
    NSString *_barcode; 
    NSString *_partNum; 
    NSString *_desc; 
    NSString *_color; 
    NSString *_size; 
    NSString *_lead; 
    NSString *_manufacturer; 
} 

@property (nonatomic, copy) NSString *barcode; 
@property (nonatomic, copy) NSString *partNum; 
@property (nonatomic, copy) NSString *desc; 
@property (nonatomic, copy) NSString *color; 
@property (nonatomic, copy) NSString *size; 
@property (nonatomic, copy) NSString *lead; 
@property (nonatomic, copy) NSString *manufacturer; 

- (id)initWithBarcode:(NSString *)barcode partNum:(NSString *)partNum desc:(NSString *)desc 
     color:(NSString *)color size:(NSString *)size lead:(NSString *)lead 
     manufacturer:(NSString *)manufacturer; 

@end 
+0

從以往的經驗,我建議先從只是一個數據庫字段,並確保進來正確。 – GuybrushThreepwood

回答

0

咋一看,似乎這個問題威力趴在後:

NSString *query = @"SELECT * from Tracked WHERE barcode="; 
query = [query stringByAppendingString:barcode]; 

在你的餐桌, 條形碼被聲明爲TEXT。所以你需要使用LIKE而不是=。

您的查詢字符串的樣子:

SELECT * from Tracked WHERE barcode=123123123123 

它應該是什麼樣子:

SELECT * from Tracked WHERE barcode LIKE '123123123' 
+0

雖然這可能是其中的一部分,但似乎並未解決我的問題。仍然空白。感謝您的SQLite建議! – expenguin

-3

如果您確定從sqlite獲取信息,請檢查您的tableview是否正確。

我建議使用的核心數據,是很容易做到,它優於源碼的iOS

+0

CoreData是SQLite的包裝器。 – jbg

相關問題