无法从SQLite DB获取数据以在iOS应用中显示



所以我有一个条形码扫描应用程序,该应用程序应该读取条形码,与数据库中的条目匹配,并显示有关该条目的所有其他信息。

我使用的是一个名为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

的sqlite更好

最新更新