【问题标题】:Cannot get data from SQLite DB to display in iOS app无法从 SQLite DB 获取数据以显示在 iOS 应用程序中
【发布时间】:2014-03-13 14:50:24
【问题描述】:

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

我正在使用一个名为 trackeddb.sqlite 的单个文件数据库,它是使用终端和 sqlite3 命令创建的。它包含两个表格,一个用于填写“第一次扫描”条目的产品静态信息(每个部件号都是唯一的,并且有自己的条目),另一个表格将包含相同的产品信息,但也包含条形码。第二个表允许用户存储具有相同零件编号和规格的多个产品,但使用条形码创建唯一条目。

我的问题是,当条形码扫描时,它应该显示存储在第二个表中的信息(如果条形码匹配)。代码是正确的,但是当我运行我的条形码时(在第二个表中有一个条目之后)它除了预设文本之外没有显示任何数据。我绞尽脑汁想不通,但我认为这可能与我引用数据库的方式有关。

感谢您的宝贵时间!

What I am greeted with when I scan the barcodes

这是 sqlite 数据库

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

【问题讨论】:

  • 根据经验,我建议从一个数据库字段开始,并确保正确输入。

标签: ios sql sqlite


【解决方案1】:

快速浏览后,问题似乎可能在于:

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

在您的表格中,barcode 被声明为 TEXT。所以你需要使用 LIKE 而不是 =。

您的查询字符串是什么样的:

SELECT * from Tracked WHERE barcode=123123123123

应该是什么样子:

SELECT * from Tracked WHERE barcode LIKE '123123123'

【讨论】:

  • 虽然这可能是其中的一部分,但它似乎并没有解决我的问题。仍然出现空白。不过感谢 sqlite 的建议!
【解决方案2】:

如果您确定从 sqlite 获取信息,请检查您的 tableview 是否正确。

我建议使用 Core Data,它很容易做,而且比 iOS 的 sqlite 更好

【讨论】:

  • CoreData 是 SQLite 的包装器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-27
  • 1970-01-01
  • 2017-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多