【问题标题】:How to create sqlite database programmatically?如何以编程方式创建 sqlite 数据库?
【发布时间】:2023-11-15 08:06:01
【问题描述】:

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

【问题讨论】:

  • 我建议你在谷歌搜索。 Stack-overflow 不应该是你的搜索引擎。由于您是堆栈溢出的新手,所以我没有标记否决票。
  • 请阅读FAQsfirst

标签: iphone sqlite


【解决方案1】:

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

【讨论】:

  • dbpath == databasePath? contactDB 声明在哪里?
【解决方案2】:
#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/

【讨论】:

    【解决方案3】:

    在 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);
    
    }
    

    【讨论】:

      【解决方案4】:

      如果您想使用 Database for Data Persistance,请查看 CoreData,它是为应用存储大量数据的好资源,但请记住,CoreData 不是数据库。

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

      如果您存储的数据量较小,请考虑将信息存储到 plist 中。

      如果你要存储一些字符串、整数或布尔值,你应该使用 NSUserDefaults

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

      其他资源:

      1. CoreData Tutorial
      2. Data Management

      【讨论】:

        【解决方案5】:

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

        首先,您应该下载 mozilla fire fox 并下载其附加组件,您可以通过单击工具选项找到 sqlite 数据库选项。您可以创建一个包含列和行的新数据库文件。创建数据库文件的过程很简单,之后您可以将该文件包含到您的 X 代码项目中。

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

        之后编写以下代码对我来说很好:)

        在你的 . 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];
        
        }
        

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

        【讨论】:

          【解决方案6】:

          在 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

          【讨论】:

            【解决方案7】:

            在内存警告后调用此函数。

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

            }

            【讨论】:

              最近更新 更多