2010-02-02 4 views
4

저는 iPhone 개발을 처음 사용합니다. 내 데이터베이스에 특정 데이터를 삽입하고 을 검색하여 테이블에 표시하고 싶습니다. 테이블 'user'로 Database data.sqlite을 만들었습니다. 이 테이블에는 id (varchar)와 name (varchar)의 두 가지 값이 있습니다. "사용자 값 ('1', 'xxxx')에 삽입하여 테이블에 3 행의 데이터를 삽입했습니다." 터미널 창에서. "testDb"라는 탐색 기반 응용 프로그램을 만들었습니다. AppDelegate에서 나는이 두 가지 방법의 내용을 표시하려면 rootviewcontrolleriPhone의 SQLite 데이터베이스에 데이터를 입력하는 방법

-(void)initializeTableData{ 
    sqlite3 *db=[DatabaseTestAppDelegate getNewDBConnection]; 
    sqlite3_stmt *statement=nil; 
    const char *sql="select * from user"; 
    if (sqlite3_prepare_v2(db, sql, -1, &statement, NULL)!=SQLITE_OK) 
     NSAssert1(0,@"error in preparing staement",sqlite3_errmsg(db)); 
    else { 
     while(sqlite3_step(statement)==SQLITE_ROW) 
      [tableData addObject:[NSString stringWithFormat:@"%s",(char*)sqlite3_column_text(statement,1)]]; 
    } 
    sqlite3_finalize(statement); 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    tableData=[[NSMutableArray alloc]init]; 
    [self addMyObjectIntoDatabase]; 
    [self initializeTableData]; 
    [email protected]"Database test"; 
} 

에서

- (void)createEditableCopyOfDatabaseIfNeeded { 
    NSLog(@"Creating editable copy of database"); 
    // First, test for existence. 
    BOOL success; 
    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    NSError *error; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"data.sqlite"]; 
    success = [fileManager fileExistsAtPath:writableDBPath]; 
    if (success) return; 
    // The writable database does not exist, so copy the default to the appropriate location. 
    NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"data.sqlite"]; 
    success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error]; 
    if (!success) { 
     NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]); 
    } 
} 

+(sqlite3 *) getNewDBConnection{ 
    sqlite3 *newDBconnection; 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"data.sqlite"]; 
    // Open the database. The database was prepared outside the application. 
    if (sqlite3_open([path UTF8String], &newDBconnection) == SQLITE_OK) { 
     NSLog(@"Database Successfully Opened :)"); 
    } 
    else { 
     NSLog(@"Error in opening database :("); 
    } 
    return newDBconnection; 
} 

이것은 계속을 표시 제대로 작동

- (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]; 
    } 
    NSLog(@"before displaying data"); 
    cell.textLabel.text=[tableData objectAtIndex:indexPath.row]; 
    NSLog(@"after displaying data"); 
    // Configure the cell. 
    return cell; 
} 

테이블의 엔트. 하지만 이제는 테이블에 다른 행을 삽입하고 삽입 된 내용을 이전 내용과 함께 표시하려고합니다. 나는 iPhone을 처음 사용하기 때문에 자습서에서 데이터베이스를 읽고 그 내용을 표시하는 방법을 배웠습니다. 다시 삽입하고 다시 표시하는 작업을 어떻게 더 진행합니까?

+1

C API를 직접 사용하는 대신 SQLite를 처리하기 위해 래퍼를 사용하십시오. 그것은 삶을 그렇게 쉽게 만듭니다 * http://cocoaheads.byu.edu/resources/sqlite –

+0

