0

我正在尝试将我称为 Login.sql 的 sqlite3 数据库文件连接到我正在编写的 iphone 应用程序。Xcode 似乎没有重新识别该文件,即使我尝试将其放入多个位置,包括 Documents 文件夹、包含 xcode 项目的文件夹以及该项目的 Dervived Data。以下代码位于 didFinishLaunchingWithOptions 下的 AppDelegate 文件中(它曾经在 View Controller 中,但我认为它可以工作而移动它。

这是代码: NSString *docsDir;

NSArray *dirPaths;

// databaseName = [[NSBundle mainBundle] pathForResource:@"DBLogin.sql" ofType:@"db"];

databaseName= @"Login.sql";

// Get the documents directory

dirPaths = NSSearchPathForDirectoriesInDomains(

                                               NSDocumentDirectory, NSUserDomainMask, YES);



docsDir = [dirPaths objectAtIndex:0];


NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *documentsDir = [documentPaths objectAtIndex:0];

databasePath = [documentsDir stringByAppendingPathComponent:databaseName];



// Build the path to the database file

//databasePath = [[NSString alloc]                     initWithString: [docsDir stringByAppendingPathComponent:                                     @"DBLogin.sql"]];



NSFileManager *filemgr = [NSFileManager defaultManager];



if ([filemgr fileExistsAtPath: databasePath ] == NO)

{


    const char *dbpath = [databasePath UTF8String];





    if (sqlite3_open(dbpath, &database) == SQLITE_OK)

    {

        NSLog(@"DATABASE LOADED");

        char *errMsg;

        const char *sql_stmt = "CREATE TABLE IF NOT EXISTS User (id varchar(20) PRIMARY KEY , password varchar(20))";



        if (sqlite3_exec(database, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK)

        {

            status.text = @"Failed to create table";

        }



        status.text = @"Database Connected";



        sqlite3_close(database);



    } else {

        status.text = @"Failed to open/create database";

    }

}

else{

    NSLog(@"Connect!");

}




return YES;

访问数据库文件的代码在这里:Xcode login screen sqlite3 database authentication issue我只是将它包括在内,以防此代码可能导致问题。

基本上每次我在这段代码中放置一个新数据库以查看这是否是问题时,我认为代码会创建一个新的临时 sql 数据库文件,其中包含在表中创建的表不存在函数。我不知道该怎么办,这让我发疯。如果有人对如何让此代码识别我的数据库有任何想法,我们将不胜感激。我已经将数据库链接到复制捆绑资源构建页面,但它仍然无法访问它。

如果您需要任何其他信息,请告诉我。

提前致谢!

4

2 回答 2

3

我会给你我访问sqlite3数据库的步骤。

1.首先我创建一个带有所需表的空白sqlite数据库(使用firefox sqlite manager add-on或任何其他方便的方法)。并将其添加到我的项目中。

2.获取数据库文件的路径。

BOOL success;

NSArray*dirPath;
NSString*docDir;
NSString*databasePath;
NSString*databaseName=@"yourDB.sqlite";

//path for database
dirPath=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docDir=[dirPath objectAtIndex:0];
databasePath=[docDir stringByAppendingPathComponent:databaseName];

3.用于NSFileManager检查它是否已经存在于DocumentDirectory. 如果它不存在(在第一次运行中),请将其替换为保存在包中的数据库(从第一步开始)。

//check if present
NSFileManager*fm=[NSFileManager defaultManager];
success=[fm fileExistsAtPath:databasePath];

if(success)
{
   NSLog(@"Already present");
}
else
{

   //Copy from bundle to DocumentsDirectory on first run. Where DB won't be available in DocumentsDirectory.
      NSString*bundlePath=[[NSBundle mainBundle] pathForResource:@"yourDB" ofType:@"sqlite"];
NSError*error;
success=[fm copyItemAtPath:bundlePath toPath:databasePath error:&error];

 if(success)
 {
     NSLog(@"Created successfully");
 }

} // End of else when DB not present in documents directory.

完成此操作后,您将在包中手动添加到文档目录中的空白数据库,并且所有更改都将在其上执行(而不是在包上)。在此之后,您可以继续执行其余的sqlite3数据库操作功能。

编辑:访问数据库的方法

这是我用来从数据库中检索值的方法,试试这个。

if(sqlite3_open([dbpath UTF8String], &database)==SQLITE_OK) //Check if it opens properly
{
    NSString*queryStmt=[NSString stringWithFormat:@"select * from sometable"];
    const char*querystmt=[queryStmt UTF8String];
    sqlite3_stmt *statement;

  if(sqlite3_prepare(database, querystmt, -1, &statement, NULL)==SQLITE_OK) // Check if prepare statment has no issues
    {
        while(sqlite3_step(statement)==SQLITE_ROW) // Consists of row.
        {
            NSString*thestring=[[NSString alloc] initWithUTF8String:(const char*)sqlite3_column_text(statement, 0)];// 0 will be first column
            NSLog(@"%@",thestring);
        }

        sqlite3_finalize(statement); //finalize statement
    }

    sqlite3_close(database); //Close database
}
于 2012-07-02T04:07:52.617 回答
0

问题可能是您的数据库扩展,创建一个名为Login.sqlite而不是Login.sqliPhone sqlite3 框架只识别.sqlite数据库的数据库。

然后,您编码的内容将起作用。

于 2012-07-03T04:07:52.623 回答