所以我有一个条形码扫描应用程序,该应用程序应该读取条形码,与数据库中的条目匹配,并显示有关该条目的所有其他信息。
我使用的是一个名为trackeddb.sqlite的单个文件db,该文件是使用terminal和sqlite3命令创建的。它包含两张桌子,一张用于填充"第一个扫描"条目的静态信息(每个零件号都是唯一的并且具有自己的条目),第二个表将容纳相同的产品信息,但也将包含条形码。第二个表允许用户存储同一零件号和规格的多个产品,但使用条形码创建唯一条目。
我的问题是,当条形码扫描时,它应该显示存储在第二个表中的信息(如果条形码匹配)。该代码是合理的,但是当我将条形码运行(条目在第二个表格之后)时,它显示出除预设文本外没有其他数据。我已经为此掌握了大脑,但我无法弄清楚,但是我认为这可能与我的参考数据库有关。
感谢您的时间!
当我扫描条形码
时,我受到了欢迎这是SQLite DB
pastebin链接到sqlite db和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
快速查看后,问题可能在:
中NSString *query = @"SELECT * from Tracked WHERE barcode=";
query = [query stringByAppendingString:barcode];
在您的表中,条形码被声明为文本。因此,您需要使用类似=。
的使用您的查询字符串的样子:
SELECT * from Tracked WHERE barcode=123123123123
它应该是什么样子:
SELECT * from Tracked WHERE barcode LIKE '123123123'
如果您确定从SQLite获取信息,请检查表格是否正确。
我建议使用核心数据,易于执行,并且比iOS