3

我创建了一个包含多个数据库的字典应用程序,除了将列保存在书签中之外,一切正常!,我知道,不可能更改 NSBundle 中的文件,但我不知道如何修复它。如果您能帮助我,我将不胜感激这里是代码:

- (NSString *) getDBPath {
    NSString *path;

    if ( [[[NSUserDefaults standardUserDefaults] stringForKey:@"Bv"] intValue] == 2)
    {
        path = [[NSBundle mainBundle]pathForResource:@"pr-eng" ofType:@"sqlite"];

    } else {

        path = [[NSBundle mainBundle]pathForResource:@"eg-pr" ofType:@"sqlite"];
    }

    if ( [[[NSUserDefaults standardUserDefaults] stringForKey:@"Bv"] intValue] == 3)
    {
        path = [[NSBundle mainBundle]pathForResource:@"german" ofType:@"sqlite"];
    }

    return path;    
}

这是书签功能:

-(void) setBookMark:(NSInteger)oid {

sqlite3_stmt    *statement;

const char *dbpath = [[self getDBPath] UTF8String];

if (sqlite3_open(dbpath, &database) == SQLITE_OK)
{
    NSString *SetFavSQL = [NSString stringWithFormat: @"UPDATE DIC SET bookmark=1 WHERE id=\"%d\"", oid];
    //      NSLog(@"%@",SetFavSQL);
    const char *SetFav_stmt = [SetFavSQL UTF8String];

    sqlite3_prepare_v2(database, SetFav_stmt, -1, &statement, NULL);
    if (sqlite3_step(statement) != SQLITE_DONE)
    {

    }
    sqlite3_finalize(statement);
    sqlite3_close(database);
}
}

读取数据库:

-(void) read_Database{

NSMutableArray *DB_Array = [[NSMutableArray alloc] init];
NSMutableArray *word_Array = [[NSMutableArray alloc] init];

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

    NSString *sql =@"SELECT * FROM DIC";

    //        NSLog(@"%@",sql);

    sqlite3_stmt *compiledStatement;

    if(sqlite3_prepare_v2(database, [sql UTF8String] , -1, &compiledStatement, NULL) == SQLITE_OK) {
        while(sqlite3_step(compiledStatement) == SQLITE_ROW) {


            NSInteger oid = sqlite3_column_int(compiledStatement, 0);

            const char* f1 = (const char*)sqlite3_column_text(compiledStatement, 1);
            NSString *oName = f1 == NULL ? nil : [[NSString alloc] initWithUTF8String:f1];

            const char* f2 = (const char*)sqlite3_column_text(compiledStatement, 2);
            NSString *oMean = f2 == NULL ? nil : [[NSString alloc] initWithUTF8String:f2];


            const char* f3 = (const char*)sqlite3_column_text(compiledStatement, 3);
            NSString *oPron = f3 == NULL ? nil : [[NSString alloc] initWithUTF8String:f3];

            NSInteger bm = sqlite3_column_int(compiledStatement, 5);

            readerClass = [[Reader alloc]initWithReadDB:oid Name:oName Mean:oMean Pron:oPron bookMark:bm];

            [DB_Array addObject:readerClass];
        }
    }
    sqlite3_finalize(compiledStatement);

}
sqlite3_close(database);


AppDelegate *appDelegateClass = (AppDelegate *)[[UIApplication sharedApplication] delegate];

[appDelegateClass.wordList removeAllObjects];
appDelegateClass.wordList=[word_Array mutableCopy];


[appDelegateClass.dictionaryArray removeAllObjects];
appDelegateClass.dictionaryArray=[DB_Array mutableCopy];
}
4

3 回答 3

2

我知道,不可能更改 NSBundle 中的文件

太好了,至少你努力用谷歌搜索这个问题。那么,为什么不在应用程序第一次启动时将这些文件复制到某个可写路径,例如 NSDocumentsDirectory?

NSArray *paths = NSSearchPathsForDirectoriesInDomains(NSDocumentsDirectory, NSUserDomainMask, YES);
NSString *docsDir = [paths objectAtIndex:0];
[[NSFileManager defaultManager] copyItemAtPath:path toPath:[docsDir stringByAppendingPathComponent:@"db.sql"] error:NULL];

等等

于 2012-09-22T16:52:34.323 回答
0

我认为您只需要制作一个主数据库,并且可以在其中包含多个表。那可以解决你的问题。

于 2012-10-01T11:37:09.167 回答
0

为了进一步改进@H2CO3 的答案并获得更多说明,我发布了我的答案:)

这是我在 iPhone 或 iPad (iOS) 上将数据保存到数据库的方法。所有数据都保存在本地设备中。因此,如果应用程序被卸载,所有数据都将丢失,如果用户没有备份应用程序并从备份中恢复。

NSFileManager *fileMgr;
NSString *homeDir;

这些是我在以下函数中使用的 ivar,所有函数都在我的 .m 文件中,该文件包含我所有的数据库相关函数,如更新、插入、选择、删除。

-(void)CopyDbToDocumentsFolder
{
    NSError *err=nil;
    fileMgr = [NSFileManager defaultManager];
    NSString *dbpath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"res_in_mil.sqlite"];
    NSString *copydbpath = [self.GetDocumentDirectory stringByAppendingPathComponent:@"res_in_mil.sqlite"];
    [fileMgr removeItemAtPath:copydbpath error:&err];
    if(![fileMgr copyItemAtPath:dbpath toPath:copydbpath error:&err])
    {
        UIAlertView *tellErr = [[UIAlertView alloc] initWithTitle:title message:@"Unable to copy database." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [tellErr show];

    }
}
-(NSString *) GetDocumentDirectory
{
    fileMgr = [NSFileManager defaultManager];
    homeDir = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
    return homeDir;
}

由于名称不言自明,因此无需解释这些功能的用途。

在 appDelegate.m 中,我使用以下代码将我的数据库复制到可以编辑我的数据库的指定位置。此代码在- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中。

NSFileManager *fileMgr;
myDB *dbObj = [[myDB alloc]init];
fileMgr = [NSFileManager defaultManager];
NSString *dbPath = [[dbObj GetDocumentDirectory] stringByAppendingPathComponent:@"res_in_mil.sqlite"];
BOOL success = [fileMgr fileExistsAtPath:dbPath];
if(!success)
    [dbObj CopyDbToDocumentsFolder]; 

我将它用于一个数据库,因为我只有一个数据库。但我认为您可以扩展这些功能以复制多个数据库。

甚至您可以使用上面给出的方法代码创建一个函数来识别所需的数据库是否在 DocumentDirectory 中- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

对于插入、更新、删除、选择操作,我使用以下代码打开数据库以进行任何访问。

fileMgr = [NSFileManager defaultManager];
NSString *dbPath = [[self GetDocumentDirectory] stringByAppendingPathComponent:@"res_in_mil.sqlite"];
BOOL success = [fileMgr fileExistsAtPath:dbPath];

if(!success)
    {
        NSLog(@"Cannot locate database file '%@'",dbPath);
        [self CopyDbToDocumentsFolder];
    }

快乐编码:)

于 2012-09-25T10:37:34.837 回答