如何以编程方式创建sqlite数据库?

时间:2012-05-11 04:37:25

标签: iphone sqlite

我是iPhone开发的新手。我使用mac os x中的终端创建了数据库。现在我尝试使用objective- C在iPhone应用程序中以编程方式创建数据库。有人可以告诉我一个很好的网站,我可以查看有效的示例应用程序,是否有任何学习本教程的网站?请有人帮助我。

7 个答案:

答案 0 :(得分:14)

来自a tutorial on Techtopia

NSString *docsDir;
NSArray *dirPaths;

// Get the documents directory
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex:0];

// Build the path to the database file
databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: @"contacts.db"]];

NSFileManager *filemgr = [NSFileManager defaultManager];

if ([filemgr fileExistsAtPath: databasePath ] == NO) {
    const char *dbpath = [databasePath UTF8String];

    if (sqlite3_open(dbpath, &contactDB) == SQLITE_OK) {
        char *errMsg;
        const char *sql_stmt = "CREATE TABLE IF NOT EXISTS CONTACTS (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, ADDRESS TEXT, PHONE TEXT)";

        if (sqlite3_exec(contactDB, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK) {
            status.text = @"Failed to create table";
        }
        sqlite3_close(contactDB);
    }
    else {
        status.text = @"Failed to open/create database";
    }
}
[filemgr release];

答案 1 :(得分:3)

#pragma mark - SQLite

-(void)createDatabase
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0];

    databasePath = [[NSString alloc]initWithString:[documentsDirectory stringByAppendingPathComponent:@"timings.db"]];

    if ([[NSFileManager defaultManager] fileExistsAtPath:databasePath] == FALSE)
    {
        if (sqlite3_open([databasePath UTF8String], &timingsDatabase) == SQLITE_OK)
        {
            const char *sqlStatement = "CREATE TABLE IF NOT EXISTS TIMINGS (ID INTEGER PRIMARY KEY AUTOINCREMENT, TIMESTAMP TEXT, TIMING TEXT)";
            char *error;
            sqlite3_exec(timingsDatabase, sqlStatement, NULL, NULL, &error);
            sqlite3_close(timingsDatabase);
        }
    }
}

-(void)storeTiming
{
    if (sqlite3_open([databasePath UTF8String], &timingsDatabase) == SQLITE_OK)
    {
        NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
        [dateFormatter setDateFormat:@"HH:mm:ss.SSS"];

        NSString *insertStatement = [NSString stringWithFormat:@"INSERT INTO TIMINGS (TIMESTAMP, TIMING) VALUES (\"%@\", \"%@\")", [dateFormatter stringFromDate:startDate], stopWatchLabel.text];

        char *error;
        sqlite3_exec(timingsDatabase, [insertStatement UTF8String], NULL, NULL, &error);
        sqlite3_close(timingsDatabase);

        [dateFormatter release];
    }
}

-(void)getTimings
{
    if (sqlite3_open([databasePath UTF8String], &timingsDatabase) == SQLITE_OK)
    {
        NSString *queryStatement = [NSString stringWithFormat:@"SELECT TIMESTAMP, TIMING FROM TIMINGS"];

        sqlite3_stmt *statement;
        if (sqlite3_prepare_v2(timingsDatabase, [queryStatement UTF8String], -1, &statement, NULL) == SQLITE_OK)
        {
            while (sqlite3_step(statement) == SQLITE_ROW) {
                NSLog(@"Timestamp: %s Timing: %s", sqlite3_column_text(statement, 0), sqlite3_column_text(statement, 1));
            }
            sqlite3_finalize(statement);
            sqlite3_close(timingsDatabase);
        }  
    }
}

检查以下示例:

  1. http://www.techotopia.com/index.php/An_Example_SQLite_based_iOS_4_iPhone_Application
  2. http://www.icodeblog.com/2008/09/22/iphone-programming-tutorial-creating-a-todo-list-using-sqlite-part-4/

答案 2 :(得分:2)

在xcode中创建Sqlite数据库

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.

    [self createDb];

    return YES;
}


-(void)createDb
{
    NSArray *dir=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *dbPath=[NSString stringWithFormat:@"%@/userDb.sqlite",[dir lastObject]];

    sqlite3 *db;

    NSFileManager *fm=[NSFileManager new];

    if([fm fileExistsAtPath:dbPath isDirectory:nil])
    {
        NSLog(@"Database already exists..");
        return;
    }

    if (sqlite3_open([dbPath UTF8String],&db)==SQLITE_OK)
    {
        const char *query="create table user (userName VARCHAR(20),userAdd VARCHAR(20), userPass VARCHAR(20))";

        if (sqlite3_exec(db, query, NULL, NULL, NULL)==SQLITE_OK)
        {
            NSLog(@"User table created successfully..");
        }else
        {
            NSLog(@"User table creation failed..");
        }

    }else
    {
        NSLog(@"Open table failed..");
    }
    sqlite3_close(db);

}

答案 3 :(得分:1)

如果你想使用数据库数据持久性查看CoreData它是一个很好的资源,用于存储应用程序的大量数据,请记住,虽然CoreData不是数据库。

您可以在iOS平台上轻松使用SQLite,但是您没有像使用CoreData那样提供可视化工具来开发它

如果要存储少量数据,请将信息存储到plist中。

