0

アプリケーションが毎秒サスペンド/バックグラウンドモードになっているときにローカルsqliteデータを読み取り/更新する方法は? 以下は、私が今やろうとしているコードです。毎秒ローカル Sqlite テーブルに存在するすべての ID を NsLog したいだけですが、それを行うことはできません。私が間違っていることを教えてもらえますか、または次のコードを修正できますか。 前もって感謝します

-(void)applicationDidEnterBackground:(UIApplication *)app
{
    if ([[UIDevice currentDevice] respondsToSelector:@selector(isMultitaskingSupported)]) { //Check if our iOS version supports multitasking I.E iOS 4
        if ([[UIDevice currentDevice] isMultitaskingSupported]) { //Check if device supports mulitasking
            UIApplication *application = [UIApplication sharedApplication]; //Get the shared application instance

            __block UIBackgroundTaskIdentifier background_task; //Create a task object

            background_task = [application beginBackgroundTaskWithExpirationHandler: ^ {
                [application endBackgroundTask: background_task]; //Tell the system that we are done with the tasks
                background_task = UIBackgroundTaskInvalid; //Set the task to be invalid

                //System will be shutting down the app at any point in time now
            }];

            //Background tasks require you to use asyncrous tasks

            dispatch_queue_t backgroundQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
            dispatch_source_t timerSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_TIMER, 0, 0, backgroundQueue);
            dispatch_source_set_timer(timerSource, dispatch_time(DISPATCH_TIME_NOW, 0), 1*NSEC_PER_SEC, 0*NSEC_PER_SEC);
            dispatch_source_set_event_handler(timerSource, ^{
                [self BackGroundTaskFunction];
            });
            dispatch_resume(timerSource);
        }
    }
}
-(void)BackGroundTaskFunction
{
   [self GetUserName]
    if (recordArray.count>0) 
    {
        for (int i=0; i<recordArray.count; i++) 
        {
            DB_data *db=(DB_data *)[recordArray objectAtIndex:i];
            Nslog(@"%d",db.Id);          
        }
    }
}
-(void)GetUserName{
    self.recordArray = [[NSMutableArray alloc] init];
    {
        const char *sql = "select * from UserName";
        sqlite3_stmt *selectStatement;

        int returnValue = sqlite3_prepare_v2(database, sql, -1, &selectStatement, NULL);
        if(returnValue == SQLITE_OK)
        {
            while(sqlite3_step(selectStatement) == SQLITE_ROW)
            {
                [recordArray addObject:[[DB_data alloc] initwithDataSet:sqlite3_column_int(selectStatement, 0) UserName:[NSString stringWithUTF8String:(char *)sqlite3_column_text(selectStatement, 1)]]];
            }
        }
        else
        {
            printf( "could not prepare statemnt: %s\n", sqlite3_errmsg(database) );
        }

    }

}
4

2 に答える 2

0

アプリケーションをバックグラウンドで実行し続けるのに役立つ NSRUNLOOP を使用して問題を解決しました

于 2012-07-19T08:22:39.110 に答える
0

いいえ、それはできません。オーディオを再生するアプリ、ユーザーの位置を追跡するアプリ、または voip クライアントのみがバックグラウンドで実行できます。

これらのタイプのアプリのいずれにも当てはまらない場合は、バックグラウンドで実行できません。

投稿したコードを使用すると、長いプロセスを最大 10 分間実行できます。

于 2012-07-11T07:59:02.383 に答える