Как добавить базу данных и Nsxmlparser в приложение? - PullRequest
0 голосов
/ 01 апреля 2011

Я хочу получить данные из веб-службы и отобразить их в базе данных.

Ответы [ 6 ]

0 голосов
/ 05 апреля 2011

Я хотел бы опубликовать свои классы базы данных, которые я использовал во время разработки:

-(void)check_Create_DB
{
    NSArray *docPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

    NSString *docDir=[docPaths objectAtIndex:0];


    dbPath=[docDir stringByAppendingPathComponent:databaseName];

    BOOL success;

    NSFileManager *fm=[NSFileManager defaultManager];

    success=[fm fileExistsAtPath:dbPath];

    if(success) return;

    NSString *dbPathFromApp=[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];
    [fm copyItemAtPath:dbPathFromApp toPath:dbPath error:nil];

    [fm release];

}

-(void)saveData;

{

sqlite3 *database;

    [self check_Create_DB];

    if(sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK)
    {
        NSString *sqlTmp=[NSString stringWithFormat:@"insert into  AddEmployeeDetails values(NULL,'%@', '%@','%@', '%@', '%@', '%@', '%@', '%@','%@','%@','%@')",[txtempname text],[txtadd text],[txtcountry text],[txtstate text],[txtcity text],[txtcontactno text],[txtqualification text],[txtshift text],[txtposition text],[txtjoindate text],[txtsalary text]];

        const char *sqlStmt=[sqlTmp UTF8String];

        sqlite3_stmt *cmp_sqlStmt;

        int returnValue = sqlite3_prepare_v2(database, sqlStmt, -1, &cmp_sqlStmt, NULL);

        //((returnValue==SQLITE_OK) ?  NSLog(@"Success") :  NSLog(@"UnSuccess") );
        if (returnValue==SQLITE_OK) {
            temp=2;
            NSLog(@"Success");
        }
        else {
            temp=1;
            NSLog(@"Unsuccess");
        }

        sqlite3_step(cmp_sqlStmt);
        sqlite3_finalize(cmp_sqlStmt);
    }

    sqlite3_close(database);    
}

-(void)getDataFromTb  
{

[self checkAndCreateDatabase];

sqlite3 *database;

mainDataArray=[[NSMutableArray alloc] init];

if (sqlite3_open([databasePath UTF8String], &database)==SQLITE_OK) 

{

NSString *sql=[NSString stringWithFormat:@"select * from AlarmTbl"];

const char *sqlStatement = [sql UTF8String];

sqlite3_stmt *compiledStatement;

if (sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL)==SQLITE_OK) 

{

while(sqlite3_step(compiledStatement) == SQLITE_ROW) {

NSMutableDictionary *item=[[NSMutableDictionary alloc] init];

[item setObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)] forKey:@"Id"];
char *ttl=(char *)sqlite3_column_text(compiledStatement, 1);

if (ttl==NULL) {

[item setObject:@"" forKey:@"title"];

}

else {

[item setObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)] forKey:@"title"];

}

char *dttim=(char *)sqlite3_column_text(compiledStatement, 2);

if (dttim==NULL) {

[item setObject:@"" forKey:@"datetime"];

}
else {

[item setObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)] forKey:@"datetime"];

}

char *enbl=(char *)sqlite3_column_text(compiledStatement, 3);

if (enbl==NULL) {

[item setObject:@"" forKey:@"enabled"];

}
else {

[item setObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)] forKey:@"enabled"];

}

[mainDataArray addObject:item];

}

}

sqlite3_finalize(compiledStatement);

}

sqlite3_close(database);

}
0 голосов
/ 04 апреля 2011

Мыльное сообщение должно быть таким:

NSString *soapMsg=[NSString stringWithFormat:@""
<"?xml version=\"1.0\" encoding=\"utf-8\"?>"];
0 голосов
/ 01 апреля 2011

Хорошо, я собираюсь предоставить вам пример кода, который я использовал в моем проекте .. реализация файла .h

import <"UIKit/UIKit.h>
import <"sqlite3.h>

@interface RootViewController : UIViewController<"UITableViewDelegate,UITableViewDataSource,NSXMLParserDelegate> 

{

IBOutlet UITableView *listtbl;
    NSString *databaseName;
    NSString *dbPath;
    NSString *id1;
    NSMutableArray *mainarray,*temparray;
    NSMutableDictionary *tempdic;

    NSMutableData *myWebData;
    NSXMLParser *myXMLParser;
    NSString *tempStr;

}
-(void)readdata;
-(void)checkdata;
-(void)savedata;
@end


.m file

import "RootViewController.h"


