-1

こんにちは私はいくつかのコードで立ち往生しています。ファイルcatalog.dbと、それを操作できるクラスがあります。データベースからデータを取得しようとすると、空のように見えます。いくつかの nslog を使用すると、接続してデータベースに入ることがわかります。データベースに入るのを見ることができますが、そこから値を取得できません。外部DBマネージャーソフトウェアでクエリが間違っているかどうかを確認しようとしましたが、クエリは正常に機能します...

これは私のクラスです

#import "DBAccess.h"
sqlite3* database;

@implementation DBAccess


-(id)init{
    self = [super init];
    if (self){       
        [self initializeDatabase];
    }
    return self;
}


-(void)initializeDatabase{
    NSString *path = [[NSBundle mainBundle]pathForResource:@"catalog" ofType:@"db"];
    if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) { NSLog(@"Opening Database"); }
    else {
        sqlite3_close(database);
        NSAssert1(0, @"FAILED to open database '%s'", sqlite3_errmsg(database));
    }
}



-(void)closeDatabase{
    if (sqlite3_close(database) != SQLITE_OK){
        NSAssert1(0, @"ERROR to close databse: '%s'", sqlite3_errmsg(database));
    }
}



-(NSMutableArray *)getAllProduct{

    NSMutableArray *products = [[NSMutableArray alloc]init];
    const char *sql = "SELECT product.ID,product.Name, Manufacturer.name, product.details,product.price, product.quantityOnHand,country.country,product.image FROM product,manufacturer,country WHERE manufacturer.manufacturerID = product.manufacturerID and product.countryOfOriginID = country.countryID";

    sqlite3_stmt *statement;

 int sqlResult = sqlite3_prepare_v2(database, sql, -1, &statement, NULL);
 NSLog(@"sqlResult: %d", sqlResult);
 if (sqlResult == SQLITE_OK){
    NSLog(@"sql step statement: %d",sqlite3_step(statement));
    NSLog(@"QUERY DONE");

    while (sqlite3_step(statement) == SQLITE_ROW){

        NSLog(@"TEST");

        Product *product = [[Product alloc]init];

        char *name = (char *)sqlite3_column_text(statement, 1);
        NSLog(@"n %s",name);
        char *manufacturer = (char *)sqlite3_column_text(statement, 2);
        NSLog(@"m %s", manufacturer);
        char *details = (char *)sqlite3_column_text(statement, 3);
        NSLog(@"d %s", details);
        char *countryoforigin = (char *)sqlite3_column_text(statement, 6);
        NSLog(@"%s", countryoforigin);
        char *image = (char *)sqlite3_column_text(statement, 7);
        NSLog(@"%s", image);

        product.ID = sqlite3_column_text(statement, 0);
        product.name = (name)?[NSString stringWithUTF8String:name]:@"";
        product.manufacturer = (manufacturer)?[NSString stringWithUTF8String:manufacturer]:@"";
        product.details = (details)?[NSString stringWithUTF8String:details]:@"";
        product.price = sqlite3_column_double (statement, 4);
        product.quantity = sqlite3_column_int(statement, 5);
        product.countryOfOrigin = (countryoforigin)?[NSString stringWithUTF8String:countryoforigin]:@"";
        product.image = (image)?[NSString stringWithUTF8String:image]:@"";
        [products addObject:product];
    }
    sqlite3_finalize(statement);
}
else {
    NSLog(@"Problem with database %d",sqlResult);
}
return products;
}

@end

これは私のコンソールに表示されるものです

2013-08-14 12:38:58.505 Catalog[1642:c07] Opening Database
2013-08-14 12:38:58.508 Catalog[1642:c07] sqlResult: 0
2013-08-14 12:38:58.509 Catalog[1642:c07] sql step statement: 101
2013-08-14 12:38:58.509 Catalog[1642:c07] QUERY DONE
2013-08-14 12:38:58.510 Catalog[1642:c07] ()

私の問題は何ですか?ありがとう

4

4 に答える 4

1

1) データベースをドキュメント ディレクトリにコピーします...

-(void) checkAndCreateDatabase{ // SQL データベースが既にユーザーの電話に保存されているかどうかを確認し、保存されていない場合はコピーします

NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
NSString *databasePath = [documentsDir stringByAppendingPathComponent:@"test.sqlite"];
BOOL success;

// Create a FileManager object, we will use this to check the status
// of the database and to copy it over if required
NSFileManager *fileManager = [NSFileManager defaultManager];

// Check if the database has already been created in the users filesystem
success = [fileManager fileExistsAtPath:databasePath];

// If the database already exists then return without doing anything
if(success) return;

// If not then proceed to copy the database from the application to the users filesystem

// Get the path to the database in the application package
NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"test.sqlite"];

// Copy the database from the package to the users filesystem
[fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];

}

2)次に、この方法でデータベースと対話します。

-(void)sqliteTransaction { sqlite3 *データベース;

NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
NSString *databasePath = [documentsDir stringByAppendingPathComponent:@"test.sqlite"];

// Init the animals Array


// Open the database from the users filessytem
if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
    // Setup the SQL Statement and compile it for faster access
    const char *sqlStatement = "select * from me";
    sqlite3_stmt *compiledStatement;
    if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
        // Loop through the results and add them to the feeds array
        while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
            // Read the data from the result row
            NSString *aName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];


            NSLog(@"%@",aName);
            // Create a new animal object with the data from the database

        }
    }
    // Release the compiled statement from memory
    sqlite3_finalize(compiledStatement);

}
sqlite3_close(database);

}

于 2013-08-14T12:02:41.707 に答える
0

皆さんが提案した方法を試しましたが、それでも同じ問題が発生します。

何が原因なのかがわかったと思います。

私はこれで私のクエリを変更しました:

 const char *sql = "SELECT product.ID,product.Name, product.details,product.price, product.quantityOnHand,product.image FROM Product";

そして、このように機能します...他のテーブルの読み取りに問題があるようです...別のテーブルを追加すると、機能しなくなります。しかし、それは外部データベースマネージャーソフトウェアでは奇妙な原因であり、クエリは正常に機能します

于 2013-08-14T18:16:47.323 に答える