重新安装应用程序时内存不足

时间:2014-11-10 13:31:56

标签: ios objective-c sqlite out-of-memory

我很绝望。

我使用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

2 个答案:

答案 0 :(得分:0)

sqlite报告"内存不足"错误有时错误。通常,如果在应用更新后发生这种情况,那么因为您的sqlite访问代码中存在错误。如果您的数据库架构在应用程序版本之间发生了变化,但您没有确保数据库调用是向后兼容的,那么您将经常看到此错误。

如果您的CREATE TABLE语句后面没有ALTER TABLE语句,以便在CREATE失败时使您的架构加速,因为该表已经存在,那么您将面临风险进行不向后兼容的数据库调用。

答案 1 :(得分:0)

YEAH GUYS,最后我可以解决我的问题。 这是因为当我检查是否已经在我的可写路径中复制了数据库时,在TRUE条件下我忘记更新引用数据库的内部路径。出于这个原因,当我试图打开一个连接时,它正在返回错误,因为我在错误的地方寻找数据库。