1

私はsqliteデータベースから読み取るアプリを持っています。データはこのメソッドを使用して読み取られ、オブジェクトに含まれます.... NSLogで確認しました

#import "ViewController1.h"
#import "Ricetta.h"
#import "AppDelegate.h"


static sqlite3_stmt *leggiStatement = nil;

@interface ViewController1 ()

@end

@implementation ViewController1

@synthesize Webmain, oggetto2;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization



    }
    return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.


    //percorso file su cartella documents
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [documentPaths objectAtIndex:0];
    NSString *path = [documentsDir stringByAppendingPathComponent:@"Rice.sqlite"];

    //controllo se il file esiste
    if(![[NSFileManager defaultManager] fileExistsAtPath:path])
    {
        //se non esiste lo copio nella cartella documenti
        NSString *pathLocale=[[NSBundle mainBundle] pathForResource:@"Rice" ofType:@"sqlite"];
        if ([[NSFileManager defaultManager] copyItemAtPath:pathLocale toPath:path error:nil] == YES)
        {
            NSLog(@"copia eseguita");
        }       
    }





    [self personalizzaAspetto];


    [self carica_ID];




   // NSString * query = @" SELECT Immagine, Titolo, Descrizione FROM LIBRO";
   // NSArray * arrayQuery = [[NSArray alloc] initWithObjects:@"Immagine",@"Titolo",@"Descrizione",nil];
   // NSArray * arrayElementi = [self caricaValoriMain:query :arrayQuery];




        Webmain= [[UIWebView alloc]initWithFrame:CGRectMake(0, 0, 320, 365)];
        NSString *htmlString =[NSString stringWithFormat:@"<html> \n"
                               "<head> \n"
                               "<style type=\"text/css\"> \n"
                               "body {font-family: \"%@\"; font-size: %@;}\n"
                               "</style> \n"
                               "</head> \n"
                               "<body><center><img src='%@'/></center></body><center><h1>%@</h1></center><body bgcolor=\"#FFFFFF\" text=\" #ffa500\">%@</body></html>" ,@"futura",[NSNumber numberWithInt:15],oggetto2.Immagine,oggetto2.Titolo,oggetto2.Descrizione];

        [Webmain loadHTMLString:htmlString baseURL:nil];

        [self.view addSubview:Webmain];







-(void)carica_ID{




      sqlite3 *database = NULL;

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

    if(sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK)
    {
        if(leggiStatement==nil){
        const char *sql = "select Immagine,Titolo,Descrizione from LIBRO WHERE RicettaID=1";

        if(sqlite3_prepare_v2(database, sql, -1, &leggiStatement, NULL) != SQLITE_OK)
           NSAssert1(0, @"Errore creazione compiledState '%s'", sqlite3_errmsg(database));

            }


            //while(sqlite3_step(leggiStatement) == SQLITE_ROW)
            if(SQLITE_DONE != sqlite3_step(leggiStatement))
            {




                NSString *titolo = [[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(leggiStatement, 1)];
                NSLog(@"%@",titolo);
                oggetto2.Titolo=titolo;

                NSString *descrizione = [[NSString alloc] initWithUTF8String:(char *)sqlite3_column_text(leggiStatement, 2)];
                NSLog(@"%@",descrizione);
                oggetto2.Descrizione = descrizione;

                NSString *image= [[NSString alloc]initWithUTF8String:(char *)sqlite3_column_text(leggiStatement, 0)];
                NSLog(@"%@",image);
                oggetto2.Immagine= image;



        }

        sqlite3_finalize(leggiStatement);
    }

 sqlite3_close(database);

}



@end

私の問題は、それらを webMain に配置できないことです... webMain のオブジェクトは空のままです。

シブは使いません。

4

1 に答える 1

1

alloc提供されたコード スニペットでは、とinitのを決して実行しませんoggetto2。したがって、それはnilであり、そのプロパティを設定しようとしても何も達成されません。

NSLog既存のステートメントに加えて、を実行NSLogするhtmlString直前に を実行することもお勧めloadHTMLStringします。空白の Web ビューから推測するよりも、ソースを見て HTML で何が起こっているかを確認する方が簡単だからです。


問題とは関係ありませんが、sqlite3_stmtファイナライズ後に静的を再利用する可能性のあるコードはおそらく使用しないでください。初めて呼び出すcarica_IDと、 static が初期化されますleggiStatement。しかし、あなたはやりますが、に設定しsqlite_finalizeません。このメソッドを 2 度目に呼び出した場合、再度呼び出すことはありませんが、以前の に関連付けられたリソースは解放されます。leggiStatementnilsqlite3_prepare_v2leggiStatement

いくつかの簡単な修正:

  • 静的グローバルを作成せずleggiStatement、メソッドのローカルの非静的変数にします。

  • する場合はsqlite3_finalize、必ず にも設定leggiStatementしてくださいnil。また

  • を呼び出すsqlite3_finalizeのではなく、ただ呼び出すだけsqlite3_resetです。これにより、準備されたステートメントがリセットされますが、そのリソースは解放されません。

于 2013-02-09T22:06:02.430 に答える