Как вставить данные в базу данных SQLite в iPhone - PullRequest
4 голосов
/ 02 февраля 2010

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

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

В контроллере rootview

-(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];
    self.title=@"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, я научился из учебников читать базу данных и отображать ее содержимое. Как мне перейти к моей задаче вставки и отображения снова?

Ответы [ 4 ]

4 голосов
/ 02 февраля 2010

Если вы действительно хотите узнать, как использовать SQLite для управления данными в приложении для iPhone, я бы порекомендовал вам пройти следующий урок, так как это очень хорошее введение:

iphone программирования обучающая создающей-а-TODO-лист, использующих-SQLite-часть-1

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

1 голос
/ 10 сентября 2014

проверьте:

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);
   }
1 голос
/ 13 февраля 2012

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

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 голос
/ 03 февраля 2010

У вас есть два рекомендуемых варианта (и использование класса 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 внутри вашего файла AppDelegate .m.

ApplicationSettings *appSettings = [ApplicationSettings sharedApplicationSettings];

Вставки тоже просты:

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

Другим вариантом является использование Core Data (доступно с SDK 3.0). Базовые данные должны быть достаточно быстрыми и оптимизированными, хотя они ограничивают вас от выполнения нестандартных задач. Хотя это может привести к более медленным запросам SQL, если вы не уделите должного внимания тому, как вы его используете.

Там есть учебник по iPhone Dev Center здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...