如果要存储一些字符串,整数或bool,则应使用NSUserDefaults

如果没有更多信息,我无法确定哪种方法最适合您

其他资源:

  1. CoreData Tutorial
  2. Data Management

答案 4 :(得分:1)

要为您的iPhone应用程序创建数据库有点冗长,但它有很多步骤,但它很简单:

首先,你应该下载mozilla fire fox并下载它的附加组件,你可以通过单击Tools Option找到sqlite数据库选项。您可以创建包含列和行的新Databse文件。创建数据库文件的过程非常简单,之后您可以将该文件包含在X代码项目中。

例如: - 就像您通常包含在Xcode项目中的图像一样。 / p>

之后写下面的代码对我来说很好用:))

在你的。 m文件写下面的sqlite代码

#import "YourHeaderFile"

static sqlite3 *database = nil;
static sqlite3_stmt *addStmt = nil;
static sqlite3_stmt *updateStmt = nil;


@implementation 'YourImplementClass'



- (NSString *) getDBPath {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];
    return [documentsDir stringByAppendingPathComponent:@"YourDataBaseFileName.sqlite"];
}

- (void) insertValueToDatabase {

    NSString *dbPath =[self getDBPath];

    NSString *select_Meal = dummy_select_Meal;
    NSString *dateTime = dummy_date_Time;
    NSString *location = dummy_location;
    NSString *mealItem = dummy_mealItem;

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

        const char *sqlDB = "Insert into iHad(Mealtype,DateAndTime,Location,Mealitem) VALUES (?,?,?,?)";

        if(sqlite3_prepare_v2(database, sqlDB, -1, &addStmt, NULL) != SQLITE_OK)
            NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));

        sqlite3_bind_text(addStmt, 1, [select_Meal UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(addStmt, 2, [dateTime UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(addStmt, 3, [location UTF8String], -1, SQLITE_TRANSIENT);
        sqlite3_bind_text(addStmt, 4, [mealItem UTF8String], -1, SQLITE_TRANSIENT);

        if(SQLITE_DONE != sqlite3_step(addStmt))
            NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));
        //else
            //SQLite provides a method to get the last primary key inserted by using sqlite3_last_insert_rowid
            //coffeeID = sqlite3_last_insert_rowid(database);

        //Reset the add statement.
        sqlite3_reset(addStmt);

    }
    else
        sqlite3_close(database); 

}

对于保存,你可以创建一个这样的方法

-(void)saveButtonClick
{

    if (![dummy_select_Meal length] || ![dummy_mealItem length])
    {
        UIAlertView *alert = [[UIAlertView alloc] init];
        [alert setTitle:@"Select Meal Type/Meal Item"];
        [alert setDelegate:self];
        [alert addButtonWithTitle:@"Ok"];
        [alert show];
        [alert release];
    }

    else
    {
        indicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(30,30,50,50)];
        indicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray;//UIActivityIndicatorViewStyleWhiteLarge;//

        [self insertValueToDatabase];-----------------------> To insert data into data base

        iHadAppDelegate *delegate = [[UIApplication sharedApplication]delegate];
        [delegate readMealsFromDatabase];

        [rootController reloadTable_SaveButton];

    }
    [rootController showTablePopupAction:nil];

}

如果您有任何问题,请回复我,我会帮助您:)

答案 5 :(得分:0)

在didFinishLaunchingWithOptions:

调用此函数
  -(void)createdb
  {
       NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,      NSUserDomainMask, YES);
       NSString *documentsDirectory = [paths objectAtIndex:0];
       NSString *dbPath = [documentsDirectory stringByAppendingPathComponent:@"emp.sqlite"];

       NSURL *dbURL = [NSURL fileURLWithPath:dbPath];

       // copy a database from the bundle if not present
       // on disk
       NSFileManager *fm = [NSFileManager defaultManager];
       if (![fm fileExistsAtPath:dbPath])
       {
             NSURL *bundlePath = [[NSBundle mainBundle] URLForResource:@"emp" withExtension:@"sqlite"];
             NSError *error = nil;
            if (!bundlePath || ![fm copyItemAtURL:bundlePath toURL:dbURL error:&error])                         
            {
               NSLog(@"error copying database from bundle: %@", error);
            }
       }
       else
       {
             NSLog(@"Success in Copy file");
       }
  }

Click here to Download Full Example

答案 6 :(得分:0)

在记忆警告后调用此功能。

- (IBAction)saveData:(UIButton *)sender {

sqlite3_stmt *statement;
const char *dbPath = [databasePath UTF8String];

if(sqlite3_open(dbPath, &contactDB)== SQLITE_OK){

    NSString *insertSQL = [NSString stringWithFormat:@"INSERT INTO CONTACTS(NAME,ADDRESS,PHONE)VALUES(\"%@\",\"%@\",\"%@\")",_name.text,_address.text,_phoneNo.text];

    const char *insert_stmt = [insertSQL UTF8String];
    sqlite3_prepare_v2(contactDB, insert_stmt, -1, &statement, NULL);
    if (sqlite3_step(statement)== SQLITE_DONE) {
        _status.text = @"Contact added";
        _name.text = @"";
        _address.text  = @"";
        _phoneNo.text = @"";
    }else{
        _status.text = @"Failed to add contact";
    }
    sqlite3_finalize(statement);
    sqlite3_close(contactDB);

}

}