6

我想在我的网络应用程序中使用预先填充的数据库,以便我的应用程序可以离线工作。我如何使用最新版本的 PhoneGap / Cordova (2.0) 做到这一点?

我知道这个问题之前已经被问过,但是所有的答案似乎都相对于当前版本的cordova和iOS来说已经过时了

https://github.com/atkinson/phonegap-prepopulate-db两年未更新 https://github.com/davibe/Phonegap-SQLitePlugin 7 个月未更新,为 1.7

我在这里找到了一个帖子: http ://www.raymondcamden.com/index.cfm/2012/7/27/Guest-Blog-Post-Shipping-a-populated-SQLite-DB-with-PhoneGap这是唯一的方法?

另外,我应该注意我使用的是 iOS 6

4

3 回答 3

2

我已经为带有 iOS6 的 Cordova 2.7 使用了以下插件,我看到它刚刚在一天前更新。https://github.com/pgsqlite/PG-SQLitePlugin-iOS

他们这里也有安卓版本。问题的一部分是PhoneGap的变化,所以经常保持插件最新可能会很耗时,所以它们会失效。这是我在这个项目中使用的 AppDelegate.m 中的 init 方法的代码http://www.binpress.com/app/conference-core-ios-for-phonegap/1483

请记住,您有时需要擦除 iOS 模拟器,以便它重新加载与应用程序相关的文件。

- (id)init{

NSHTTPCookieStorage* cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];

[cookieStorage setCookieAcceptPolicy:NSHTTPCookieAcceptPolicyAlways];

int cacheSizeMemory = 8 * 1024 * 1024; // 8MB
int cacheSizeDisk = 32 * 1024 * 1024; // 32MB

如果 __has_feature(objc_arc)

    NSURLCache* sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"];

别的

    NSURLCache* sharedCache = [[[NSURLCache alloc] initWithMemoryCapacity:cacheSizeMemory diskCapacity:cacheSizeDisk diskPath:@"nsurlcache"] autorelease];

万一

[NSURLCache setSharedURLCache:sharedCache];
databaseName = @"SomeCoolDatabase.db";

NSLog(@"databaseName: %@", databaseName);

databasePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex: 0];
NSLog(@"databasePath: %@", databasePath);

databaseFile = [databasePath stringByAppendingPathComponent:databaseName];
NSLog(@"databaseFile: %@", databaseFile);
// Execute the "checkAndCreateDatabase" function
[self checkAndCreateDatabase];

self = [super init];
return self;

}

-(无效)checkAndCreateDatabase {

// Check if the SQL database has already been saved to the users phone, if not then copy it over
BOOL success;
// Create a FileManager object, we will use this to check the status
// of the database and to copy it over if required
NSFileManager *fileManager = [NSFileManager defaultManager];
// Check if the database has already been created in the users filesystem
success = [fileManager fileExistsAtPath:databaseFile];
// If the database already exists then return without doing anything
if(success){
    NSLog(@"Database Present");
    return;
} else {
    NSLog(@"database not present");
}
// If not then proceed to copy the database from the application to the users filesystem
// Get the path to the database in the application package
NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];

// Create the database folder structure
[fileManager createDirectoryAtPath:databasePath withIntermediateDirectories:YES attributes:nil error:NULL];
// Copy the database from the package to the users filesystem
[fileManager copyItemAtPath:databasePathFromApp toPath:databaseFile error:nil];
[fileManager release];

}

希望这可以帮助...

于 2013-09-04T20:20:26.830 回答
0

谢谢!如果没有从这里开始,我将无法做到这一点!

也就是说,这对我来说不是开箱即用的,所以我更新了它,而且我对 iOS 的本机代码绝不是“好”,所以我非常愿意接受建议。

我将建议的代码添加到 AppDelegate.m 文件中,得到了一堆错误。所以,我转到 AppDelegate.h 文件:

@interface AppDelegate : NSObject <UIApplicationDelegate>{} --Looks like this to start.

让它看起来像这样:

@interface AppDelegate : NSObject <UIApplicationDelegate>{
   NSString* databaseName;
   NSString* databasePath;
   NSString* databaseFile;
}

我只需要在其中声明变量。我还删除了这一行:

[fileManager release];

因为,根据这个答案,我的项目似乎会自动发布?我希望?

现在我必须努力将 DB 文件放入正确的位置,以便 xcode 找到它。

希望这可以帮助!

于 2014-01-16T15:05:47.687 回答
0

虽然这个问题很老......认为它可能会帮助某人发布我的解决方案 - 发现于 2017 年。(由于 PhoneGap 发生了变化,旧的解决方案将不再适用或在 Android 和 Apple 应用程序市场上被接受。)我致力于此很长一段时间的问题-问题是您要导入预填充的数据库-没有很多简单的解决方案。我找到了最好和最简单的 - 目前也是唯一的 - 解决方案是 LiteHelpers CORDOVA-SQLITE-EXT ( https://github.com/litehelpers/cordova-sqlite-ext )

我已将此添加到我的应用程序中,并且运行良好。虽然我不得不放弃 PhoneGap - 并使用 CORDOVA - 但它对我有用。

于 2017-04-20T16:44:17.837 回答