Я нахожусь в процессе (наконец) загрузки моего Приложения на устройство iPhone для тестирования. До сих пор я только протестировал Приложение в средстве моделирования. Приложение является информационно-центрическим и использует базу данных SQLite. Я создал соответствующую базу данных SQLite с демонстрационными данными, которые я использовал в средстве моделирования. Как я могу скопировать этот .sqlite3 файл в фактический iPhone?
Это было легко со средством моделирования, поскольку я мог просто скопировать .sqlite3 файл в ~/Library/Application Поддержка/iPhone Simulator/User/Applications/{UUID} / папка Documents, но я не могу выяснить, как получить это в то же местоположение на фактическом устройстве iPhone. Воссоздание базы данных с нуля по телефону не является действительно опцией, поскольку я уже сделал все твердые дворы, создающие базу данных по Mac.
Почему бы не добавить его в свой пакет приложений? Щелкните правой кнопкой мыши на папке Ресурсы
в окне проекта в XCode, затем выберите Добавить
> В существующих файлах ...
, чтобы добавить вашу базу данных SQLite.
Вы затем загрузите файл из пакета приложения:
NSString *databasePath = [[NSBundle mainBundle] pathForResource:@"mySQLiteDatabaseFile" ofType:@"sqlite3"];
NSData *databaseData = [NSData dataWithContentsOfFile:databasePath];
// ...
как я это сделал, создал класс под названием DBM Management. а в m-файле реализуем эти методы.также помещаем эту строку в реализационный файл выше @строки реализации
static sqlite3 *CHManagement = nil;
-(NSString *) getDBPath
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *MyDatabasePath = [documentsDirectory stringByAppendingString:@"/CHManagement.sqlite"];
return MyDatabasePath;
}
-(void) checkDataBase
{
NSLog(@"CheckDatabase Called");
NSFileManager *fileManager=[NSFileManager defaultManager];
NSError *error=[[[NSError alloc]init] autorelease];
NSString *dbPath = [self getDBPath];
BOOL success=[fileManager fileExistsAtPath:dbPath];
if(!success)
{
NSString *defaultDBPath=nil;
defaultDBPath=[[[NSBundle mainBundle]resourcePath]stringByAppendingPathComponent:@"CHManagement.sqlite"];
success=[fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];
if(!success)
{
NSAssert1(0,@"failed to create database with message '%@'.",[error localizedDescription]);
}
}
else
{
sqlite3 *MyDatabase;
NSInteger VersionNumber=0;
sqlite3_stmt *CompiledStatement=nil;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *MyDatabasePath = [documentsDirectory stringByAppendingString:@"/CHManagement.sqlite"];
if(sqlite3_open([MyDatabasePath UTF8String],&MyDatabase) == SQLITE_OK)
{
sqlite3_prepare_v2(MyDatabase, "select appVersionNo from VersionInfo", -1, &CompiledStatement, NULL);
while(sqlite3_step(CompiledStatement) == SQLITE_ROW)
{
VersionNumber=sqlite3_column_int(CompiledStatement,0);
}
sqlite3_reset(CompiledStatement);
sqlite3_finalize(CompiledStatement);
sqlite3_close(MyDatabase);
}
if (VersionNumber!=1)
{
[self deleteDatabase];
NSString *defaultDBPath=[[[NSBundle mainBundle]resourcePath]stringByAppendingPathComponent:@"CHManagement.sqlite"];
success=[fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];
if(!success)
{
NSAssert1(0,@"failed to create database with message '%@'.",[error localizedDescription]);
}
}
}
}
- (void)deleteDatabase
{
NSLog(@"Delete Database Called");
NSError **error=nil;
NSFileManager *FileManager = [NSFileManager defaultManager];
NSString *databasepath = [self getDBPath];
BOOL success = [FileManager fileExistsAtPath:databasepath];
if(success) {
[FileManager removeItemAtPath:databasepath error:error];
}
}
с помощью этих методов можно легко загрузить базу данных в папку документов iphone приложения. Извините за форматирование. и appVersionNo - это поле в tableCalled versionInfo, значение по умолчанию 1
.Как сказал Алекс, вы должны добавить файл базы данных в качестве ресурса в ваш проект. Это даст указание Xcode связать файл вашей базы данных в .app. Однако, этот файл доступен только для чтения, вы должны скопировать его в папку документов вашего приложения (на устройстве или симуляторе, то же самое), где он станет доступен для записи.
Ниже приведен код, который я использую для такого рода вещей. Самое приятное в этом коде то, что он автоматически обновляет копию, доступную для записи, в папке документов ваших приложений всякий раз, когда вы изменяете "основную" копию, находящуюся в .app. Используйте 'pathLocal', чтобы открыть вашу (доступную для записи) базу данных....
Функция, приведенная ниже, возвращает YES, когда операция прошла успешно (была ли нужна копия или нет). Вы вольны изменять это с тем, что вам подходит :)
NSString *pathLocal, *pathBundle;
// Automatically copy DB from .app bundle to device document folder if needed
- (BOOL)automaticallyCopyDatabase {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
pathLocal = [documentsDir stringByAppendingPathComponent:@"mydb.sqlite"];
pathBundle = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"mydb.sqlite"];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSDictionary *localAttr = [fileManager fileAttributesAtPath:pathLocal traverseLink:YES];
BOOL needsCopy = NO;
if (localAttr == nil) {
needsCopy = YES;
} else {
NSDate *localDate;
NSDate *appDBDate;
if (localDate = [localAttr objectForKey:NSFileModificationDate]) {
NSDictionary *appDBAttr = [fileManager fileAttributesAtPath:pathBundle traverseLink:YES];
appDBDate = [appDBAttr objectForKey:NSFileModificationDate];
needsCopy = [appDBDate compare:localDate] == NSOrderedDescending;
} else {
needsCopy = YES;
}
}
if (needsCopy) {
NSError *error;
BOOL success;
if (localAttr != nil) {
success = [fileManager removeItemAtPath:pathLocal error:&error];
}
success = [fileManager copyItemAtPath:pathBundle toPath:pathLocal error:&error];
return success;
}
return YES;
}