gpt4 book ai didi

ios - fmdb 路径并从另一个 viewController 第二次使用 db

转载 作者:行者123 更新时间:2023-11-28 22:41:43 24 4
gpt4 key购买 nike

我正在使用下面的代码在一个类中创建数据库并在 viewController 中使用它,并在 newViewController 的另一个类中再次使用相同的代码。
这是对的吗 ?或者它是否在其位置创建新的数据库或使用现有的数据库?

或者我只需要使用路径吗?

当我在下面的例子中尝试 extern NSString *path 时,我收到了中文字母,但无法打开它。

基本上在第二个 Controller 中我只读取数据。
所以我试图通过路径访问数据库,打开路径和数据库的数据库。

如果我使用下面的代码创建它并且我想从另一个 viewcontoller 第二次打开它,该怎么做。
请帮忙。
提前致谢。

在第一个 Controller 中:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsPath = [paths objectAtIndex:0];
NSString *path = [docsPath stringByAppendingPathComponent:@"test.db"];

FMDatabase *database;
database = [FMDatabase databaseWithPath:path];
[database open];

[database executeUpdate:@"DROP TABLE IF EXISTS **"];


[database executeUpdate:@"CREATE TABLE "];



//Select query for single row
FMResultSet *s = [database executeQuery:@"SELECT COUNT(*) FROM table"];
if ([s next]) {
int Count = [s intForColumnIndex:0];


}

//DO Something

[database close];

以上代码在 viewcontroller 1 中运行完美。

我在 view controller 2 中尝试过的东西。它仍然没有工作。

extern NSString *path;



FMDatabase *database;
database = [FMDatabase databaseWithPath:path];
[database open];

我在这里遇到错误,因为路径看起来像中文。

错误是 EXC_BAD_ACCESS 代码

还尝试了全局数据库:

extern FMDatabase *database;

并将其用作

[database open];

我仍然遇到同样的错误。

最后它在第二个 Controller 中使用以下代码。
我只是想看看这是否是正确的方法,或者我可以使用一些东西作为 db open 。

但我试过了,但它不起作用。而且我没有使用任何错误处理程序,因为我不知道如何在 FMDB 中执行此操作。
提前致谢。

请告诉我以下实现是否正确? :

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsPath = [paths objectAtIndex:0];
NSString *newpath = [docsPath stringByAppendingPathComponent:@"test.db"];


FMDatabase *database2 ;
database2 = [FMDatabase databaseWithPath:newpath];

[database2 open];

//DO Something

[database2 close];

最佳答案

作为您应该如何检查 FMDB 方法是否成功的示例,下面是一个示例:

#import "FMDatabase.h"
#import "FMDatabaseAdditions.h"

- (void)performDatabaseDemonstration
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsPath = [paths objectAtIndex:0];
NSString *path = [docsPath stringByAppendingPathComponent:@"test.db"];

// open db

FMDatabase *database = [FMDatabase databaseWithPath:path];
FMResultSet *rs;

if ([database open])
{
// drop table

if (![database executeUpdate:@"DROP TABLE IF EXISTS test"])
NSLog(@"%s: drop error: %@", __FUNCTION__, [database lastErrorMessage]);

// create table

if (![database executeUpdate:@"CREATE TABLE test(col1 INTEGER, col2 TEXT)"])
NSLog(@"%s: create error: %@", __FUNCTION__, [database lastErrorMessage]);

// insert a row of data

if (![database executeUpdate:@"INSERT INTO test VALUES(1, 'Rob')"])
NSLog(@"%s: insert 1 error: %@", __FUNCTION__, [database lastErrorMessage]);

// insert another row of data

if (![database executeUpdate:@"INSERT INTO test VALUES(2, 'Rachel')"])
NSLog(@"%s: insert 2 error: %@", __FUNCTION__, [database lastErrorMessage]);

// Select query for single row

if (!(rs = [database executeQuery:@"SELECT count(*) FROM test"]))
NSLog(@"%s: select error: %@", __FUNCTION__, [database lastErrorMessage]);

if ([rs next]) {
int count = [rs intForColumnIndex:0];

NSLog(@"%s: count = %d", __FUNCTION__, count);
}

[rs close];

// if getting single value from single row, you can use FMDatabaseAdditions.h methods:

NSInteger count2 = [database intForQuery:@"SELECT col1, col2 FROM test"];
NSLog(@"%s: count2 = %d", __FUNCTION__, count2);

// let's actually retrieve data

if (!(rs = [database executeQuery:@"SELECT col1, col2 FROM test"]))
NSLog(@"%s: select error: %@", __FUNCTION__, [database lastErrorMessage]);

while ([rs next]) {
NSLog(@"%s: col1 = %@; col2 = %@", __FUNCTION__, [rs objectForColumnIndex:0], [rs objectForColumnIndex:1]);
}

[rs close];

//close

[database close];
}
else
{
NSLog(@"%s: open error: %@", __FUNCTION__, [database lastErrorMessage]);
}
}

关于如何从不同的 Controller 打开数据库,有很多选择。但我可能会建议,除了从两个 Controller 中检索一些共享路径/文件名变量之外,您可能还想将文件名和共享 FMDB 代码也封装在一个对象中。

就个人而言,每当我发现自己在两个不同的 Controller 中编写相同或相似的代码时,我都会问自己是否要将该代码抽象到它自己的类中。在这种情况下,例如,与其争论这两个类如何访问数据库文件名,不如创建我自己的模型对象(NSObject 子类),封装您的 SQL,打开数据库等。然后我可以让我的两个 View Controller 从该方法对象调用方法,并且真正地不仅最小化文件名中的冗余,而且也最小化代码本身中的冗余。比如创建数据库路径,打开数据库,检查打开是否成功等等,都是一样的。那么,为什么不在某个模型对象中使用一种方法,它会为您完成所有这些工作。

要使两个 Controller 都可以访问此模型对象,您有多种选择:

  • 将其设为第一个 View Controller 的属性,并在 prepareForSegue 期间将其传递给第二个 Controller ;

  • 为它创建一个单例对象;或者

  • 将其设为您的应用委托(delegate)的属性,您的两个 Controller 都可以从那里获取它。

关于ios - fmdb 路径并从另一个 viewController 第二次使用 db,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14347599/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com