2010-02-02 4 views
4

Я новичок в разработке iPhone. Я хочу вставить определенные данные в свою базу данных и получить ее и отобразить ее в таблице. Я создал Database data.sqlite с таблицей «пользователь». Таблица имеет два значения: id (varchar) и имя (varchar). Я вставил 3 строки данных в таблицу через «insert into user value» («1», «xxxx»); в окне терминала. Я создал навигационную аппликацию под названием «testDb». В AppDelegate У меня есть два методаКак вставить данные в базу данных SQLite в iPhone

- (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; 
} 

В RootViewController

-(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"; 
} 

Чтобы отобразить содержимое

- (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

Используйте обертку для работы с SQLite вместо прямого использования API C. Это делает жизнь * настолько * намного проще ... 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, я бы порекомендовал вам завершить следующий урок, так как это очень хорошее введение:

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

Учебное пособие обрабатывает выбор, обновление, вставку и удаление данных в приложении iPhone с использованием SQLite.

+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 ... 
} 

Это предполагает экземпляр утра ApplicationSettings в файле .m AppDelegate.

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). Core Data должен быть довольно быстрым и оптимизированным, хотя он лишает вас возможности выполнять нестандартные материалы. Хотя это может привести к медленным SQL-запросам, если вы не уделите должное внимание тому, как вы его используете.

Там в учебник по iPhone Dev Center here

1

Для вставки пользователя с определенными значениями, то необходимо создать оператор SQL вставки, как.Допустим, объект пользователя имеет имя и фамилию, то это будет выглядеть так:

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) 

Вы можете проверить полный пример на: http://www.apptite.be/tutorial_ios_sqlite.php

1

пожалуйста, проверьте:

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]; 

и

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); 
    } 
Смежные вопросы