@implementation RootViewController




- (void)viewDidLoad
{
    [super viewDidLoad];
   databaseName=@"db1.sqlite3";
    temparray=[[NSMutableArray alloc]init];


    sqlite3 *database;

    [self checkdata];

    if(sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK)

    {
        NSString *str=[NSString stringWithFormat:@"delete from tbl"];

        const char *sqlStmt=[str UTF8String];

        sqlite3_stmt *cmp_sqlStmt;

        if(sqlite3_prepare_v2(database, sqlStmt, -1, &cmp_sqlStmt, NULL)==SQLITE_OK)
        {
            int returnValue = sqlite3_prepare_v2(database, sqlStmt, -1, &cmp_sqlStmt, NULL);
            ((returnValue==SQLITE_OK) ?  NSLog(@"Success") :  NSLog(@"UnSuccess") );
            sqlite3_step(cmp_sqlStmt);
        }
        sqlite3_finalize(cmp_sqlStmt);
    }

    sqlite3_close(database);



    NSString *soapMsg=[NSString stringWithFormat:@"<?xml version=\"1.0\"?><myXML>\n"
                       "<function>logincheck</function>\n"
                       "<values></values>\n"
                       "</myXML>"];

    NSURL *myurl=[NSURL URLWithString:@"http://demo/webservice/category_check.php"];


    NSMutableURLRequest *connectionReq=[NSMutableURLRequest requestWithURL:myurl];

    //<?xml version="1.0" encoding="utf-8"?>

    [connectionReq addValue:@"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];

    //[connectionReq addValue:@"http://www.webservicex.net/GetWeatherByZipCode" forHTTPHeaderField:@"SOAPAction"];

    [connectionReq setHTTPBody: [soapMsg dataUsingEncoding:NSUTF8StringEncoding]];

    [connectionReq addValue:[NSString stringWithFormat:@"%i",[soapMsg length]] forHTTPHeaderField:@"Content-Length"];

    [connectionReq setHTTPMethod:@"POST"];



    NSURLConnection *myConnection=[[NSURLConnection alloc] initWithRequest:connectionReq delegate:self];


    if (myConnection) {

        myWebData=[[NSMutableData alloc]initWithLength:0];
        mainarray=[[NSMutableArray alloc]init];


    }


    [super viewDidLoad];

}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error

{
    NSLog(@"connection error");
}


-(void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response

{

    [myWebData setLength:0];

}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data

{ 
    [myWebData appendData:data];

}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{

    NSLog(@"%@",[myWebData description]);

    NSString *str1=[[NSString alloc] initWithBytes:[myWebData bytes] length:[myWebData length] encoding:NSStringEncodingConversionAllowLossy];

    NSLog(@"%@",str1);

    [str1 release];


    if(myXMLParser!=nil && [myXMLParser retainCount]>0)

    {   
        myXMLParser.delegate=nil; 

        [myXMLParser release]; 

        myXMLParser=nil; 

    }
    myXMLParser=[[NSXMLParser alloc] initWithData:myWebData];

    myXMLParser.delegate=self;

    [myXMLParser parse];

}

-(void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qualifiedName attributes:(NSDictionary *)attributeDict

{
    if ([elementName isEqualToString:@"ArrayOfconsumer"]) {

    }
    if ([elementName isEqualToString:@"data"]) {

        tempdic=[[NSMutableDictionary alloc]init];
    }


} 

-(void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string

{
    if(tempStr!=nil && [tempStr retainCount]>0)

    {  
        [tempStr release]; tempStr=nil;

    }

    tempStr=[[NSString alloc] initWithString:string];

}


-(void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName

{

    if ([elementName isEqualToString:@"data"]) {
        [mainarray addObject:tempdic];
        [tempdic release];
    }

    if ([elementName isEqualToString:@"catid"]) {
        [tempdic setObject:tempStr forKey:elementName];
    }

    if ([elementName isEqualToString:@"cat_name"]) {
        [tempdic setObject:tempStr forKey:elementName];
    }

    if ([elementName isEqualToString:@"image"]) {

        [tempdic setObject:tempStr forKey:elementName];
    }

    if ([elementName isEqualToString:@"has_subcategory"]) {

        [tempdic setObject:tempStr forKey:elementName];
    }



}   

- (void)parserDidEndDocument:(NSXMLParser *)parser

{
    NSLog(@"mainarray=====%@",[mainarray description]);

    [self savedata];

    [self readdata];

    [listtbl reloadData];

    //[progressAlert dismiss];
} 

-(void)checkdata
{

    NSArray *docPaths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);

    NSString *docDir=[docPaths objectAtIndex:0];

    dbPath=[docDir stringByAppendingPathComponent:databaseName];

    BOOL success;

    NSFileManager *fm=[NSFileManager defaultManager];

    success=[fm fileExistsAtPath:dbPath];

    if(success) return;

    NSString *dbPathFromApp=[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];

    [fm copyItemAtPath:dbPathFromApp toPath:dbPath error:nil];

    [fm release];


}

-(void)savedata

{
    sqlite3 *database;

    [self checkdata];

    if(sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK)
    {
        NSString *sqlTmp=[NSString stringWithFormat:@"insert into tbl values(NULL,'%@','%@')",[[mainarray objectAtIndex:0]valueForKey:@"catid"],[[mainarray objectAtIndex:0]valueForKey:@"image"]];

        const char *sqlStmt=[sqlTmp UTF8String];

        sqlite3_stmt *cmp_sqlStmt;

        int returnValue = sqlite3_prepare_v2(database, sqlStmt, -1, &cmp_sqlStmt, NULL);

        ((returnValue==SQLITE_OK) ?  NSLog(@"Success") :  NSLog(@"UnSuccess") );


        sqlite3_step(cmp_sqlStmt);

        sqlite3_finalize(cmp_sqlStmt);

    }

    sqlite3_close(database);



}

-(void)readdata

{
    [self checkdata];

    sqlite3 *database;



    if(sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK)

    {
        NSString *sql=[NSString stringWithFormat:@"select * from tbl"];

        const char *sqlStmt=[sql UTF8String];

        sqlite3_stmt *cmp_sqlStmt; 

        if(sqlite3_prepare_v2(database, sqlStmt, -1, &cmp_sqlStmt, NULL)==SQLITE_OK)

        {
            while(sqlite3_step(cmp_sqlStmt)==SQLITE_ROW)
            {
                id1=[NSString stringWithUTF8String:(char*)sqlite3_column_text(cmp_sqlStmt, 2)];

                //newStu=[[student alloc]initWithNo:id1];

                [temparray addObject:id1];

                //[newStu release];


            }
        }

        sqlite3_finalize(cmp_sqlStmt);

    }

    sqlite3_close(database);
}



// Customize the number of sections in the table view.
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return [temparray count];

}


// Customize the appearance of table view cells.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    cell.textLabel.text=[temparray objectAtIndex:indexPath.row];
    // Configure the cell.


    return cell;

}








- (void)dealloc {
    [super dealloc];
}


@end
0 голосов
/ 01 апреля 2011

Я согласен с Vijay. После выполнения действий, указанных Vijay, вы должны использовать основные понятия данных, в том числе NSManagedObjectContext и многие другие. NSManagedObjectContext ведет себя как просто блокнот, вы должны добавить сущности и их атрибуты в файл XCDataModel После этого вы должны нажать на новый файл, и XCode автоматически создаст два файла с расширением .h и .m вашего имени сущности. Теперь вы можете передавать данные, получаемые при разборе XMl, в атрибуты сущности и одну самую важную вещь. не забудьте сохранить его. А теперь, если вы хотите увидеть, что у вас есть в базе данных, вы можете использовать Sqlite browser. В sqlite browser вы можете импортировать sqlite файл, который будет создан при запуске вашего приложения.

Я думаю, что после некоторого изучения вы сможете это сделать, если вы обнаружите какую-либо проблему, я смогу предоставить вам простой пример кода основных данных. Спасибо.

0 голосов
/ 01 апреля 2011

Чтобы узнать, как получить данные из веб-службы, и NSXMLParser, пожалуйста, найдите Парсинг XML-файлов , чтобы узнать, как извлечь данные через XML и отобразить их или использовать эти данные в дальнейшем. И когда вы получите эти данные, вы можете очень легко сохранить эти данные в базе данных, но это зависит от вас, какую базу данных вы используете. Ну у вас есть два варианта:

  1. SQLite

  2. Основные данные (лучшие) относятся к Apple coreDataBooks

0 голосов
/ 01 апреля 2011

Для получения данных из webservice сначала необходимо установить соединение, используя asiHttp делегат соединения с webservice, используя делегат соединения.И когда соединение устанавливается и данные поступают, вам нужно проанализировать эти данные, используя nsxmlparserDelegate, а затем вы можете сохранить эти данные в базе данных.

-(void) request:(XMLRPCRequest *)request didReceiveResponse:(XMLRPCResponse *)response{  }
-(void) request:(XMLRPCRequest *)request didFailWithError:(NSError *)error{  }

Для анализа есть три метода делегата:

1. didstartelement 
2. didendelement  
3. found character

Пройдите через это, и вы получите свое решение.

...