다음은 유용한 튜토리얼입니다. [여기] (http://dblog.com.au/iphone-development-tutorials/iphone-sdk-tutorial-reading-data-from-a-sqlite-database/) 링크를 클릭하십시오. –

답변

4

당신이 아이폰 응용 프로그램에서 데이터를 관리하는 SQLite는 사용하는 방법을 학습에 정말 관심이 있다면 그것은 매우 좋은 소개입니다, 나는 다음 자습서를 완료 할 추천 :

iphone-programming-tutorial-creating-a-todo-list-using-sqlite-part-1

이 튜토리얼은 SQLite를 사용하여 iPhone 응용 프로그램에서 데이터를 선택, 업데이트, 삽입 및 삭제하는 작업을 처리합니다.

+0

감사합니다. 자습서를 살펴 보겠습니다. – Warrior

1

기본적으로 두 가지 권장 옵션이 있습니다 (C 클래스는 그 중 하나가 아닙니다). FMDB는 많은 개발자들이 Sqlite에 대한 래퍼로 사용됩니다. http://code.google.com/p/flycode/source/browse/trunk/fmdb FMDB는 가볍고 사용하기가 쉽습니다.

NSString *path = [documentsDirectory stringByAppendingPathComponent:@"mysqlite.db"];  
appSettings.dao = [FMDatabase databaseWithPath:path]; 
FMResultSet *rs = [[appSettings dao] executeUpdate:@"SELECT * FROM mytable"]; 
while ([rs next]){ 
    // do stuff ... 
} 

이 AppDelegate에의하는 .m 파일 내부에 오전 ApplicationSettings 인스턴스를 가정 여기

는 예를 호출합니다.

ApplicationSettings *appSettings = [ApplicationSettings sharedApplicationSettings]; 

삽입 너무 쉽게 :

sql = [NSString stringWithFormat:@"INSERT INTO table (intCol1, strCol2) VALUES ('%d','%@')", myObj.theNumber, myObj.theString]; 
[appSettings.dao executeUpdate:sql]; 

다른 옵션 (SDK 3.0으로 사용할 수) 코어 데이터를 사용하는 것입니다. 핵심 데이터는 비표준 작업을 제한하지 만 매우 빠르고 최적화 된 데이터입니다. 사용법을 신중하게 고려하지 않으면 느린 SQL 쿼리가 발생할 수 있습니다.

특정 값을 가진 사용자를 삽입하려면 아이폰 개발자 센터 here

1

에 대한 자습서가, 당신은 같은 SQL 삽입 문을 작성해야합니다.

dbName = @"db.sqlite"; 
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDir = [documentPaths objectAtIndex:0]; 
dbPath = [documentsDir stringByAppendingPathComponent:dbName]; 
BOOL success; 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
success = [fileManager fileExistsAtPath:dbPath]; 
if(success) return; 
NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:dbName]; 
[fileManager copyItemAtPath:databasePathFromApp toPath:dbPath error:nil]; 

과 : 확인하시기 바랍니다 http://www.apptite.be/tutorial_ios_sqlite.php

1

:

NSString *insertStatement = [NSString stringWithFormat:@"INSERT INTO USER (FIRSTNAME, LASTNAME) VALUES (\"%@\", \"%@\")", user.firstName, user.lastName]; 

char *error; 
if (sqlite3_exec(databaseHandle, [insertStatement UTF8String], NULL, NULL, &error) == SQLITE_OK) 

당신은에서 전체 예제를 확인하실 수 있습니다 : 사용자 객체가 이름과 성을 가지고 말할 수 것은 다음과 같을 것이다

sqlite3 *database ; 
[app checkAndCreateDatabase]; 
// Open the database from the users filessytem 
if(sqlite3_open([app.dbPath UTF8String], &database) == SQLITE_OK) 
{ 
    sqlite3_stmt *compiledStatement1; 
    NSString* query; 

    query=[NSString stringWithFormat:@ " insert into test (name , company , phone , email , address , country , state , city, zip , online_id , in_time , flag_delete, flag_update,type_id) values (?, ?, ?,?,?, ?, ?, ?, ?,?,?,? ,?,?)"]; 



    const char *compiledStatement = [query UTF8String]; 
    if(sqlite3_prepare_v2(database, compiledStatement, -1, &compiledStatement1, NULL) == SQLITE_OK) 
    { 
     sqlite3_bind_text(compiledStatement1, 1, [text UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(compiledStatement1, 2, [text UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(compiledStatement1, 3, [text UTF8String], -1, SQLITE_TRANSIENT); 
} 
    // Loop through the results and add them to the feeds array 
     if(SQLITE_DONE != sqlite3_step(compiledStatement1)) 
     NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database)); 
    sqlite3_finalize(compiledStatement1); 
    sqlite3_close(database); 
    } 
관련 문제