我很绝望。
我使用sqlite创建一个应用程序,它正常工作,直到我向Apple商店提交更新。 当我的应用程序重新安装并且我尝试打开数据库连接时,我遇到了“内存不足”问题。
我已经尝试了很多东西来解决这个问题,但直到今天我还是无法解决这个问题。
我使用下面的代码打开db的连接:
-(Boolean)openConectionSQLiteDb
{
if (sqlite3_open([[GeneralFunction getInfoFromUserDefault:@"dbpath"] UTF8String], &db) != SQLITE_OK)
{
NSLog(@"Failed to open database!");
NSLog(@"%s",sqlite3_errmsg(statement));
//[GeneralFunction setDb:[[DbInteraction alloc] init:[GeneralFunction getDbName]]];
{
NSLog(@"Failed to open database! >>%@",[GeneralFunction getInfoFromUserDefault:@"dbpath"]);
// NSLog(@"222%s",sqlite3_errmsg(statement));
}
sqlite3_finalize(statement);
return false;
}
else
{
sqlite3_exec(db, "PRAGMA foreign_keys = on", NULL, NULL, NULL);
return true;
}
return false;
}
以下代码用于在数据库中插入日期:
-(Boolean)insertOrReplace:(NSDictionary *)elementoToInsert inTable:(NSString *)tableName
{
if([self openConectionSQLiteDb])
{
NSString * insert = [self createInsertStringWith:elementoToInsert in:tableName];
insert = [insert stringByReplacingOccurrencesOfString:@"INSERT" withString:@"INSERT OR REPLACE "];
const char *insert_stmt = [insert UTF8String];
sqlite3_prepare_v2(db, insert_stmt,
-1, &statement, NULL);
if (sqlite3_step(statement) == SQLITE_DONE)
{
sqlite3_finalize(statement);
sqlite3_close(db);
// NSLog(@"FECHOU");
return true;
}
NSLog(@"INSERT ERROR %s",sqlite3_errmsg(db));
sqlite3_finalize(statement);
}
sqlite3_close(db);
NSLog(@"FECHOU");
return false;
}
我还使用此代码在必要时将Db文件复制到可写路径:
-(id)init:(NSString *) dbName
{
self = [super init];
nomeDb = dbName;
BOOL success;
NSFileManager *filemngr = [[NSFileManager alloc] init];
NSError *error;
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [paths objectAtIndex:0];
NSString *writableDbPath = [documentDirectory stringByAppendingPathComponent:nomeDb];
// NSLog(@"%@",[GeneralFunction getInfoFromUserDefault:@"dbpath"]);
NSString * lastPath =[GeneralFunction getInfoFromUserDefault:@"dbpath"];
success = [filemngr fileExistsAtPath:lastPath];
if(!success)
{
NSLog(@"Arquivo não existe nesse Directorio >%@",lastPath);
success = [filemngr fileExistsAtPath:writableDbPath];
if(!success)
{
NSLog(@"Arquivo não existe nesse Directorio >%@",writableDbPath);
NSString *defaultDbPath = [[[NSBundle mainBundle] resourcePath]stringByAppendingPathComponent:nomeDb];
success = [filemngr copyItemAtPath:defaultDbPath toPath:writableDbPath error:&error];
NSLog(@"Copiou Para :%@",writableDbPath);
if (!success)
{
NSLog(@"Arquivo não existe nesse Directorio pela seguanda vez >%@",writableDbPath);
//[status setText:[error localizedDescription]];
/* UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error!"
message:[error localizedDescription]
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[alert show];*/
}
else
{
NSLog(@"Achou 2");
NSMutableDictionary * dic = [[NSMutableDictionary alloc] init];
// NSLog(@"%@",writableDbPath);
[dic setObject:writableDbPath forKey:@"dbpath"];
[GeneralFunction saveTeacherInfo:dic];
writablePath = writableDbPath;
}
}
else
{
NSLog(@"Banco esta em %@",writableDbPath);
}
}
else{
NSLog(@"Achou");
}
// [bd executeUpdate:@"PRAGMA foreign_keys=ON"];
return self;
}
因此,当我第一次安装应用程序时,它工作正常。但是,如果我再次运行应用程序(当我提交更新时也会发生这种情况)我收到了LOG错误“无法打开数据库内存不足”。
有人请帮助我,我几乎被解雇了。
PS:对不起我糟糕的英语,我很抱歉。 ; d答案 0 :(得分:0)
sqlite报告"内存不足"错误有时错误。通常,如果在应用更新后发生这种情况,那么因为您的sqlite访问代码中存在错误。如果您的数据库架构在应用程序版本之间发生了变化,但您没有确保数据库调用是向后兼容的,那么您将经常看到此错误。
如果您的CREATE TABLE
语句后面没有ALTER TABLE
语句,以便在CREATE
失败时使您的架构加速,因为该表已经存在,那么您将面临风险进行不向后兼容的数据库调用。
答案 1 :(得分:0)
YEAH GUYS,最后我可以解决我的问题。 这是因为当我检查是否已经在我的可写路径中复制了数据库时,在TRUE条件下我忘记更新引用数据库的内部路径。出于这个原因,当我试图打开一个连接时,它正在返回错误,因为我在错误的地方寻找数据库。