使用 .sql 文件和 FMDB 创建数据库结构

Posted

技术标签:

【中文标题】使用 .sql 文件和 FMDB 创建数据库结构【英文标题】:create database structure using .sql file and FMDB 【发布时间】:2013-09-09 07:03:53 【问题描述】:

我有一个从 MySQL 导出的 .sql 文件。我正在尝试使用 FMDB framework 将该表结构添加到 SQLite 中,但它没有被执行并且总是 return false。这是结构:

CREATE TABLE IF NOT EXISTS `admin` (
`admin_id` tinyint(4) NOT NULL AUTO_INCREMENT,
`first_name` varchar(30) NOT NULL,
`last_name` varchar(30) NOT NULL,
`email` varchar(30) NOT NULL,
`password` varchar(30) NOT NULL,
`date` datetime DEFAULT NULL,
`status` tinyint(2) NOT NULL,
PRIMARY KEY (`admin_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1;

我在这里做错了什么?

【问题讨论】:

你可能需要一些工具。试试sqlitemanager.org 【参考方案1】:

该 SQL 不符合 SQLite 的 CREATE TABLE 语法 documented online。如果您查看 FMDB lastErrorMessage 方法(类似于 sqlite3_errmsg),它将报告有关错误的详细信息。

值得注意的是,AUTO_INCREMENT 语法不正确。即使您解决了这个问题,ENGINEDEFAULT CHARSET 选项也不会被识别。至少,您必须尝试以下方法:

NSString *sql = @"CREATE TABLE IF NOT EXISTS `admin` ("
                "`admin_id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,"
                "`first_name` varchar(30) NOT NULL,"
                "`last_name` varchar(30) NOT NULL,"
                "`email` varchar(30) NOT NULL,"
                "`password` varchar(30) NOT NULL,"
                "`date` datetime DEFAULT NULL,"
                "`status` tinyint(2) NOT NULL"
                ")";

或者,鉴于 SQLite 无法理解其中一些数据类型(尽管使用 SQLite 的“动态类型系统”,这并不重要),您可能希望将 varchar(30) 替换为 TEXT 和 @987654334 @ 与 INTEGERdatetime 与您计划存储日期的任何格式。请参阅Data Types 讨论。

【讨论】:

【参考方案2】:

您正在尝试在另一个数据库中使用 mysql 扩展。

您至少应该将admin_id 类型替换为INTEGER,将AUTO_INCREMENT 替换为AUTOINCREMENT,并删除ENGINEDEFAULT CHARSET 设置。

【讨论】:

【参考方案3】:

(IBAction)findContact:(UIButton *)sender

const char *dbPath = [databasePath UTF8String]; sqlite3_stmt *语句;

if (sqlite3_open(dbPath, &contactDB)== SQLITE_OK) NSString *querySQL = [NSString stringWithFormat:@"SELECT ADDRESS,PHONE FROM FROM CONTACTS WHERE NAME = \"%@\"",_name.text]; const char *query_stmt = [querySQL UTF8String]; if(sqlite3_prepare_v2(contactDB, query_stmt, -1, &statement, NULL)== SQLITE_OK)

    if (sqlite3_step(statement)== SQLITE_ROW) 

        NSString *addressField = [[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)];
        _address.text = addressField;
        NSString *phoneField = [[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 1)];
        _phoneNo.text = phoneField;
        _status.text = @"Match Found";
    else
        _status.text = @"Match not found";
        _address.text = @"";
        _phoneNo.text = @"";
    
    sqlite3_finalize(statement);

sqlite3_close(contactDB);

【讨论】:

以上是关于使用 .sql 文件和 FMDB 创建数据库结构的主要内容,如果未能解决你的问题,请参考以下文章

FMDB 使用方法

FMDB:错误 14,无法打开数据库文件

FMDB 使用方法简介

FMDB中常用SQL使用

FMDB使用Cached Statement功能

FMDB 的基本操作